From b36b2284176de05af2b67fb63f0c55d81513df85 Mon Sep 17 00:00:00 2001 From: arthmis Date: Fri, 3 Jan 2025 13:20:21 -0500 Subject: [PATCH 01/66] Feature Request: Change varbinary to varchar in schemas used in examples folder (#17318) Signed-off-by: arthmis --- examples/backups/create_commerce_schema.sql | 4 +- examples/backups/create_customer_schema.sql | 4 +- examples/compose/default_vschema.json | 6 +- examples/compose/lookup_keyspace_vschema.json | 8 +-- examples/compose/test_keyspace_vschema.json | 8 +-- examples/compose/vtcompose/base_vschema.json | 9 ++- examples/demo/schema/customer/vschema.json | 70 +++++++++++-------- examples/local/create_commerce_schema.sql | 8 +-- examples/local/vschema.json | 8 +-- examples/local/vschema_customer_sharded.json | 10 +-- examples/operator/create_commerce_schema.sql | 8 +-- .../operator/vschema_customer_sharded.json | 10 +-- .../region_sharding/create_main_schema.sql | 6 +- 13 files changed, 86 insertions(+), 73 deletions(-) diff --git a/examples/backups/create_commerce_schema.sql b/examples/backups/create_commerce_schema.sql index f24689a068f..dfb785200c8 100644 --- a/examples/backups/create_commerce_schema.sql +++ b/examples/backups/create_commerce_schema.sql @@ -1,6 +1,6 @@ create table if not exists product( - sku varbinary(128), - description varbinary(128), + sku varchar(128), + description varchar(128), price bigint, primary key(sku) ) ENGINE=InnoDB; diff --git a/examples/backups/create_customer_schema.sql b/examples/backups/create_customer_schema.sql index 166a56e4c02..f04e6186d8f 100644 --- a/examples/backups/create_customer_schema.sql +++ b/examples/backups/create_customer_schema.sql @@ -1,13 +1,13 @@ create table if not exists customer( customer_id bigint not null, - email varbinary(128), + email varchar(128), primary key(customer_id) ) ENGINE=InnoDB; create table if not exists corder( order_id bigint not null, customer_id bigint, - sku varbinary(128), + sku varchar(128), price bigint, primary key(order_id) ) ENGINE=InnoDB; diff --git a/examples/compose/default_vschema.json b/examples/compose/default_vschema.json index e0b50a66037..0ce3aa0868c 100644 --- a/examples/compose/default_vschema.json +++ b/examples/compose/default_vschema.json @@ -1,8 +1,8 @@ { "sharded": false, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } } -} +} \ No newline at end of file diff --git a/examples/compose/lookup_keyspace_vschema.json b/examples/compose/lookup_keyspace_vschema.json index f67289821fe..cf0087adc51 100644 --- a/examples/compose/lookup_keyspace_vschema.json +++ b/examples/compose/lookup_keyspace_vschema.json @@ -5,7 +5,7 @@ "column_vindexes": [ { "column": "id", - "name": "hash" + "name": "xxhash" } ] }, @@ -13,14 +13,14 @@ "column_vindexes": [ { "column": "id", - "name": "hash" + "name": "xxhash" } ] } }, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } } } \ No newline at end of file diff --git a/examples/compose/test_keyspace_vschema.json b/examples/compose/test_keyspace_vschema.json index 55d0df96204..d79a31e854c 100644 --- a/examples/compose/test_keyspace_vschema.json +++ b/examples/compose/test_keyspace_vschema.json @@ -5,7 +5,7 @@ "column_vindexes": [ { "column": "page", - "name": "hash" + "name": "xxhash" }, { "column": "message", @@ -17,7 +17,7 @@ "column_vindexes": [ { "column": "page", - "name": "hash" + "name": "xxhash" }, { "column": "token", @@ -27,8 +27,8 @@ } }, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" }, "messages_message_lookup": { "type": "lookup_hash", diff --git a/examples/compose/vtcompose/base_vschema.json b/examples/compose/vtcompose/base_vschema.json index b867400e5ee..a24905a9411 100644 --- a/examples/compose/vtcompose/base_vschema.json +++ b/examples/compose/vtcompose/base_vschema.json @@ -1,10 +1,9 @@ { "sharded": true, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } }, - "tables": { - } -} + "tables": {} +} \ No newline at end of file diff --git a/examples/demo/schema/customer/vschema.json b/examples/demo/schema/customer/vschema.json index 9c361475227..4a8a4941612 100644 --- a/examples/demo/schema/customer/vschema.json +++ b/examples/demo/schema/customer/vschema.json @@ -1,8 +1,8 @@ { "sharded": true, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" }, "corder_keyspace_idx": { "type": "consistent_lookup_unique", @@ -31,49 +31,63 @@ }, "tables": { "customer": { - "column_vindexes": [{ - "column": "customer_id", - "name": "hash" - }], + "column_vindexes": [ + { + "column": "customer_id", + "name": "xxhash" + } + ], "auto_increment": { "column": "customer_id", "sequence": "product.customer_seq" } }, "corder": { - "column_vindexes": [{ - "column": "customer_id", - "name": "hash" - }, { - "column": "corder_id", - "name": "corder_keyspace_idx" - }, { - "columns": ["oname", "corder_id"], - "name": "oname_keyspace_idx" - }], + "column_vindexes": [ + { + "column": "customer_id", + "name": "xxhash" + }, + { + "column": "corder_id", + "name": "corder_keyspace_idx" + }, + { + "columns": [ + "oname", + "corder_id" + ], + "name": "oname_keyspace_idx" + } + ], "auto_increment": { "column": "corder_id", "sequence": "product.corder_seq" } }, "corder_event": { - "column_vindexes": [{ - "column": "corder_id", - "name": "corder_keyspace_idx" - }, { - "column": "keyspace_id", - "name": "binary" - }], + "column_vindexes": [ + { + "column": "corder_id", + "name": "corder_keyspace_idx" + }, + { + "column": "keyspace_id", + "name": "binary" + } + ], "auto_increment": { "column": "corder_event_id", "sequence": "product.corder_event_seq" } }, "oname_keyspace_idx": { - "column_vindexes": [{ - "column": "oname", - "name": "unicode_loose_md5" - }] + "column_vindexes": [ + { + "column": "oname", + "name": "unicode_loose_md5" + } + ] } } -} +} \ No newline at end of file diff --git a/examples/local/create_commerce_schema.sql b/examples/local/create_commerce_schema.sql index d8768d88f82..d936d4e82ba 100644 --- a/examples/local/create_commerce_schema.sql +++ b/examples/local/create_commerce_schema.sql @@ -1,18 +1,18 @@ create table if not exists product( - sku varbinary(128), - description varbinary(128), + sku varchar(128), + description varchar(128), price bigint, primary key(sku) ) ENGINE=InnoDB; create table if not exists customer( customer_id bigint not null auto_increment, - email varbinary(128), + email varchar(128), primary key(customer_id) ) ENGINE=InnoDB; create table if not exists corder( order_id bigint not null auto_increment, customer_id bigint, - sku varbinary(128), + sku varchar(128), price bigint, primary key(order_id) ) ENGINE=InnoDB; diff --git a/examples/local/vschema.json b/examples/local/vschema.json index 17e5dedf0c8..4b922a0f72e 100644 --- a/examples/local/vschema.json +++ b/examples/local/vschema.json @@ -1,8 +1,8 @@ { "sharded": true, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } }, "tables": { @@ -10,9 +10,9 @@ "column_vindexes": [ { "column": "page", - "name": "hash" + "name": "xxhash" } ] } } -} +} \ No newline at end of file diff --git a/examples/local/vschema_customer_sharded.json b/examples/local/vschema_customer_sharded.json index 3109e2a2f3c..d1c147e1892 100644 --- a/examples/local/vschema_customer_sharded.json +++ b/examples/local/vschema_customer_sharded.json @@ -1,8 +1,8 @@ { "sharded": true, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } }, "tables": { @@ -10,7 +10,7 @@ "column_vindexes": [ { "column": "customer_id", - "name": "hash" + "name": "xxhash" } ], "auto_increment": { @@ -22,7 +22,7 @@ "column_vindexes": [ { "column": "customer_id", - "name": "hash" + "name": "xxhash" } ], "auto_increment": { @@ -31,4 +31,4 @@ } } } -} +} \ No newline at end of file diff --git a/examples/operator/create_commerce_schema.sql b/examples/operator/create_commerce_schema.sql index d8768d88f82..d936d4e82ba 100644 --- a/examples/operator/create_commerce_schema.sql +++ b/examples/operator/create_commerce_schema.sql @@ -1,18 +1,18 @@ create table if not exists product( - sku varbinary(128), - description varbinary(128), + sku varchar(128), + description varchar(128), price bigint, primary key(sku) ) ENGINE=InnoDB; create table if not exists customer( customer_id bigint not null auto_increment, - email varbinary(128), + email varchar(128), primary key(customer_id) ) ENGINE=InnoDB; create table if not exists corder( order_id bigint not null auto_increment, customer_id bigint, - sku varbinary(128), + sku varchar(128), price bigint, primary key(order_id) ) ENGINE=InnoDB; diff --git a/examples/operator/vschema_customer_sharded.json b/examples/operator/vschema_customer_sharded.json index 3109e2a2f3c..d1c147e1892 100644 --- a/examples/operator/vschema_customer_sharded.json +++ b/examples/operator/vschema_customer_sharded.json @@ -1,8 +1,8 @@ { "sharded": true, "vindexes": { - "hash": { - "type": "hash" + "xxhash": { + "type": "xxhash" } }, "tables": { @@ -10,7 +10,7 @@ "column_vindexes": [ { "column": "customer_id", - "name": "hash" + "name": "xxhash" } ], "auto_increment": { @@ -22,7 +22,7 @@ "column_vindexes": [ { "column": "customer_id", - "name": "hash" + "name": "xxhash" } ], "auto_increment": { @@ -31,4 +31,4 @@ } } } -} +} \ No newline at end of file diff --git a/examples/region_sharding/create_main_schema.sql b/examples/region_sharding/create_main_schema.sql index 9ee4f8d9450..ba91d74f45c 100644 --- a/examples/region_sharding/create_main_schema.sql +++ b/examples/region_sharding/create_main_schema.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS customer ( id int NOT NULL, - fullname varbinary(256), - nationalid varbinary(256), - country varbinary(256), + fullname varchar(256), + nationalid varchar(256), + country varchar(256), primary key(id) ); From b1f61476015085aab2d7c3b287c3301b22a8935b Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:00:04 +0530 Subject: [PATCH 02/66] Make all durability policy names constants (#17448) Signed-off-by: Manan Gupta --- go/cmd/vtctldclient/command/keyspaces.go | 7 +- go/test/endtoend/keyspace/keyspace_test.go | 7 +- .../reparent/emergencyreparent/ers_test.go | 27 +++---- .../reparent/newfeaturetest/reparent_test.go | 13 ++-- .../reparent/plannedreparent/reparent_test.go | 25 ++++--- .../reparent/semisync/semi_sync_test.go | 3 +- go/test/endtoend/reparent/utils/utils.go | 3 +- .../transaction/benchmark/bench_test.go | 3 +- .../transaction/twopc/fuzz/main_test.go | 5 +- .../endtoend/transaction/twopc/main_test.go | 3 +- .../transaction/twopc/metric/main_test.go | 3 +- .../transaction/twopc/stress/main_test.go | 5 +- go/test/endtoend/transaction/tx_test.go | 3 +- .../primaryfailure/primary_failure_test.go | 9 ++- go/test/endtoend/vtorc/utils/utils.go | 3 +- go/vt/vtctl/grpcvtctldserver/server.go | 25 ++++--- go/vt/vtctl/grpcvtctldserver/server_test.go | 9 ++- go/vt/vtctl/reparentutil/durability_funcs.go | 17 +++-- .../reparentutil/durability_funcs_test.go | 61 ++++++++-------- .../reparentutil/emergency_reparenter.go | 13 ++-- .../reparentutil/emergency_reparenter_test.go | 73 ++++++++++--------- .../vtctl/reparentutil/planned_reparenter.go | 15 ++-- .../planned_reparenter_flaky_test.go | 32 ++++---- .../reparentutil/{ => policy}/durability.go | 29 ++++++-- .../{ => policy}/durability_test.go | 12 +-- go/vt/vtctl/reparentutil/reparent_sorter.go | 11 +-- .../reparentutil/reparent_sorter_test.go | 3 +- go/vt/vtctl/reparentutil/replication.go | 7 +- go/vt/vtctl/reparentutil/replication_test.go | 33 +++++---- go/vt/vtctl/reparentutil/util.go | 5 +- go/vt/vtctl/reparentutil/util_test.go | 5 +- go/vt/vtctl/vtctl.go | 5 +- go/vt/vtctld/api_test.go | 3 +- go/vt/vtorc/inst/analysis_dao.go | 14 ++-- go/vt/vtorc/inst/analysis_dao_test.go | 69 +++++++++--------- go/vt/vtorc/inst/keyspace_dao.go | 6 +- go/vt/vtorc/inst/keyspace_dao_test.go | 10 +-- .../logic/keyspace_shard_discovery_test.go | 15 ++-- go/vt/vtorc/logic/topology_recovery.go | 7 +- go/vt/vttablet/tabletmanager/rpc_backup.go | 6 +- go/vt/vttablet/tabletmanager/tm_init.go | 6 +- go/vt/wrangler/reparent.go | 5 +- go/vt/wrangler/tablet.go | 5 +- .../testlib/emergency_reparent_shard_test.go | 5 +- .../testlib/planned_reparent_shard_test.go | 9 ++- go/vt/wrangler/testlib/reparent_utils_test.go | 5 +- 46 files changed, 348 insertions(+), 291 deletions(-) rename go/vt/vtctl/reparentutil/{ => policy}/durability.go (84%) rename go/vt/vtctl/reparentutil/{ => policy}/durability_test.go (97%) diff --git a/go/cmd/vtctldclient/command/keyspaces.go b/go/cmd/vtctldclient/command/keyspaces.go index 565e0c8aa82..4d1156291cf 100644 --- a/go/cmd/vtctldclient/command/keyspaces.go +++ b/go/cmd/vtctldclient/command/keyspaces.go @@ -26,6 +26,7 @@ import ( "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/protoutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/constants/sidecar" @@ -153,7 +154,7 @@ func commandCreateKeyspace(cmd *cobra.Command, args []string) error { var snapshotTime *vttime.Time if topodatapb.KeyspaceType(createKeyspaceOptions.KeyspaceType) == topodatapb.KeyspaceType_SNAPSHOT { - if createKeyspaceOptions.DurabilityPolicy != "none" { + if createKeyspaceOptions.DurabilityPolicy != policy.DurabilityNone { return errors.New("--durability-policy cannot be specified while creating a snapshot keyspace") } @@ -409,7 +410,7 @@ func init() { CreateKeyspace.Flags().Var(&createKeyspaceOptions.KeyspaceType, "type", "The type of the keyspace.") CreateKeyspace.Flags().StringVar(&createKeyspaceOptions.BaseKeyspace, "base-keyspace", "", "The base keyspace for a snapshot keyspace.") CreateKeyspace.Flags().StringVar(&createKeyspaceOptions.SnapshotTimestamp, "snapshot-timestamp", "", "The snapshot time for a snapshot keyspace, as a timestamp in RFC3339 format.") - CreateKeyspace.Flags().StringVar(&createKeyspaceOptions.DurabilityPolicy, "durability-policy", "none", "Type of durability to enforce for this keyspace. Default is none. Possible values include 'semi_sync' and others as dictated by registered plugins.") + CreateKeyspace.Flags().StringVar(&createKeyspaceOptions.DurabilityPolicy, "durability-policy", policy.DurabilityNone, "Type of durability to enforce for this keyspace. Default is none. Possible values include 'semi_sync' and others as dictated by registered plugins.") CreateKeyspace.Flags().StringVar(&createKeyspaceOptions.SidecarDBName, "sidecar-db-name", sidecar.DefaultName, "(Experimental) Name of the Vitess sidecar database that tablets in this keyspace will use for internal metadata.") Root.AddCommand(CreateKeyspace) @@ -425,7 +426,7 @@ func init() { RemoveKeyspaceCell.Flags().BoolVarP(&removeKeyspaceCellOptions.Recursive, "recursive", "r", false, "Also delete all tablets in that cell beloning to the specified keyspace.") Root.AddCommand(RemoveKeyspaceCell) - SetKeyspaceDurabilityPolicy.Flags().StringVar(&setKeyspaceDurabilityPolicyOptions.DurabilityPolicy, "durability-policy", "none", "Type of durability to enforce for this keyspace. Default is none. Other values include 'semi_sync' and others as dictated by registered plugins.") + SetKeyspaceDurabilityPolicy.Flags().StringVar(&setKeyspaceDurabilityPolicyOptions.DurabilityPolicy, "durability-policy", policy.DurabilityNone, "Type of durability to enforce for this keyspace. Default is none. Other values include 'semi_sync' and others as dictated by registered plugins.") Root.AddCommand(SetKeyspaceDurabilityPolicy) ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") diff --git a/go/test/endtoend/keyspace/keyspace_test.go b/go/test/endtoend/keyspace/keyspace_test.go index 33bf9121bc7..e8a11ceed07 100644 --- a/go/test/endtoend/keyspace/keyspace_test.go +++ b/go/test/endtoend/keyspace/keyspace_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/json2" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -142,18 +143,18 @@ func TestDurabilityPolicyField(t *testing.T) { out, err := vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", "ks_durability", "--durability-policy=semi_sync") require.NoError(t, err, out) - checkDurabilityPolicy(t, "semi_sync") + checkDurabilityPolicy(t, policy.DurabilitySemiSync) out, err = vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", "ks_durability", "--durability-policy=none") require.NoError(t, err, out) - checkDurabilityPolicy(t, "none") + checkDurabilityPolicy(t, policy.DurabilityNone) out, err = vtctldClientProcess.ExecuteCommandWithOutput("DeleteKeyspace", "ks_durability") require.NoError(t, err, out) out, err = clusterForKSTest.VtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", "--durability-policy=semi_sync", "ks_durability") require.NoError(t, err, out) - checkDurabilityPolicy(t, "semi_sync") + checkDurabilityPolicy(t, policy.DurabilitySemiSync) out, err = clusterForKSTest.VtctldClientProcess.ExecuteCommandWithOutput("DeleteKeyspace", "ks_durability") require.NoError(t, err, out) diff --git a/go/test/endtoend/reparent/emergencyreparent/ers_test.go b/go/test/endtoend/reparent/emergencyreparent/ers_test.go index 0d2eb8935d2..37855a47df6 100644 --- a/go/test/endtoend/reparent/emergencyreparent/ers_test.go +++ b/go/test/endtoend/reparent/emergencyreparent/ers_test.go @@ -28,10 +28,11 @@ import ( "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/reparent/utils" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) func TestTrivialERS(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -55,7 +56,7 @@ func TestTrivialERS(t *testing.T) { } func TestReparentIgnoreReplicas(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets var err error @@ -96,7 +97,7 @@ func TestReparentIgnoreReplicas(t *testing.T) { } func TestReparentDownPrimary(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -131,7 +132,7 @@ func TestReparentDownPrimary(t *testing.T) { } func TestReparentNoChoiceDownPrimary(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets var err error @@ -166,7 +167,7 @@ func TestReparentNoChoiceDownPrimary(t *testing.T) { func TestSemiSyncSetupCorrectly(t *testing.T) { t.Run("semi-sync enabled", func(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -193,7 +194,7 @@ func TestSemiSyncSetupCorrectly(t *testing.T) { }) t.Run("semi-sync disabled", func(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "none") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilityNone) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -222,7 +223,7 @@ func TestSemiSyncSetupCorrectly(t *testing.T) { // TestERSPromoteRdonly tests that we never end up promoting a rdonly instance as the primary func TestERSPromoteRdonly(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets var err error @@ -249,7 +250,7 @@ func TestERSPromoteRdonly(t *testing.T) { // TestERSPreventCrossCellPromotion tests that we promote a replica in the same cell as the previous primary if prevent cross cell promotion flag is set func TestERSPreventCrossCellPromotion(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets var err error @@ -271,7 +272,7 @@ func TestERSPreventCrossCellPromotion(t *testing.T) { // TestPullFromRdonly tests that if a rdonly tablet is the most advanced, then our promoted primary should have // caught up to it by pulling transactions from it func TestPullFromRdonly(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets var err error @@ -342,7 +343,7 @@ func TestPullFromRdonly(t *testing.T) { // replicas which do not have any replication status and also succeeds if the io thread // is stopped on the primary elect. func TestNoReplicationStatusAndIOThreadStopped(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) @@ -441,7 +442,7 @@ func TestERSForInitialization(t *testing.T) { } func TestRecoverWithMultipleFailures(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) @@ -468,7 +469,7 @@ func TestRecoverWithMultipleFailures(t *testing.T) { // TestERSFailFast tests that ERS will fail fast if it cannot find any tablet which can be safely promoted instead of promoting // a tablet and hanging while inserting a row in the reparent journal on getting semi-sync ACKs func TestERSFailFast(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) @@ -507,7 +508,7 @@ func TestERSFailFast(t *testing.T) { // TestReplicationStopped checks that ERS ignores the tablets that have sql thread stopped. // If there are more than 1, we also fail. func TestReplicationStopped(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) diff --git a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go index a041ca04c68..fc5db965847 100644 --- a/go/test/endtoend/reparent/newfeaturetest/reparent_test.go +++ b/go/test/endtoend/reparent/newfeaturetest/reparent_test.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/reparent/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) // TestRecoverWithMultipleVttabletFailures tests that ERS succeeds with the default values @@ -36,7 +37,7 @@ import ( // The test takes down the vttablets of the primary and a rdonly tablet and runs ERS with the // default values of remote_operation_timeout, lock-timeout flags and wait_replicas_timeout subflag. func TestRecoverWithMultipleVttabletFailures(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) @@ -67,7 +68,7 @@ func TestRecoverWithMultipleVttabletFailures(t *testing.T) { // and ERS succeeds. func TestSingleReplicaERS(t *testing.T) { // Set up a cluster with none durability policy - clusterInstance := utils.SetupReparentCluster(t, "none") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilityNone) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets // Confirm that the replication is setup correctly in the beginning. @@ -102,7 +103,7 @@ func TestSingleReplicaERS(t *testing.T) { // TestTabletRestart tests that a running tablet can be restarted and everything is still fine func TestTabletRestart(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -114,7 +115,7 @@ func TestTabletRestart(t *testing.T) { // Tests ensures that ChangeTabletType works even when semi-sync plugins are not loaded. func TestChangeTypeWithoutSemiSync(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "none") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilityNone) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -159,7 +160,7 @@ func TestChangeTypeWithoutSemiSync(t *testing.T) { // TestERSWithWriteInPromoteReplica tests that ERS doesn't fail even if there is a // write that happens when PromoteReplica is called. func TestERSWithWriteInPromoteReplica(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) @@ -176,7 +177,7 @@ func TestERSWithWriteInPromoteReplica(t *testing.T) { } func TestBufferingWithMultipleDisruptions(t *testing.T) { - clusterInstance := utils.SetupShardedReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupShardedReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) // Stop all VTOrc instances, so that they don't interfere with the test. diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index 94e37d715f4..7b750dc3f16 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -33,10 +33,11 @@ import ( "vitess.io/vitess/go/test/endtoend/reparent/utils" "vitess.io/vitess/go/vt/log" replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) func TestPrimaryToSpareStateChangeImpossible(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -47,7 +48,7 @@ func TestPrimaryToSpareStateChangeImpossible(t *testing.T) { } func TestReparentCrossCell(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -60,7 +61,7 @@ func TestReparentCrossCell(t *testing.T) { } func TestReparentGraceful(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -82,7 +83,7 @@ func TestReparentGraceful(t *testing.T) { // TestPRSWithDrainedLaggingTablet tests that PRS succeeds even if we have a lagging drained tablet func TestPRSWithDrainedLaggingTablet(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -108,7 +109,7 @@ func TestPRSWithDrainedLaggingTablet(t *testing.T) { } func TestReparentReplicaOffline(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -125,7 +126,7 @@ func TestReparentReplicaOffline(t *testing.T) { } func TestReparentAvoid(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.DeleteTablet(t, clusterInstance, tablets[2]) @@ -172,13 +173,13 @@ func TestReparentAvoid(t *testing.T) { } func TestReparentFromOutside(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) reparentFromOutside(t, clusterInstance, false) } func TestReparentFromOutsideWithNoPrimary(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -277,7 +278,7 @@ func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessClus } func TestReparentWithDownReplica(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -323,7 +324,7 @@ func TestReparentWithDownReplica(t *testing.T) { } func TestChangeTypeSemiSync(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -389,7 +390,7 @@ func TestChangeTypeSemiSync(t *testing.T) { // 1. When PRS is run with the cross_cell durability policy setup, then the semi-sync settings on all the tablets are as expected // 2. Bringing up a new vttablet should have its replication and semi-sync setup correctly without any manual intervention func TestCrossCellDurability(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "cross_cell") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilityCrossCell) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -428,7 +429,7 @@ func TestCrossCellDurability(t *testing.T) { // TestFullStatus tests that the RPC FullStatus works as intended. func TestFullStatus(t *testing.T) { - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) diff --git a/go/test/endtoend/reparent/semisync/semi_sync_test.go b/go/test/endtoend/reparent/semisync/semi_sync_test.go index df9bf192e65..804a1645f19 100644 --- a/go/test/endtoend/reparent/semisync/semi_sync_test.go +++ b/go/test/endtoend/reparent/semisync/semi_sync_test.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/reparent/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) func TestSemiSyncUpgradeDowngrade(t *testing.T) { @@ -33,7 +34,7 @@ func TestSemiSyncUpgradeDowngrade(t *testing.T) { if ver != 21 { t.Skip("We only want to run this test for v21 release") } - clusterInstance := utils.SetupReparentCluster(t, "semi_sync") + clusterInstance := utils.SetupReparentCluster(t, policy.DurabilitySemiSync) defer utils.TeardownCluster(clusterInstance) tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 8425e92f971..5fa06c9be4c 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -32,6 +32,7 @@ import ( "github.com/stretchr/testify/require" querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/mysql" @@ -71,7 +72,7 @@ func SetupReparentCluster(t *testing.T, durability string) *cluster.LocalProcess // SetupRangeBasedCluster sets up the range based cluster func SetupRangeBasedCluster(ctx context.Context, t *testing.T) *cluster.LocalProcessCluster { - return setupCluster(ctx, t, ShardName, []string{cell1}, []int{2}, "semi_sync") + return setupCluster(ctx, t, ShardName, []string{cell1}, []int{2}, policy.DurabilitySemiSync) } // SetupShardedReparentCluster is used to setup a sharded cluster for testing diff --git a/go/test/endtoend/transaction/benchmark/bench_test.go b/go/test/endtoend/transaction/benchmark/bench_test.go index a42c9bca9c1..553919f893e 100644 --- a/go/test/endtoend/transaction/benchmark/bench_test.go +++ b/go/test/endtoend/transaction/benchmark/bench_test.go @@ -30,6 +30,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -65,7 +66,7 @@ func TestMain(m *testing.M) { SchemaSQL: SchemaSQL, VSchema: VSchema, SidecarDBName: sidecarDBName, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-c0", "c0-"}, 1, false); err != nil { return 1 diff --git a/go/test/endtoend/transaction/twopc/fuzz/main_test.go b/go/test/endtoend/transaction/twopc/fuzz/main_test.go index 4d168fbdde0..3516bdefe05 100644 --- a/go/test/endtoend/transaction/twopc/fuzz/main_test.go +++ b/go/test/endtoend/transaction/twopc/fuzz/main_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -78,7 +79,7 @@ func TestMain(m *testing.M) { Name: keyspaceName, SchemaSQL: SchemaSQL, VSchema: VSchema, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { return 1 @@ -89,7 +90,7 @@ func TestMain(m *testing.M) { Name: unshardedKeyspaceName, SchemaSQL: "", VSchema: "{}", - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartUnshardedKeyspace(*unshardedKeyspace, 2, false); err != nil { return 1 diff --git a/go/test/endtoend/transaction/twopc/main_test.go b/go/test/endtoend/transaction/twopc/main_test.go index 3607beea72a..7a2f7e8676e 100644 --- a/go/test/endtoend/transaction/twopc/main_test.go +++ b/go/test/endtoend/transaction/twopc/main_test.go @@ -32,6 +32,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" @@ -92,7 +93,7 @@ func TestMain(m *testing.M) { SchemaSQL: SchemaSQL, VSchema: VSchema, SidecarDBName: sidecarDBName, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { return 1 diff --git a/go/test/endtoend/transaction/twopc/metric/main_test.go b/go/test/endtoend/transaction/twopc/metric/main_test.go index 61a43017ef9..0018f5d45d8 100644 --- a/go/test/endtoend/transaction/twopc/metric/main_test.go +++ b/go/test/endtoend/transaction/twopc/metric/main_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -78,7 +79,7 @@ func TestMain(m *testing.M) { SchemaSQL: SchemaSQL, VSchema: VSchema, SidecarDBName: sidecarDBName, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { return 1 diff --git a/go/test/endtoend/transaction/twopc/stress/main_test.go b/go/test/endtoend/transaction/twopc/stress/main_test.go index 4da4f86bdff..977fa3f6fd6 100644 --- a/go/test/endtoend/transaction/twopc/stress/main_test.go +++ b/go/test/endtoend/transaction/twopc/stress/main_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -80,7 +81,7 @@ func TestMain(m *testing.M) { Name: keyspaceName, SchemaSQL: SchemaSQL, VSchema: VSchema, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { return 1 @@ -91,7 +92,7 @@ func TestMain(m *testing.M) { Name: unshardedKeyspaceName, SchemaSQL: "", VSchema: "{}", - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartUnshardedKeyspace(*unshardedKeyspace, 2, false); err != nil { return 1 diff --git a/go/test/endtoend/transaction/tx_test.go b/go/test/endtoend/transaction/tx_test.go index 89531952b13..fd162cb3d41 100644 --- a/go/test/endtoend/transaction/tx_test.go +++ b/go/test/endtoend/transaction/tx_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -69,7 +70,7 @@ func TestMain(m *testing.M) { Name: keyspaceName, SchemaSQL: SchemaSQL, VSchema: VSchema, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-80", "80-"}, 1, false); err != nil { return 1, err diff --git a/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go b/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go index b296ef554b2..de60420eee3 100644 --- a/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go +++ b/go/test/endtoend/vtorc/primaryfailure/primary_failure_test.go @@ -31,6 +31,7 @@ import ( "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/vtorc/utils" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/logic" ) @@ -44,7 +45,7 @@ func TestDownPrimary(t *testing.T) { // If we don't specify a small value of --wait-replicas-timeout, then we would end up waiting for 30 seconds for the dead-primary to respond, failing this test. utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s", "--wait-replicas-timeout=5s"}, cluster.VTOrcConfiguration{ PreventCrossCellFailover: true, - }, 1, "semi_sync") + }, 1, policy.DurabilitySemiSync) keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] // find primary from topo @@ -115,7 +116,7 @@ func TestDownPrimary(t *testing.T) { // bring down primary before VTOrc has started, let vtorc repair. func TestDownPrimaryBeforeVTOrc(t *testing.T) { defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) - utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{}, 0, "none") + utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, nil, cluster.VTOrcConfiguration{}, 0, policy.DurabilityNone) keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] curPrimary := shard0.Vttablets[0] @@ -170,7 +171,7 @@ func TestDownPrimaryBeforeVTOrc(t *testing.T) { // delete the primary record and let vtorc repair. func TestDeletedPrimaryTablet(t *testing.T) { defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) - utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s"}, cluster.VTOrcConfiguration{}, 1, "none") + utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s"}, cluster.VTOrcConfiguration{}, 1, policy.DurabilityNone) keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] // find primary from topo @@ -241,7 +242,7 @@ func TestDeadPrimaryRecoversImmediately(t *testing.T) { // If we don't specify a small value of --wait-replicas-timeout, then we would end up waiting for 30 seconds for the dead-primary to respond, failing this test. utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 1, []string{"--remote_operation_timeout=10s", "--wait-replicas-timeout=5s"}, cluster.VTOrcConfiguration{ PreventCrossCellFailover: true, - }, 1, "semi_sync") + }, 1, policy.DurabilitySemiSync) keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] shard0 := &keyspace.Shards[0] // find primary from topo diff --git a/go/test/endtoend/vtorc/utils/utils.go b/go/test/endtoend/vtorc/utils/utils.go index 456d55518dd..0a2d516fe63 100644 --- a/go/test/endtoend/vtorc/utils/utils.go +++ b/go/test/endtoend/vtorc/utils/utils.go @@ -40,6 +40,7 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" // Register topo implementations. _ "vitess.io/vitess/go/vt/topo/consultopo" @@ -299,7 +300,7 @@ func SetupVttabletsAndVTOrcs(t *testing.T, clusterInfo *VTOrcClusterInfo, numRep } if durability == "" { - durability = "none" + durability = policy.DurabilityNone } out, err := clusterInfo.ClusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, fmt.Sprintf("--durability-policy=%s", durability)) require.NoError(t, err, out) diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index c3dc22d21b4..706e0bec92a 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -71,6 +71,7 @@ import ( "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/topotools/events" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/schematools" "vitess.io/vitess/go/vt/vtctl/workflow" "vitess.io/vitess/go/vt/vtenv" @@ -668,7 +669,7 @@ func (s *VtctldServer) ChangeTabletType(ctx context.Context, req *vtctldatapb.Ch return nil, err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return nil, err } @@ -698,7 +699,7 @@ func (s *VtctldServer) ChangeTabletType(ctx context.Context, req *vtctldatapb.Ch // Since we want to check the durability rules for the desired state and not before we make that change expectedTablet := tablet.Tablet.CloneVT() expectedTablet.Type = req.DbType - err = s.tmc.ChangeType(ctx, tablet.Tablet, req.DbType, reparentutil.IsReplicaSemiSync(durability, shardPrimary.Tablet, expectedTablet)) + err = s.tmc.ChangeType(ctx, tablet.Tablet, req.DbType, policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, expectedTablet)) if err != nil { return nil, err } @@ -2776,7 +2777,7 @@ func (s *VtctldServer) InitShardPrimaryLocked( return err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return err } @@ -2860,7 +2861,7 @@ func (s *VtctldServer) InitShardPrimaryLocked( // position logger.Infof("initializing primary on %v", topoproto.TabletAliasString(req.PrimaryElectTabletAlias)) event.DispatchUpdate(ev, "initializing primary") - rp, err := tmc.InitPrimary(ctx, primaryElectTabletInfo.Tablet, reparentutil.SemiSyncAckers(durability, primaryElectTabletInfo.Tablet) > 0) + rp, err := tmc.InitPrimary(ctx, primaryElectTabletInfo.Tablet, policy.SemiSyncAckers(durability, primaryElectTabletInfo.Tablet) > 0) if err != nil { return err } @@ -2901,7 +2902,7 @@ func (s *VtctldServer) InitShardPrimaryLocked( go func(alias string, tabletInfo *topo.TabletInfo) { defer wgReplicas.Done() logger.Infof("initializing replica %v", alias) - if err := tmc.InitReplica(replCtx, tabletInfo.Tablet, req.PrimaryElectTabletAlias, rp, now, reparentutil.IsReplicaSemiSync(durability, primaryElectTabletInfo.Tablet, tabletInfo.Tablet)); err != nil { + if err := tmc.InitReplica(replCtx, tabletInfo.Tablet, req.PrimaryElectTabletAlias, rp, now, policy.IsReplicaSemiSync(durability, primaryElectTabletInfo.Tablet, tabletInfo.Tablet)); err != nil { rec.RecordError(fmt.Errorf("tablet %v InitReplica failed: %v", alias, err)) } }(alias, tabletInfo) @@ -3598,12 +3599,12 @@ func (s *VtctldServer) ReparentTablet(ctx context.Context, req *vtctldatapb.Repa return nil, err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return nil, err } - if err = s.tmc.SetReplicationSource(ctx, tablet.Tablet, shard.PrimaryAlias, 0, "", false, reparentutil.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet.Tablet), 0); err != nil { + if err = s.tmc.SetReplicationSource(ctx, tablet.Tablet, shard.PrimaryAlias, 0, "", false, policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet.Tablet), 0); err != nil { return nil, err } @@ -3787,7 +3788,7 @@ func (s *VtctldServer) SetKeyspaceDurabilityPolicy(ctx context.Context, req *vtc return nil, err } - policyValid := reparentutil.CheckDurabilityPolicyExists(req.DurabilityPolicy) + policyValid := policy.CheckDurabilityPolicyExists(req.DurabilityPolicy) if !policyValid { err = vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "durability policy <%v> is not a valid policy. Please register it as a policy first", req.DurabilityPolicy) return nil, err @@ -4308,12 +4309,12 @@ func (s *VtctldServer) StartReplication(ctx context.Context, req *vtctldatapb.St return nil, err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return nil, err } - if err = s.tmc.StartReplication(ctx, tablet.Tablet, reparentutil.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet.Tablet)); err != nil { + if err = s.tmc.StartReplication(ctx, tablet.Tablet, policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet.Tablet)); err != nil { log.Errorf("StartReplication: failed to start replication on %v: %v", alias, err) return nil, err } @@ -4413,12 +4414,12 @@ func (s *VtctldServer) TabletExternallyReparented(ctx context.Context, req *vtct return nil, err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return nil, err } - if err = s.tmc.ChangeType(ctx, tablet.Tablet, topodatapb.TabletType_PRIMARY, reparentutil.SemiSyncAckers(durability, tablet.Tablet) > 0); err != nil { + if err = s.tmc.ChangeType(ctx, tablet.Tablet, topodatapb.TabletType_PRIMARY, policy.SemiSyncAckers(durability, tablet.Tablet) > 0); err != nil { log.Warningf("ChangeType(%v, PRIMARY): %v", topoproto.TabletAliasString(req.Tablet), err) return nil, err } diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index b753cfd69aa..31220918211 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -30,6 +30,7 @@ import ( _flag "vitess.io/vitess/go/internal/flag" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -2777,14 +2778,14 @@ func TestCreateKeyspace(t *testing.T) { req: &vtctldatapb.CreateKeyspaceRequest{ Name: "testkeyspace", Type: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, }, expected: &vtctldatapb.CreateKeyspaceResponse{ Keyspace: &vtctldatapb.Keyspace{ Name: "testkeyspace", Keyspace: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, }, }, }, @@ -11338,11 +11339,11 @@ func TestSetKeyspaceDurabilityPolicy(t *testing.T) { }, req: &vtctldatapb.SetKeyspaceDurabilityPolicyRequest{ Keyspace: "ks1", - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, }, expected: &vtctldatapb.SetKeyspaceDurabilityPolicyResponse{ Keyspace: &topodatapb.Keyspace{ - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, }, }, }, diff --git a/go/vt/vtctl/reparentutil/durability_funcs.go b/go/vt/vtctl/reparentutil/durability_funcs.go index 63e123a685d..da53c1a3e15 100644 --- a/go/vt/vtctl/reparentutil/durability_funcs.go +++ b/go/vt/vtctl/reparentutil/durability_funcs.go @@ -19,16 +19,17 @@ package reparentutil import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/reparentutil/promotionrule" ) // SemiSyncAckersForPrimary returns the list of tablets which are capable of sending Semi-Sync Acks for the given primary tablet -func SemiSyncAckersForPrimary(durability Durabler, primary *topodatapb.Tablet, allTablets []*topodatapb.Tablet) (semiSyncAckers []*topodatapb.Tablet) { +func SemiSyncAckersForPrimary(durability policy.Durabler, primary *topodatapb.Tablet, allTablets []*topodatapb.Tablet) (semiSyncAckers []*topodatapb.Tablet) { for _, tablet := range allTablets { if topoproto.TabletAliasEqual(primary.Alias, tablet.Alias) { continue } - if IsReplicaSemiSync(durability, primary, tablet) { + if policy.IsReplicaSemiSync(durability, primary, tablet) { semiSyncAckers = append(semiSyncAckers, tablet) } } @@ -37,7 +38,7 @@ func SemiSyncAckersForPrimary(durability Durabler, primary *topodatapb.Tablet, a // haveRevokedForTablet checks whether we have reached enough tablets such that the given primary eligible tablet cannot accept any new writes // The tablets reached should have their replication stopped and must be set to read only. -func haveRevokedForTablet(durability Durabler, primaryEligible *topodatapb.Tablet, tabletsReached []*topodatapb.Tablet, allTablets []*topodatapb.Tablet) bool { +func haveRevokedForTablet(durability policy.Durabler, primaryEligible *topodatapb.Tablet, tabletsReached []*topodatapb.Tablet, allTablets []*topodatapb.Tablet) bool { // if we have reached the primaryEligible tablet and stopped its replication and marked it read only, then it will not // accept any new writes if topoproto.IsTabletInList(primaryEligible, tabletsReached) { @@ -51,7 +52,7 @@ func haveRevokedForTablet(durability Durabler, primaryEligible *topodatapb.Table allSemiSyncAckers := SemiSyncAckersForPrimary(durability, primaryEligible, allTablets) // numOfSemiSyncAcksRequired is the number of semi sync Acks that the primaryEligible tablet requires - numOfSemiSyncAcksRequired := SemiSyncAckers(durability, primaryEligible) + numOfSemiSyncAcksRequired := policy.SemiSyncAckers(durability, primaryEligible) // if we have reached enough semi-sync Acking tablets such that the primaryEligible cannot accept a write // we have revoked from the tablet @@ -61,9 +62,9 @@ func haveRevokedForTablet(durability Durabler, primaryEligible *topodatapb.Table // haveRevoked checks whether we have reached enough tablets to guarantee that no tablet eligible to become a primary can accept any write // All the tablets reached must have their replication stopped and set to read only for us to guarantee that we have revoked access // from all the primary eligible tablets (prevent them from accepting any new writes) -func haveRevoked(durability Durabler, tabletsReached []*topodatapb.Tablet, allTablets []*topodatapb.Tablet) bool { +func haveRevoked(durability policy.Durabler, tabletsReached []*topodatapb.Tablet, allTablets []*topodatapb.Tablet) bool { for _, tablet := range allTablets { - if PromotionRule(durability, tablet) == promotionrule.MustNot { + if policy.PromotionRule(durability, tablet) == promotionrule.MustNot { continue } if !haveRevokedForTablet(durability, tablet, tabletsReached, allTablets) { @@ -74,7 +75,7 @@ func haveRevoked(durability Durabler, tabletsReached []*topodatapb.Tablet, allTa } // canEstablishForTablet checks whether we have reached enough tablets to say that the given primary eligible tablet will be able to accept new writes -func canEstablishForTablet(durability Durabler, primaryEligible *topodatapb.Tablet, tabletsReached []*topodatapb.Tablet) bool { +func canEstablishForTablet(durability policy.Durabler, primaryEligible *topodatapb.Tablet, tabletsReached []*topodatapb.Tablet) bool { // if we have not reached the primaryEligible tablet, then it cannot be considered eligible to accept writes // since it might have been stopped if !topoproto.IsTabletInList(primaryEligible, tabletsReached) { @@ -85,7 +86,7 @@ func canEstablishForTablet(durability Durabler, primaryEligible *topodatapb.Tabl semiSyncAckersReached := SemiSyncAckersForPrimary(durability, primaryEligible, tabletsReached) // numOfSemiSyncAcksRequired is the number of semi sync Acks that the primaryEligible tablet requires - numOfSemiSyncAcksRequired := SemiSyncAckers(durability, primaryEligible) + numOfSemiSyncAcksRequired := policy.SemiSyncAckers(durability, primaryEligible) // if we have reached enough semi-sync Acking tablets such that the primaryEligible can accept a write // we can safely promote this tablet diff --git a/go/vt/vtctl/reparentutil/durability_funcs_test.go b/go/vt/vtctl/reparentutil/durability_funcs_test.go index 21eb308a4b0..737d3e40346 100644 --- a/go/vt/vtctl/reparentutil/durability_funcs_test.go +++ b/go/vt/vtctl/reparentutil/durability_funcs_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/require" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) var ( @@ -73,25 +74,25 @@ func TestSemiSyncAckersForPrimary(t *testing.T) { }{ { name: "no other tablets", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primary: primaryTablet, allTablets: []*topodatapb.Tablet{primaryTablet}, wantSemiSyncAckers: nil, }, { name: "'none' durability policy", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primary: primaryTablet, allTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet, rdonlyTablet, replicaCrossCellTablet, rdonlyCrossCellTablet}, wantSemiSyncAckers: nil, }, { name: "'semi_sync' durability policy", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, primary: primaryTablet, allTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet, rdonlyTablet, replicaCrossCellTablet, rdonlyCrossCellTablet}, wantSemiSyncAckers: []*topodatapb.Tablet{replicaTablet, replicaCrossCellTablet}, }, { name: "'cross_cell' durability policy", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primary: primaryTablet, allTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet, rdonlyTablet, replicaCrossCellTablet, rdonlyCrossCellTablet}, wantSemiSyncAckers: []*topodatapb.Tablet{replicaCrossCellTablet}, @@ -99,7 +100,7 @@ func TestSemiSyncAckersForPrimary(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(tt.durabilityPolicy) require.NoError(t, err, "error setting durability policy") semiSyncAckers := SemiSyncAckersForPrimary(durability, tt.primary, tt.allTablets) require.Equal(t, tt.wantSemiSyncAckers, semiSyncAckers) @@ -118,7 +119,7 @@ func Test_haveRevokedForTablet(t *testing.T) { }{ { name: "'none' durability policy - not revoked", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -129,7 +130,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: false, }, { name: "'none' durability policy - revoked", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -140,7 +141,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: true, }, { name: "'semi_sync' durability policy - revoked", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -151,7 +152,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: true, }, { name: "'semi_sync' durability policy - not revoked", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -162,7 +163,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: false, }, { name: "'cross_cell' durability policy - revoked", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -173,7 +174,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: true, }, { name: "'cross_cell' durability policy - not revoked", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -184,7 +185,7 @@ func Test_haveRevokedForTablet(t *testing.T) { revoked: false, }, { name: "'cross_cell' durability policy - primary in list", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primaryEligible: primaryTablet, allTablets: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -197,7 +198,7 @@ func Test_haveRevokedForTablet(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(tt.durabilityPolicy) require.NoError(t, err) out := haveRevokedForTablet(durability, tt.primaryEligible, tt.tabletsReached, tt.allTablets) require.Equal(t, tt.revoked, out) @@ -215,7 +216,7 @@ func Test_haveRevoked(t *testing.T) { }{ { name: "'none' durability policy - all tablets revoked", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -225,7 +226,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'semi_sync' durability policy - all tablets revoked", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -235,7 +236,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'cross_cell' durability policy - all tablets revoked", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -245,7 +246,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'none' durability policy - revoked", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, replicaCrossCellTablet, }, @@ -255,7 +256,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'semi_sync' durability policy - revoked", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, tabletsReached: []*topodatapb.Tablet{ replicaTablet, replicaCrossCellTablet, rdonlyTablet, }, @@ -265,7 +266,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'cross_cell' durability policy - revoked", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, tabletsReached: []*topodatapb.Tablet{ replicaCrossCellTablet, }, @@ -275,7 +276,7 @@ func Test_haveRevoked(t *testing.T) { revoked: true, }, { name: "'none' durability policy - not revoked", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -285,7 +286,7 @@ func Test_haveRevoked(t *testing.T) { revoked: false, }, { name: "'semi_sync' durability policy - not revoked", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, tabletsReached: []*topodatapb.Tablet{ primaryTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -295,7 +296,7 @@ func Test_haveRevoked(t *testing.T) { revoked: false, }, { name: "'cross_cell' durability policy - not revoked", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, tabletsReached: []*topodatapb.Tablet{ primaryTablet, rdonlyCrossCellTablet, rdonlyTablet, }, @@ -307,7 +308,7 @@ func Test_haveRevoked(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(tt.durabilityPolicy) require.NoError(t, err) out := haveRevoked(durability, tt.tabletsReached, tt.allTablets) require.Equal(t, tt.revoked, out) @@ -325,7 +326,7 @@ func Test_canEstablishForTablet(t *testing.T) { }{ { name: "primary not reached", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ replicaTablet, replicaCrossCellTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -333,7 +334,7 @@ func Test_canEstablishForTablet(t *testing.T) { canEstablish: false, }, { name: "not established", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ primaryTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -341,7 +342,7 @@ func Test_canEstablishForTablet(t *testing.T) { canEstablish: false, }, { name: "not established", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, rdonlyCrossCellTablet, rdonlyTablet, @@ -349,7 +350,7 @@ func Test_canEstablishForTablet(t *testing.T) { canEstablish: false, }, { name: "established", - durabilityPolicy: "none", + durabilityPolicy: policy.DurabilityNone, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ primaryTablet, @@ -357,7 +358,7 @@ func Test_canEstablishForTablet(t *testing.T) { canEstablish: true, }, { name: "established", - durabilityPolicy: "semi_sync", + durabilityPolicy: policy.DurabilitySemiSync, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaTablet, @@ -365,7 +366,7 @@ func Test_canEstablishForTablet(t *testing.T) { canEstablish: true, }, { name: "established", - durabilityPolicy: "cross_cell", + durabilityPolicy: policy.DurabilityCrossCell, primaryEligible: primaryTablet, tabletsReached: []*topodatapb.Tablet{ primaryTablet, replicaCrossCellTablet, @@ -375,7 +376,7 @@ func Test_canEstablishForTablet(t *testing.T) { } for _, tt := range tests { t.Run(fmt.Sprintf("'%s' durability policy - %s", tt.durabilityPolicy, tt.name), func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(tt.durabilityPolicy) require.NoError(t, err) require.Equalf(t, tt.canEstablish, canEstablishForTablet(durability, tt.primaryEligible, tt.tabletsReached), "canEstablishForTablet(%v, %v)", tt.primaryEligible, tt.tabletsReached) }) diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter.go b/go/vt/vtctl/reparentutil/emergency_reparenter.go index 70faf8958c7..5f7d3140c7b 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter.go @@ -24,6 +24,7 @@ import ( "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/event" "vitess.io/vitess/go/sets" @@ -66,7 +67,7 @@ type EmergencyReparentOptions struct { // Private options managed internally. We use value passing to avoid leaking // these details back out. lockAction string - durability Durabler + durability policy.Durabler } // counters for Emergency Reparent Shard @@ -181,7 +182,7 @@ func (erp *EmergencyReparenter) reparentShardLocked(ctx context.Context, ev *eve } erp.logger.Infof("Getting a new durability policy for %v", keyspaceDurability) - opts.durability, err = GetDurabilityPolicy(keyspaceDurability) + opts.durability, err = policy.GetDurabilityPolicy(keyspaceDurability) if err != nil { return err } @@ -539,11 +540,11 @@ func (erp *EmergencyReparenter) reparentReplicas( if ev.ShardInfo.PrimaryAlias == nil { erp.logger.Infof("setting up %v as new primary for an uninitialized cluster", alias) // we call InitPrimary when the PrimaryAlias in the ShardInfo is empty. This happens when we have an uninitialized cluster. - position, err = erp.tmc.InitPrimary(primaryCtx, tablet, SemiSyncAckers(opts.durability, tablet) > 0) + position, err = erp.tmc.InitPrimary(primaryCtx, tablet, policy.SemiSyncAckers(opts.durability, tablet) > 0) } else { erp.logger.Infof("starting promotion for the new primary - %v", alias) // we call PromoteReplica which changes the tablet type, fixes the semi-sync, set the primary to read-write and flushes the binlogs - position, err = erp.tmc.PromoteReplica(primaryCtx, tablet, SemiSyncAckers(opts.durability, tablet) > 0) + position, err = erp.tmc.PromoteReplica(primaryCtx, tablet, policy.SemiSyncAckers(opts.durability, tablet) > 0) } if err != nil { return vterrors.Wrapf(err, "primary-elect tablet %v failed to be upgraded to primary: %v", alias, err) @@ -574,7 +575,7 @@ func (erp *EmergencyReparenter) reparentReplicas( forceStart = fs } - err := erp.tmc.SetReplicationSource(replCtx, ti.Tablet, newPrimaryTablet.Alias, 0, "", forceStart, IsReplicaSemiSync(opts.durability, newPrimaryTablet, ti.Tablet), 0) + err := erp.tmc.SetReplicationSource(replCtx, ti.Tablet, newPrimaryTablet.Alias, 0, "", forceStart, policy.IsReplicaSemiSync(opts.durability, newPrimaryTablet, ti.Tablet), 0) if err != nil { err = vterrors.Wrapf(err, "tablet %v SetReplicationSource failed: %v", alias, err) rec.RecordError(err) @@ -746,7 +747,7 @@ func (erp *EmergencyReparenter) filterValidCandidates(validTablets []*topodatapb for _, tablet := range validTablets { tabletAliasStr := topoproto.TabletAliasString(tablet.Alias) // Remove tablets which have MustNot promote rule since they must never be promoted - if PromotionRule(opts.durability, tablet) == promotionrule.MustNot { + if policy.PromotionRule(opts.durability, tablet) == promotionrule.MustNot { erp.logger.Infof("Removing %s from list of valid candidates for promotion because it has the Must Not promote rule", tabletAliasStr) if opts.NewPrimaryAlias != nil && topoproto.TabletAliasEqual(opts.NewPrimaryAlias, tablet.Alias) { return nil, vterrors.Errorf(vtrpc.Code_ABORTED, "proposed primary %s has a must not promotion rule", topoproto.TabletAliasString(opts.NewPrimaryAlias)) diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go index 3669c34dc11..840df41d6e2 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/mysql/replication" logutilpb "vitess.io/vitess/go/vt/proto/logutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vttablet/tmclient" "vitess.io/vitess/go/mysql" @@ -129,7 +130,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }{ { name: "success", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ @@ -238,7 +239,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "success - 1 replica and 1 rdonly failure", - durability: "semi_sync", + durability: policy.DurabilitySemiSync, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ @@ -372,7 +373,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { // Here, all our tablets are tied, so we're going to explicitly pick // zone1-101. name: "success with requested primary-elect", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{NewPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", Uid: 101, @@ -483,7 +484,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "success with existing primary", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ DemotePrimaryResults: map[string]struct { @@ -594,7 +595,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "shard not found", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{}, unlockTopo: true, // we shouldn't try to lock the nonexistent shard @@ -607,7 +608,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "cannot stop replication", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ StopReplicationAndGetStatusResults: map[string]struct { @@ -666,7 +667,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "lost topo lock", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ StopReplicationAndGetStatusResults: map[string]struct { @@ -725,7 +726,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "cannot get reparent candidates", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ StopReplicationAndGetStatusResults: map[string]struct { @@ -799,7 +800,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "zero valid reparent candidates", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{}, shards: []*vtctldatapb.Shard{ @@ -816,7 +817,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "error waiting for relay logs to apply", - durability: "none", + durability: policy.DurabilityNone, // one replica is going to take a minute to apply relay logs emergencyReparentOps: EmergencyReparentOptions{ WaitReplicasTimeout: time.Millisecond * 50, @@ -911,7 +912,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "requested primary-elect is not in tablet map", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{NewPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", Uid: 200, @@ -1001,7 +1002,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "requested primary-elect is not winning primary-elect", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{NewPrimaryAlias: &topodatapb.TabletAlias{ // we're requesting a tablet that's behind in replication Cell: "zone1", Uid: 102, @@ -1124,7 +1125,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "cannot promote new primary", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{NewPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", Uid: 102, @@ -1237,7 +1238,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "promotion-rule - no valid candidates for emergency reparent", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{}, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ @@ -1344,7 +1345,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "proposed primary - must not promotion rule", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{ NewPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", @@ -1456,7 +1457,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "cross cell - no valid candidates", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{PreventCrossCellPromotion: true}, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ @@ -1575,7 +1576,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "proposed primary in a different cell", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{ PreventCrossCellPromotion: true, NewPrimaryAlias: &topodatapb.TabletAlias{ @@ -1700,7 +1701,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "proposed primary cannot make progress", - durability: "cross_cell", + durability: policy.DurabilityCrossCell, emergencyReparentOps: EmergencyReparentOptions{ NewPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", @@ -1815,7 +1816,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { }, { name: "expected primary mismatch", - durability: "none", + durability: policy.DurabilityNone, emergencyReparentOps: EmergencyReparentOptions{ ExpectedPrimaryAlias: &topodatapb.TabletAlias{ Cell: "zone1", @@ -2333,7 +2334,7 @@ func TestEmergencyReparenter_promotionOfNewPrimary(t *testing.T) { }, } - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() @@ -3021,7 +3022,7 @@ func TestEmergencyReparenter_findMostAdvanced(t *testing.T) { }, } - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -3502,7 +3503,7 @@ func TestEmergencyReparenter_reparentReplicas(t *testing.T) { }, } - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.remoteOpTimeout != 0 { @@ -4092,7 +4093,7 @@ func TestEmergencyReparenter_promoteIntermediateSource(t *testing.T) { }, } - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() @@ -4336,7 +4337,7 @@ func TestEmergencyReparenter_identifyPrimaryCandidate(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) test.emergencyReparentOps.durability = durability logger := logutil.NewMemoryLogger() @@ -4355,7 +4356,7 @@ func TestEmergencyReparenter_identifyPrimaryCandidate(t *testing.T) { // TestParentContextCancelled tests that even if the parent context of reparentReplicas cancels, we should not cancel the context of // SetReplicationSource since there could be tablets that are running it even after ERS completes. func TestParentContextCancelled(t *testing.T) { - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) // Setup ERS options with a very high wait replicas timeout emergencyReparentOps := EmergencyReparentOptions{IgnoreReplicas: sets.New[string]("zone1-0000000404"), WaitReplicasTimeout: time.Minute, durability: durability} @@ -4486,28 +4487,28 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { }{ { name: "filter must not", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: allTablets, tabletsTakingBackup: noTabletsTakingBackup, filteredTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet, replicaCrossCellTablet}, }, { name: "host taking backup must not be on the list when there are other candidates", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: []*topodatapb.Tablet{replicaTablet, replicaCrossCellTablet, rdonlyTablet, rdonlyCrossCellTablet}, tabletsTakingBackup: replicaTakingBackup, filteredTablets: []*topodatapb.Tablet{replicaCrossCellTablet}, }, { name: "host taking backup must be the only one on the list when there are no other candidates", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: []*topodatapb.Tablet{replicaTablet, rdonlyTablet, rdonlyCrossCellTablet}, tabletsTakingBackup: replicaTakingBackup, filteredTablets: []*topodatapb.Tablet{replicaTablet}, }, { name: "filter cross cell", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: allTablets, tabletsTakingBackup: noTabletsTakingBackup, @@ -4523,14 +4524,14 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { filteredTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet}, }, { name: "filter establish", - durability: "cross_cell", + durability: policy.DurabilityCrossCell, validTablets: []*topodatapb.Tablet{primaryTablet, replicaTablet}, tabletsReachable: []*topodatapb.Tablet{primaryTablet, replicaTablet, rdonlyTablet, rdonlyCrossCellTablet}, tabletsTakingBackup: noTabletsTakingBackup, filteredTablets: nil, }, { name: "filter mixed", - durability: "cross_cell", + durability: policy.DurabilityCrossCell, prevPrimary: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{ Cell: "zone-2", @@ -4545,7 +4546,7 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { filteredTablets: []*topodatapb.Tablet{replicaCrossCellTablet}, }, { name: "error - requested primary must not", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: allTablets, tabletsTakingBackup: noTabletsTakingBackup, @@ -4555,7 +4556,7 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { errShouldContain: "proposed primary zone-1-0000000003 has a must not promotion rule", }, { name: "error - requested primary not in same cell", - durability: "none", + durability: policy.DurabilityNone, validTablets: allTablets, tabletsReachable: allTablets, tabletsTakingBackup: noTabletsTakingBackup, @@ -4567,7 +4568,7 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { errShouldContain: "proposed primary zone-2-0000000002 is is a different cell as the previous primary", }, { name: "error - requested primary cannot establish", - durability: "cross_cell", + durability: policy.DurabilityCrossCell, validTablets: allTablets, tabletsTakingBackup: noTabletsTakingBackup, tabletsReachable: []*topodatapb.Tablet{primaryTablet, replicaTablet, rdonlyTablet, rdonlyCrossCellTablet}, @@ -4579,7 +4580,7 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durability) + durability, err := policy.GetDurabilityPolicy(tt.durability) require.NoError(t, err) tt.opts.durability = durability logger := logutil.NewMemoryLogger() @@ -5525,7 +5526,7 @@ func TestEmergencyReparenterFindErrantGTIDs(t *testing.T) { slices.Sort(keys) require.ElementsMatch(t, tt.wantedCandidates, keys) - dp, err := GetDurabilityPolicy("semi_sync") + dp, err := policy.GetDurabilityPolicy(policy.DurabilitySemiSync) require.NoError(t, err) ers := EmergencyReparenter{logger: logutil.NewCallbackLogger(func(*logutilpb.Event) {})} winningPrimary, _, err := ers.findMostAdvanced(candidates, tt.tabletMap, EmergencyReparentOptions{durability: dp}) diff --git a/go/vt/vtctl/reparentutil/planned_reparenter.go b/go/vt/vtctl/reparentutil/planned_reparenter.go index 91669e33b5f..dcd6dc7c590 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter.go @@ -36,6 +36,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools/events" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tmclient" ) @@ -71,7 +72,7 @@ type PlannedReparentOptions struct { // back out to the caller. lockAction string - durability Durabler + durability policy.Durabler } // NewPlannedReparenter returns a new PlannedReparenter object, ready to perform @@ -256,7 +257,7 @@ func (pr *PlannedReparenter) performGracefulPromotion( setSourceCtx, setSourceCancel := context.WithTimeout(ctx, opts.WaitReplicasTimeout) defer setSourceCancel() - if err := pr.tmc.SetReplicationSource(setSourceCtx, primaryElect, currentPrimary.Alias, 0, snapshotPos, true, IsReplicaSemiSync(opts.durability, currentPrimary.Tablet, primaryElect), 0); err != nil { + if err := pr.tmc.SetReplicationSource(setSourceCtx, primaryElect, currentPrimary.Alias, 0, snapshotPos, true, policy.IsReplicaSemiSync(opts.durability, currentPrimary.Tablet, primaryElect), 0); err != nil { return vterrors.Wrapf(err, "replication on primary-elect %v did not catch up in time; replication must be healthy to perform PlannedReparent", primaryElectAliasStr) } @@ -304,7 +305,7 @@ func (pr *PlannedReparenter) performGracefulPromotion( undoCtx, undoCancel := context.WithTimeout(context.Background(), topo.RemoteOperationTimeout) defer undoCancel() - if undoErr := pr.tmc.UndoDemotePrimary(undoCtx, currentPrimary.Tablet, SemiSyncAckers(opts.durability, currentPrimary.Tablet) > 0); undoErr != nil { + if undoErr := pr.tmc.UndoDemotePrimary(undoCtx, currentPrimary.Tablet, policy.SemiSyncAckers(opts.durability, currentPrimary.Tablet) > 0); undoErr != nil { pr.logger.Warningf("encountered error while performing UndoDemotePrimary(%v): %v", currentPrimary.AliasString(), undoErr) finalWaitErr = vterrors.Wrapf(finalWaitErr, "encountered error while performing UndoDemotePrimary(%v): %v", currentPrimary.AliasString(), undoErr) } @@ -332,7 +333,7 @@ func (pr *PlannedReparenter) performInitialPromotion( // This is done to guarantee safety, in the sense that the semi-sync is on before we start accepting writes. // However, during initialization, it is likely that the database would not be created in the MySQL instance. // Therefore, we have to first set read-write mode, create the database and then fix semi-sync, otherwise we get blocked. - rp, err := pr.tmc.InitPrimary(promoteCtx, primaryElect, SemiSyncAckers(opts.durability, primaryElect) > 0) + rp, err := pr.tmc.InitPrimary(promoteCtx, primaryElect, policy.SemiSyncAckers(opts.durability, primaryElect) > 0) if err != nil { return "", vterrors.Wrapf(err, "primary-elect tablet %v failed to be promoted to primary; please try again", primaryElectAliasStr) } @@ -521,7 +522,7 @@ func (pr *PlannedReparenter) reparentShardLocked( } pr.logger.Infof("Getting a new durability policy for %v", keyspaceDurability) - opts.durability, err = GetDurabilityPolicy(keyspaceDurability) + opts.durability, err = policy.GetDurabilityPolicy(keyspaceDurability) if err != nil { return err } @@ -693,7 +694,7 @@ func (pr *PlannedReparenter) reparentTablets( // that it needs to start replication after transitioning from // PRIMARY => REPLICA. forceStartReplication := false - if err := pr.tmc.SetReplicationSource(replCtx, tablet, ev.NewPrimary.Alias, reparentJournalTimestamp, "", forceStartReplication, IsReplicaSemiSync(opts.durability, ev.NewPrimary, tablet), 0); err != nil { + if err := pr.tmc.SetReplicationSource(replCtx, tablet, ev.NewPrimary.Alias, reparentJournalTimestamp, "", forceStartReplication, policy.IsReplicaSemiSync(opts.durability, ev.NewPrimary, tablet), 0); err != nil { rec.RecordError(vterrors.Wrapf(err, "tablet %v failed to SetReplicationSource(%v): %v", alias, primaryElectAliasStr, err)) } }(alias, tabletInfo.Tablet) @@ -702,7 +703,7 @@ func (pr *PlannedReparenter) reparentTablets( // If `PromoteReplica` call is required, we should call it and use the position that it returns. if promoteReplicaRequired { // Promote the candidate primary to type:PRIMARY. - primaryPosition, err := pr.tmc.PromoteReplica(replCtx, ev.NewPrimary, SemiSyncAckers(opts.durability, ev.NewPrimary) > 0) + primaryPosition, err := pr.tmc.PromoteReplica(replCtx, ev.NewPrimary, policy.SemiSyncAckers(opts.durability, ev.NewPrimary) > 0) if err != nil { pr.logger.Warningf("primary %v failed to PromoteReplica; cancelling replica reparent attempts", primaryElectAliasStr) replCancel() diff --git a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go index 8e2ee8f9df7..148d9fd812c 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go @@ -25,6 +25,7 @@ import ( "time" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/test/utils" @@ -557,6 +558,11 @@ func TestPlannedReparenter_getLockAction(t *testing.T) { } } +func getDurabilityPolicy(policyName string) policy.Durabler { + p, _ := policy.GetDurabilityPolicy(policyName) + return p +} + func TestPlannedReparenter_preflightChecks(t *testing.T) { t.Parallel() @@ -791,7 +797,6 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { Cell: "zone1", Uid: 500, }, - durability: &durabilityNone{}, }, expectedIsNoop: false, expectedEvent: &events.Reparent{ @@ -819,7 +824,7 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { Cell: "zone1", Uid: 100, }, - durability: &durabilityNone{}, + durability: getDurabilityPolicy(policy.DurabilityNone), }, shouldErr: false, }, @@ -889,7 +894,6 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { Cell: "zone1", Uid: 500, }, - durability: &durabilityNone{}, }, expectedIsNoop: false, expectedEvent: &events.Reparent{ @@ -917,7 +921,7 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { Cell: "zone1", Uid: 101, }, - durability: &durabilityNone{}, + durability: getDurabilityPolicy(policy.DurabilityNone), }, shouldErr: false, }, @@ -1148,7 +1152,7 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { Cell: "zone1", Uid: 500, }, - durability: &durabilityCrossCell{}, + durability: getDurabilityPolicy(policy.DurabilityCrossCell), }, expectedIsNoop: true, expectedEvent: &events.Reparent{ @@ -1186,7 +1190,7 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { pr := NewPlannedReparenter(ts, tt.tmc, logger) if tt.opts.durability == nil { - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) tt.opts.durability = durability } @@ -1799,7 +1803,7 @@ func TestPlannedReparenter_performGracefulPromotion(t *testing.T) { ctx = _ctx } - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) tt.opts.durability = durability @@ -1946,7 +1950,7 @@ func TestPlannedReparenter_performInitialPromotion(t *testing.T) { ctx = _ctx } - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) pos, err := pr.performInitialPromotion( ctx, @@ -3423,7 +3427,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { }{ { name: "success - durability = none", - durability: "none", + durability: policy.DurabilityNone, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ "zone1-0000000100": nil, @@ -3490,7 +3494,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { }, { name: "success - durability = semi_sync", - durability: "semi_sync", + durability: policy.DurabilitySemiSync, tmc: &testutil.TabletManagerClient{ PopulateReparentJournalResults: map[string]error{ "zone1-0000000100": nil, @@ -3556,7 +3560,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { shouldErr: false, }, { name: "success - promote replica required", - durability: "semi_sync", + durability: policy.DurabilitySemiSync, promoteReplicaRequired: true, tmc: &testutil.TabletManagerClient{ PromoteReplicaResults: map[string]struct { @@ -3632,7 +3636,7 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { shouldErr: false, }, { name: "Promote replica failed", - durability: "semi_sync", + durability: policy.DurabilitySemiSync, promoteReplicaRequired: true, tmc: &testutil.TabletManagerClient{ PromoteReplicaResults: map[string]struct { @@ -3977,11 +3981,11 @@ func TestPlannedReparenter_reparentTablets(t *testing.T) { t.Parallel() pr := NewPlannedReparenter(nil, tt.tmc, logger) - durabilityPolicy := "none" + durabilityPolicy := policy.DurabilityNone if tt.durability != "" { durabilityPolicy = tt.durability } - durability, err := GetDurabilityPolicy(durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(durabilityPolicy) require.NoError(t, err) tt.opts.durability = durability err = pr.reparentTablets(ctx, tt.ev, tt.reparentJournalPosition, tt.promoteReplicaRequired, tt.tabletMap, tt.opts) diff --git a/go/vt/vtctl/reparentutil/durability.go b/go/vt/vtctl/reparentutil/policy/durability.go similarity index 84% rename from go/vt/vtctl/reparentutil/durability.go rename to go/vt/vtctl/reparentutil/policy/durability.go index 29a5b2e712a..bad6846ef29 100644 --- a/go/vt/vtctl/reparentutil/durability.go +++ b/go/vt/vtctl/reparentutil/policy/durability.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package reparentutil +package policy import ( "fmt" @@ -37,32 +37,47 @@ var ( durabilityPolicies = make(map[string]NewDurabler) ) +const ( + // DurabilityNone is the name of the durability policy that has no semi-sync setup. + DurabilityNone = "none" + // DurabilitySemiSync is the name of the durability policy that has 1 semi-sync setup. + DurabilitySemiSync = "semi_sync" + // DurabilityCrossCell is the name of the durability policy that has 1 semi-sync setup but only allows Primary and Replica type servers from a different cell to acknowledge semi sync. + DurabilityCrossCell = "cross_cell" + // DurabilitySemiSyncWithRdonlyAck is the name of the durability policy that has 1 semi-sync setup and allows the "rdonly" to send semi-sync acks as well. + DurabilitySemiSyncWithRdonlyAck = "semi_sync_with_rdonly_ack" + // DurabilityCrossCellWithRdonlyAck is the name of the durability policy that has 1 semi-sync setup but only allows Primary and Replica type servers from a different cell to acknowledge semi sync. It also allows the "rdonly" to send semi-sync acks. + DurabilityCrossCellWithRdonlyAck = "cross_cell_with_rdonly_ack" + // DurabilityTest is the name of the durability policy that has no semi-sync setup but overrides the type for a specific tablet to prefer. It is only meant to be used for testing purposes! + DurabilityTest = "test" +) + func init() { // register all the durability rules with their functions to create them - RegisterDurability("none", func() Durabler { + RegisterDurability(DurabilityNone, func() Durabler { return &durabilityNone{} }) - RegisterDurability("semi_sync", func() Durabler { + RegisterDurability(DurabilitySemiSync, func() Durabler { return &durabilitySemiSync{ rdonlySemiSync: false, } }) - RegisterDurability("cross_cell", func() Durabler { + RegisterDurability(DurabilityCrossCell, func() Durabler { return &durabilityCrossCell{ rdonlySemiSync: false, } }) - RegisterDurability("semi_sync_with_rdonly_ack", func() Durabler { + RegisterDurability(DurabilitySemiSyncWithRdonlyAck, func() Durabler { return &durabilitySemiSync{ rdonlySemiSync: true, } }) - RegisterDurability("cross_cell_with_rdonly_ack", func() Durabler { + RegisterDurability(DurabilityCrossCellWithRdonlyAck, func() Durabler { return &durabilityCrossCell{ rdonlySemiSync: true, } }) - RegisterDurability("test", func() Durabler { + RegisterDurability(DurabilityTest, func() Durabler { return &durabilityTest{} }) } diff --git a/go/vt/vtctl/reparentutil/durability_test.go b/go/vt/vtctl/reparentutil/policy/durability_test.go similarity index 97% rename from go/vt/vtctl/reparentutil/durability_test.go rename to go/vt/vtctl/reparentutil/policy/durability_test.go index 5745da64f7e..441275f29bf 100644 --- a/go/vt/vtctl/reparentutil/durability_test.go +++ b/go/vt/vtctl/reparentutil/policy/durability_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package reparentutil +package policy import ( "testing" @@ -29,7 +29,7 @@ import ( ) func TestDurabilityNone(t *testing.T) { - durability, err := GetDurabilityPolicy("none") + durability, err := GetDurabilityPolicy(DurabilityNone) require.NoError(t, err) promoteRule := PromotionRule(durability, &topodatapb.Tablet{ @@ -78,10 +78,10 @@ func TestDurabilitySemiSync(t *testing.T) { rdonlySemiSync bool }{ { - durabilityPolicy: "semi_sync", + durabilityPolicy: DurabilitySemiSync, rdonlySemiSync: false, }, { - durabilityPolicy: "semi_sync_with_rdonly_ack", + durabilityPolicy: DurabilitySemiSyncWithRdonlyAck, rdonlySemiSync: true, }, } @@ -176,10 +176,10 @@ func TestDurabilityCrossCell(t *testing.T) { rdonlySemiSync bool }{ { - durabilityPolicy: "cross_cell", + durabilityPolicy: DurabilityCrossCell, rdonlySemiSync: false, }, { - durabilityPolicy: "cross_cell_with_rdonly_ack", + durabilityPolicy: DurabilityCrossCellWithRdonlyAck, rdonlySemiSync: true, }, } diff --git a/go/vt/vtctl/reparentutil/reparent_sorter.go b/go/vt/vtctl/reparentutil/reparent_sorter.go index ea7367bd36b..2f9c3c9ea8d 100644 --- a/go/vt/vtctl/reparentutil/reparent_sorter.go +++ b/go/vt/vtctl/reparentutil/reparent_sorter.go @@ -20,6 +20,7 @@ import ( "sort" "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vterrors" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -32,11 +33,11 @@ type reparentSorter struct { tablets []*topodatapb.Tablet positions []replication.Position innodbBufferPool []int - durability Durabler + durability policy.Durabler } // newReparentSorter creates a new reparentSorter -func newReparentSorter(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability Durabler) *reparentSorter { +func newReparentSorter(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability policy.Durabler) *reparentSorter { return &reparentSorter{ tablets: tablets, positions: positions, @@ -82,8 +83,8 @@ func (rs *reparentSorter) Less(i, j int) bool { // at this point, both have the same GTIDs // so we check their promotion rules - jPromotionRule := PromotionRule(rs.durability, rs.tablets[j]) - iPromotionRule := PromotionRule(rs.durability, rs.tablets[i]) + jPromotionRule := policy.PromotionRule(rs.durability, rs.tablets[j]) + iPromotionRule := policy.PromotionRule(rs.durability, rs.tablets[i]) // If the promotion rules are different then we want to sort by the promotion rules. if len(rs.innodbBufferPool) != 0 && jPromotionRule == iPromotionRule { @@ -100,7 +101,7 @@ func (rs *reparentSorter) Less(i, j int) bool { // sortTabletsForReparent sorts the tablets, given their positions for emergency reparent shard and planned reparent shard. // Tablets are sorted first by their replication positions, with ties broken by the promotion rules. -func sortTabletsForReparent(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability Durabler) error { +func sortTabletsForReparent(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability policy.Durabler) error { // throw an error internal error in case of unequal number of tablets and positions // fail-safe code prevents panic in sorting in case the lengths are unequal if len(tablets) != len(positions) { diff --git a/go/vt/vtctl/reparentutil/reparent_sorter_test.go b/go/vt/vtctl/reparentutil/reparent_sorter_test.go index 87e7b253d54..86aa129f1a4 100644 --- a/go/vt/vtctl/reparentutil/reparent_sorter_test.go +++ b/go/vt/vtctl/reparentutil/reparent_sorter_test.go @@ -23,6 +23,7 @@ import ( "vitess.io/vitess/go/mysql/replication" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" ) // TestReparentSorter tests that the sorting for tablets works correctly @@ -135,7 +136,7 @@ func TestReparentSorter(t *testing.T) { }, } - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) for _, testcase := range testcases { t.Run(testcase.name, func(t *testing.T) { diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index 17dbaeae015..1e1c2b98369 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -35,6 +35,7 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/topotools/events" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tmclient" ) @@ -153,12 +154,12 @@ func SetReplicationSource(ctx context.Context, ts *topo.Server, tmc tmclient.Tab return err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return err } - isSemiSync := IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet) + isSemiSync := policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet) return tmc.SetReplicationSource(ctx, tablet, shardPrimary.Alias, 0, "", false, isSemiSync, 0) } @@ -183,7 +184,7 @@ func stopReplicationAndBuildStatusMaps( stopReplicationTimeout time.Duration, ignoredTablets sets.Set[string], tabletToWaitFor *topodatapb.TabletAlias, - durability Durabler, + durability policy.Durabler, waitForAllTablets bool, logger logutil.Logger, ) (*replicationSnapshot, error) { diff --git a/go/vt/vtctl/reparentutil/replication_test.go b/go/vt/vtctl/reparentutil/replication_test.go index 1b36186efb8..1f8e5d097b7 100644 --- a/go/vt/vtctl/reparentutil/replication_test.go +++ b/go/vt/vtctl/reparentutil/replication_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" _flag "vitess.io/vitess/go/internal/flag" "vitess.io/vitess/go/mysql" @@ -289,7 +290,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }{ { name: "success", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -358,7 +359,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { shouldErr: false, }, { name: "success with wait for all tablets", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -428,7 +429,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { shouldErr: false, }, { name: "timing check with wait for all tablets", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -514,7 +515,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "success - 2 rdonly failures", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -608,7 +609,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "success - 1 rdonly and 1 replica failures", - durability: "semi_sync", + durability: policy.DurabilitySemiSync, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -702,7 +703,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "ignore tablets", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -762,7 +763,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "have PRIMARY tablet and can demote", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ demotePrimaryResults: map[string]*struct { PrimaryStatus *replicationdatapb.PrimaryStatus @@ -841,7 +842,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "one tablet is PRIMARY and cannot demote", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ demotePrimaryResults: map[string]*struct { PrimaryStatus *replicationdatapb.PrimaryStatus @@ -906,7 +907,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "multiple tablets are PRIMARY and cannot demote", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ demotePrimaryResults: map[string]*struct { PrimaryStatus *replicationdatapb.PrimaryStatus @@ -959,7 +960,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "stopReplicasTimeout exceeded", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusDelays: map[string]time.Duration{ "zone1-0000000100": time.Minute, // zone1-0000000100 will timeout and not be included @@ -1023,7 +1024,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "one tablet fails to StopReplication", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -1080,7 +1081,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "multiple tablets fail StopReplication", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -1121,7 +1122,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { shouldErr: true, }, { name: "1 tablets fail StopReplication and 1 has replication stopped", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -1166,7 +1167,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { }, { name: "slow tablet is the new primary requested", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusDelays: map[string]time.Duration{ "zone1-0000000102": 1 * time.Second, // zone1-0000000102 is slow to respond but has to be included since it is the requested primary @@ -1268,7 +1269,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { shouldErr: false, }, { name: "Handle nil replication status After. No segfaulting when determining backup status, and fall back to Before status", - durability: "none", + durability: policy.DurabilityNone, tmc: &stopReplicationAndBuildStatusMapsTestTMClient{ stopReplicationAndGetStatusResults: map[string]*struct { StopStatus *replicationdatapb.StopReplicationStatus @@ -1340,7 +1341,7 @@ func Test_stopReplicationAndBuildStatusMaps(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - durability, err := GetDurabilityPolicy(tt.durability) + durability, err := policy.GetDurabilityPolicy(tt.durability) require.NoError(t, err) startTime := time.Now() res, err := stopReplicationAndBuildStatusMaps(ctx, tt.tmc, &events.Reparent{}, tt.tabletMap, tt.stopReplicasTimeout, tt.ignoredTablets, tt.tabletToWaitFor, durability, tt.waitForAllTablets, logger) diff --git a/go/vt/vtctl/reparentutil/util.go b/go/vt/vtctl/reparentutil/util.go index c4c23e65c7e..4b8a4cbc431 100644 --- a/go/vt/vtctl/reparentutil/util.go +++ b/go/vt/vtctl/reparentutil/util.go @@ -34,6 +34,7 @@ import ( "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/reparentutil/promotionrule" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tmclient" @@ -345,9 +346,9 @@ func findCandidate( } // getTabletsWithPromotionRules gets the tablets with the given promotion rule from the list of tablets -func getTabletsWithPromotionRules(durability Durabler, tablets []*topodatapb.Tablet, rule promotionrule.CandidatePromotionRule) (res []*topodatapb.Tablet) { +func getTabletsWithPromotionRules(durability policy.Durabler, tablets []*topodatapb.Tablet, rule promotionrule.CandidatePromotionRule) (res []*topodatapb.Tablet) { for _, candidate := range tablets { - promotionRule := PromotionRule(durability, candidate) + promotionRule := policy.PromotionRule(durability, candidate) if promotionRule == rule { res = append(res, candidate) } diff --git a/go/vt/vtctl/reparentutil/util_test.go b/go/vt/vtctl/reparentutil/util_test.go index ac44da8175a..276bab2e443 100644 --- a/go/vt/vtctl/reparentutil/util_test.go +++ b/go/vt/vtctl/reparentutil/util_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/utils" @@ -1014,7 +1015,7 @@ zone1-0000000100 is not a replica`, }, } - durability, err := GetDurabilityPolicy("none") + durability, err := policy.GetDurabilityPolicy(policy.DurabilityNone) require.NoError(t, err) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -1829,7 +1830,7 @@ func Test_getTabletsWithPromotionRules(t *testing.T) { filteredTablets: nil, }, } - durability, _ := GetDurabilityPolicy("none") + durability, _ := policy.GetDurabilityPolicy(policy.DurabilityNone) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { res := getTabletsWithPromotionRules(durability, tt.tablets, tt.rule) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 1a4735b1c82..9ad64c3d4fd 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -100,6 +100,7 @@ import ( "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/ptr" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/flagutil" @@ -1818,7 +1819,7 @@ func commandCreateKeyspace(ctx context.Context, wr *wrangler.Wrangler, subFlags keyspaceType := subFlags.String("keyspace_type", "", "Specifies the type of the keyspace") baseKeyspace := subFlags.String("base_keyspace", "", "Specifies the base keyspace for a snapshot keyspace") timestampStr := subFlags.String("snapshot_time", "", "Specifies the snapshot time for this keyspace") - durabilityPolicy := subFlags.String("durability-policy", "none", "Type of durability to enforce for this keyspace. Default is none. Possible values include 'semi_sync' and others as dictated by registered plugins.") + durabilityPolicy := subFlags.String("durability-policy", policy.DurabilityNone, "Type of durability to enforce for this keyspace. Default is none. Possible values include 'semi_sync' and others as dictated by registered plugins.") sidecarDBName := subFlags.String("sidecar-db-name", sidecar.DefaultName, "(Experimental) Name of the Vitess sidecar database that tablets in this keyspace will use for internal metadata.") if err := subFlags.Parse(args); err != nil { return err @@ -1840,7 +1841,7 @@ func commandCreateKeyspace(ctx context.Context, wr *wrangler.Wrangler, subFlags var snapshotTime *vttime.Time if ktype == topodatapb.KeyspaceType_SNAPSHOT { - if *durabilityPolicy != "none" { + if *durabilityPolicy != policy.DurabilityNone { return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "durability-policy cannot be specified while creating a snapshot keyspace") } if *baseKeyspace == "" { diff --git a/go/vt/vtctld/api_test.go b/go/vt/vtctld/api_test.go index d8ac8beccc1..4166ca3293b 100644 --- a/go/vt/vtctld/api_test.go +++ b/go/vt/vtctld/api_test.go @@ -29,6 +29,7 @@ import ( "vitess.io/vitess/go/vt/servenv/testutils" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/wrangler" @@ -53,7 +54,7 @@ func TestAPI(t *testing.T) { defer server.Close() ks1 := &topodatapb.Keyspace{ - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, SidecarDbName: "_vt_sidecar_ks1", } diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index 5b75ae80672..fc91c28b021 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -30,7 +30,7 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" - "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" "vitess.io/vitess/go/vt/vtorc/util" @@ -54,7 +54,7 @@ type clusterAnalysis struct { hasClusterwideAction bool totalTablets int primaryAlias string - durability reparentutil.Durabler + durability policy.Durabler } // GetReplicationAnalysis will check for replication problems (dead primary; unreachable primary; etc) @@ -375,7 +375,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna log.Errorf("ignoring keyspace %v because no durability_policy is set. Please set it using SetKeyspaceDurabilityPolicy", a.AnalyzedKeyspace) return nil } - durability, err := reparentutil.GetDurabilityPolicy(durabilityPolicy) + durability, err := policy.GetDurabilityPolicy(durabilityPolicy) if err != nil { log.Errorf("can't get the durability policy %v - %v. Skipping keyspace - %v.", durabilityPolicy, err, a.AnalyzedKeyspace) return nil @@ -430,11 +430,11 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna a.Analysis = PrimaryIsReadOnly a.Description = "Primary is read-only" // - } else if a.IsClusterPrimary && reparentutil.SemiSyncAckers(ca.durability, tablet) != 0 && !a.SemiSyncPrimaryEnabled { + } else if a.IsClusterPrimary && policy.SemiSyncAckers(ca.durability, tablet) != 0 && !a.SemiSyncPrimaryEnabled { a.Analysis = PrimarySemiSyncMustBeSet a.Description = "Primary semi-sync must be set" // - } else if a.IsClusterPrimary && reparentutil.SemiSyncAckers(ca.durability, tablet) == 0 && a.SemiSyncPrimaryEnabled { + } else if a.IsClusterPrimary && policy.SemiSyncAckers(ca.durability, tablet) == 0 && a.SemiSyncPrimaryEnabled { a.Analysis = PrimarySemiSyncMustNotBeSet a.Description = "Primary semi-sync must not be set" // @@ -472,11 +472,11 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna a.Analysis = ReplicationStopped a.Description = "Replication is stopped" // - } else if topo.IsReplicaType(a.TabletType) && !a.IsPrimary && reparentutil.IsReplicaSemiSync(ca.durability, primaryTablet, tablet) && !a.SemiSyncReplicaEnabled { + } else if topo.IsReplicaType(a.TabletType) && !a.IsPrimary && policy.IsReplicaSemiSync(ca.durability, primaryTablet, tablet) && !a.SemiSyncReplicaEnabled { a.Analysis = ReplicaSemiSyncMustBeSet a.Description = "Replica semi-sync must be set" // - } else if topo.IsReplicaType(a.TabletType) && !a.IsPrimary && !reparentutil.IsReplicaSemiSync(ca.durability, primaryTablet, tablet) && a.SemiSyncReplicaEnabled { + } else if topo.IsReplicaType(a.TabletType) && !a.IsPrimary && !policy.IsReplicaSemiSync(ca.durability, primaryTablet, tablet) && a.SemiSyncReplicaEnabled { a.Analysis = ReplicaSemiSyncMustNotBeSet a.Description = "Replica semi-sync must not be set" // diff --git a/go/vt/vtorc/inst/analysis_dao_test.go b/go/vt/vtorc/inst/analysis_dao_test.go index 0dc24fef7e6..ae4f7279403 100644 --- a/go/vt/vtorc/inst/analysis_dao_test.go +++ b/go/vt/vtorc/inst/analysis_dao_test.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/vt/external/golib/sqlutils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/db" "vitess.io/vitess/go/vt/vtorc/test" ) @@ -70,7 +71,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, }}, keyspaceWanted: "ks", @@ -89,7 +90,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlPort: 6709, }, ShardPrimaryTermTimestamp: "2022-12-28 07:23:25.129898+00:00", - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, }}, keyspaceWanted: "ks", @@ -107,7 +108,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 0, CountReplicas: 4, CountValidReplicas: 4, @@ -129,7 +130,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 0, CountReplicas: 0, IsPrimary: 1, @@ -149,7 +150,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 0, CountReplicas: 3, IsPrimary: 1, @@ -169,7 +170,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 0, CountReplicas: 4, CountValidReplicas: 2, @@ -191,7 +192,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -212,7 +213,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -234,7 +235,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -256,7 +257,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -278,7 +279,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -315,7 +316,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -333,7 +334,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, @@ -355,7 +356,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -373,7 +374,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 102}, }, @@ -395,7 +396,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -413,7 +414,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, @@ -436,7 +437,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -454,7 +455,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, @@ -477,7 +478,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -495,7 +496,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, @@ -520,7 +521,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -542,7 +543,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, LastCheckValid: 1, ReadOnly: 1, SemiSyncReplicaEnabled: 0, @@ -562,7 +563,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -583,7 +584,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, ReadOnly: 1, SemiSyncReplicaEnabled: 1, @@ -605,7 +606,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { }, // Snapshot Keyspace KeyspaceType: 1, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, }}, keyspaceWanted: "ks", @@ -643,7 +644,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -663,7 +664,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlPort: 6709, }, IsInvalid: 1, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, }}, keyspaceWanted: "ks", shardWanted: "0", @@ -680,7 +681,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, IsInvalid: 1, }, { TabletInfo: &topodatapb.Tablet{ @@ -722,7 +723,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, IsInvalid: 1, }}, keyspaceWanted: "ks", @@ -740,7 +741,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -758,7 +759,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, ErrantGTID: "some errant GTID", PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, @@ -781,7 +782,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6708, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, LastCheckValid: 1, CountReplicas: 4, CountValidReplicas: 4, @@ -799,7 +800,7 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { MysqlHostname: "localhost", MysqlPort: 6709, }, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, ErrantGTID: "some errant GTID", PrimaryTabletInfo: &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, diff --git a/go/vt/vtorc/inst/keyspace_dao.go b/go/vt/vtorc/inst/keyspace_dao.go index d764e3fc56a..4271886121e 100644 --- a/go/vt/vtorc/inst/keyspace_dao.go +++ b/go/vt/vtorc/inst/keyspace_dao.go @@ -22,7 +22,7 @@ import ( "vitess.io/vitess/go/vt/external/golib/sqlutils" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/db" ) @@ -80,10 +80,10 @@ func SaveKeyspace(keyspace *topo.KeyspaceInfo) error { } // GetDurabilityPolicy gets the durability policy for the given keyspace. -func GetDurabilityPolicy(keyspace string) (reparentutil.Durabler, error) { +func GetDurabilityPolicy(keyspace string) (policy.Durabler, error) { ki, err := ReadKeyspace(keyspace) if err != nil { return nil, err } - return reparentutil.GetDurabilityPolicy(ki.DurabilityPolicy) + return policy.GetDurabilityPolicy(ki.DurabilityPolicy) } diff --git a/go/vt/vtorc/inst/keyspace_dao_test.go b/go/vt/vtorc/inst/keyspace_dao_test.go index dda3ffaa9d2..ef2dd67379e 100644 --- a/go/vt/vtorc/inst/keyspace_dao_test.go +++ b/go/vt/vtorc/inst/keyspace_dao_test.go @@ -24,7 +24,7 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/db" ) @@ -48,7 +48,7 @@ func TestSaveAndReadKeyspace(t *testing.T) { keyspaceName: "ks1", keyspace: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, }, keyspaceWanted: nil, semiSyncAckersWanted: 1, @@ -72,12 +72,12 @@ func TestSaveAndReadKeyspace(t *testing.T) { keyspaceName: "ks4", keyspace: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, BaseKeyspace: "baseKeyspace", }, keyspaceWanted: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, }, semiSyncAckersWanted: 0, }, { @@ -120,7 +120,7 @@ func TestSaveAndReadKeyspace(t *testing.T) { return } require.NoError(t, err) - require.EqualValues(t, tt.semiSyncAckersWanted, reparentutil.SemiSyncAckers(durabilityPolicy, nil)) + require.EqualValues(t, tt.semiSyncAckersWanted, policy.SemiSyncAckers(durabilityPolicy, nil)) }) } } diff --git a/go/vt/vtorc/logic/keyspace_shard_discovery_test.go b/go/vt/vtorc/logic/keyspace_shard_discovery_test.go index 5cbe139728b..8218af45db6 100644 --- a/go/vt/vtorc/logic/keyspace_shard_discovery_test.go +++ b/go/vt/vtorc/logic/keyspace_shard_discovery_test.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topotools" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/reparentutil/reparenttestutil" "vitess.io/vitess/go/vt/vtorc/db" "vitess.io/vitess/go/vt/vtorc/inst" @@ -36,15 +37,15 @@ import ( var ( keyspaceDurabilityNone = &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, } keyspaceDurabilitySemiSync = &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, } keyspaceDurabilityTest = &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "test", + DurabilityPolicy: policy.DurabilityTest, } keyspaceSnapshot = &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_SNAPSHOT, @@ -106,7 +107,7 @@ func TestRefreshAllKeyspaces(t *testing.T) { // Set clusters to watch to watch all keyspaces clustersToWatch = nil // Change the durability policy of ks1 - reparenttestutil.SetKeyspaceDurability(ctx, t, ts, "ks1", "semi_sync") + reparenttestutil.SetKeyspaceDurability(ctx, t, ts, "ks1", policy.DurabilitySemiSync) require.NoError(t, RefreshAllKeyspacesAndShards(context.Background())) // Verify that all the keyspaces are correctly reloaded @@ -144,7 +145,7 @@ func TestRefreshKeyspace(t *testing.T) { keyspaceName: "ks1", keyspace: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "semi_sync", + DurabilityPolicy: policy.DurabilitySemiSync, }, keyspaceWanted: nil, err: "", @@ -169,12 +170,12 @@ func TestRefreshKeyspace(t *testing.T) { keyspaceName: "ks4", keyspace: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, BaseKeyspace: "baseKeyspace", }, keyspaceWanted: &topodatapb.Keyspace{ KeyspaceType: topodatapb.KeyspaceType_NORMAL, - DurabilityPolicy: "none", + DurabilityPolicy: policy.DurabilityNone, }, err: "", }, { diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index f14eca624c9..0d0bbff5b53 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -29,6 +29,7 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/inst" "vitess.io/vitess/go/vt/vtorc/util" @@ -739,7 +740,7 @@ func fixPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r return false, topologyRecovery, err } - if err := tabletUndoDemotePrimary(ctx, analyzedTablet, reparentutil.SemiSyncAckers(durabilityPolicy, analyzedTablet) > 0); err != nil { + if err := tabletUndoDemotePrimary(ctx, analyzedTablet, policy.SemiSyncAckers(durabilityPolicy, analyzedTablet) > 0); err != nil { return true, topologyRecovery, err } return true, topologyRecovery, nil @@ -782,7 +783,7 @@ func fixReplica(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r return true, topologyRecovery, err } - err = setReplicationSource(ctx, analyzedTablet, primaryTablet, reparentutil.IsReplicaSemiSync(durabilityPolicy, primaryTablet, analyzedTablet), float64(analysisEntry.ReplicaNetTimeout)/2) + err = setReplicationSource(ctx, analyzedTablet, primaryTablet, policy.IsReplicaSemiSync(durabilityPolicy, primaryTablet, analyzedTablet), float64(analysisEntry.ReplicaNetTimeout)/2) return true, topologyRecovery, err } @@ -817,6 +818,6 @@ func recoverErrantGTIDDetected(ctx context.Context, analysisEntry *inst.Replicat return false, topologyRecovery, err } - err = changeTabletType(ctx, analyzedTablet, topodatapb.TabletType_DRAINED, reparentutil.IsReplicaSemiSync(durabilityPolicy, primaryTablet, analyzedTablet)) + err = changeTabletType(ctx, analyzedTablet, topodatapb.TabletType_DRAINED, policy.IsReplicaSemiSync(durabilityPolicy, primaryTablet, analyzedTablet)) return true, topologyRecovery, err } diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 22fe72716dd..9f906317edf 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -22,7 +22,7 @@ import ( "time" "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl" @@ -136,12 +136,12 @@ func (tm *TabletManager) Backup(ctx context.Context, logger logutil.Logger, req l.Errorf("Failed to get durability policy, error: %v", err) return } - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { l.Errorf("Failed to get durability with name %v, error: %v", durabilityName, err) } - isSemiSync := reparentutil.IsReplicaSemiSync(durability, shardPrimary.Tablet, tabletInfo.Tablet) + isSemiSync := policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, tabletInfo.Tablet) semiSyncAction, err := tm.convertBoolToSemiSyncAction(bgCtx, isSemiSync) if err != nil { l.Errorf("Failed to convert bool to semisync action, error: %v", err) diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 84150c82be8..fbef04de357 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -70,7 +70,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" @@ -1011,7 +1011,7 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t return "", vterrors.Wrapf(err, "cannot read keyspace durability policy %v", tablet.Keyspace) } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return "", vterrors.Wrapf(err, "cannot get durability policy %v", durabilityName) } @@ -1020,7 +1020,7 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t tablet.Type = tabletType - semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, reparentutil.IsReplicaSemiSync(durability, currentPrimary.Tablet, tablet)) + semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, policy.IsReplicaSemiSync(durability, currentPrimary.Tablet, tablet)) if err != nil { return "", err } diff --git a/go/vt/wrangler/reparent.go b/go/vt/wrangler/reparent.go index 1a3a45cf99b..e17f56de11f 100644 --- a/go/vt/wrangler/reparent.go +++ b/go/vt/wrangler/reparent.go @@ -31,6 +31,7 @@ import ( "vitess.io/vitess/go/vt/topotools/events" "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -131,7 +132,7 @@ func (wr *Wrangler) TabletExternallyReparented(ctx context.Context, newPrimaryAl return err } log.Infof("Getting a new durability policy for %v", durabilityName) - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return err } @@ -152,7 +153,7 @@ func (wr *Wrangler) TabletExternallyReparented(ctx context.Context, newPrimaryAl }() event.DispatchUpdate(ev, "starting external reparent") - if err := wr.tmc.ChangeType(ctx, tablet, topodatapb.TabletType_PRIMARY, reparentutil.SemiSyncAckers(durability, tablet) > 0); err != nil { + if err := wr.tmc.ChangeType(ctx, tablet, topodatapb.TabletType_PRIMARY, policy.SemiSyncAckers(durability, tablet) > 0); err != nil { log.Warningf("Error calling ChangeType on new primary %v: %v", topoproto.TabletAliasString(newPrimaryAlias), err) return err } diff --git a/go/vt/wrangler/tablet.go b/go/vt/wrangler/tablet.go index fdc6f9a92ac..31a5a7936ad 100644 --- a/go/vt/wrangler/tablet.go +++ b/go/vt/wrangler/tablet.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -141,12 +142,12 @@ func (wr *Wrangler) shouldSendSemiSyncAck(ctx context.Context, tablet *topodatap if err != nil { return false, err } - durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + durability, err := policy.GetDurabilityPolicy(durabilityName) if err != nil { return false, err } - return reparentutil.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet), nil + return policy.IsReplicaSemiSync(durability, shardPrimary.Tablet, tablet), nil } func (wr *Wrangler) getShardPrimaryForTablet(ctx context.Context, tablet *topodatapb.Tablet) (*topo.TabletInfo, error) { diff --git a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go index 3167be5e512..984ff93095e 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -33,6 +33,7 @@ import ( "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/reparentutil/reparenttestutil" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vttablet/tmclient" @@ -60,7 +61,7 @@ func TestEmergencyReparentShard(t *testing.T) { newPrimary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, nil) goodReplica1 := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) goodReplica2 := NewFakeTablet(t, wr, "cell2", 3, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) oldPrimary.FakeMysqlDaemon.Replicating = false oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ @@ -211,7 +212,7 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { oldPrimary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, nil) newPrimary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, nil) moreAdvancedReplica := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // new primary newPrimary.FakeMysqlDaemon.Replicating = true diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 1894c6bb4eb..f160ddfa32b 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -24,6 +24,7 @@ import ( "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/vt/mysqlctl" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtenv" "github.com/stretchr/testify/assert" @@ -60,7 +61,7 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { oldPrimary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, nil) newPrimary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, nil) goodReplica1 := NewFakeTablet(t, wr, "cell2", 2, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // new primary newPrimary.FakeMysqlDaemon.ReadOnly = true @@ -177,7 +178,7 @@ func TestPlannedReparentShardNoError(t *testing.T) { newPrimary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, nil) goodReplica1 := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) goodReplica2 := NewFakeTablet(t, wr, "cell2", 3, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // new primary newPrimary.FakeMysqlDaemon.ReadOnly = true @@ -312,7 +313,7 @@ func TestPlannedReparentInitialization(t *testing.T) { newPrimary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, nil) goodReplica1 := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) goodReplica2 := NewFakeTablet(t, wr, "cell2", 3, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // new primary newPrimary.FakeMysqlDaemon.ReadOnly = true @@ -691,7 +692,7 @@ func TestPlannedReparentShardRelayLogErrorStartReplication(t *testing.T) { // Create a primary, a couple good replicas primary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, nil) goodReplica1 := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // old primary primary.FakeMysqlDaemon.ReadOnly = false diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index b199a64340a..7012822a017 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -31,6 +31,7 @@ import ( "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/reparentutil" + "vitess.io/vitess/go/vt/vtctl/reparentutil/policy" "vitess.io/vitess/go/vt/vtctl/reparentutil/reparenttestutil" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vttablet/tmclient" @@ -141,7 +142,7 @@ func TestReparentTablet(t *testing.T) { } primary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_PRIMARY, nil) replica := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // mark the primary inside the shard if _, err := ts.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { @@ -197,7 +198,7 @@ func TestSetReplicationSource(t *testing.T) { require.NoError(t, err, "CreateShard failed") primary := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_PRIMARY, nil) - reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") + reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", policy.DurabilitySemiSync) // mark the primary inside the shard _, err = ts.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { From 8ba7607230f7de31ff142c4aa16cad8ce80da00b Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 6 Jan 2025 13:05:28 +0530 Subject: [PATCH 03/66] vexplain to protect the log fields from concurrent writes (#17460) Signed-off-by: Harshit Gangal --- go/vt/vtgate/executorcontext/vcursor_impl.go | 31 +++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/go/vt/vtgate/executorcontext/vcursor_impl.go b/go/vt/vtgate/executorcontext/vcursor_impl.go index 40317f5103a..df989fd7a67 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl.go @@ -22,6 +22,7 @@ import ( "io" "sort" "strings" + "sync" "sync/atomic" "time" @@ -154,6 +155,8 @@ type ( observer ResultsObserver + // this protects the interOpStats and shardsStats fields from concurrent writes + mu sync.Mutex // this is a map of the number of rows that every primitive has returned // if this field is nil, it means that we are not logging operator traffic interOpStats map[engine.Primitive]engine.RowsReceived @@ -642,21 +645,29 @@ func (vc *VCursorImpl) ExecutePrimitive(ctx context.Context, primitive engine.Pr } func (vc *VCursorImpl) logOpTraffic(primitive engine.Primitive, res *sqltypes.Result) { - if vc.interOpStats != nil { - rows := vc.interOpStats[primitive] - if res == nil { - rows = append(rows, 0) - } else { - rows = append(rows, len(res.Rows)) - } - vc.interOpStats[primitive] = rows + if vc.interOpStats == nil { + return + } + + vc.mu.Lock() + defer vc.mu.Unlock() + + rows := vc.interOpStats[primitive] + if res == nil { + rows = append(rows, 0) + } else { + rows = append(rows, len(res.Rows)) } + vc.interOpStats[primitive] = rows } func (vc *VCursorImpl) logShardsQueried(primitive engine.Primitive, shardsNb int) { - if vc.shardsStats != nil { - vc.shardsStats[primitive] += engine.ShardsQueried(shardsNb) + if vc.shardsStats == nil { + return } + vc.mu.Lock() + defer vc.mu.Unlock() + vc.shardsStats[primitive] += engine.ShardsQueried(shardsNb) } func (vc *VCursorImpl) ExecutePrimitiveStandalone(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { From 549a8c483b2e9a7fa5a5871e904f87ece20c3211 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 6 Jan 2025 16:09:50 +0530 Subject: [PATCH 04/66] Change keys of the discovery flags such that they conform to the convention (#17430) Signed-off-by: Manan Gupta --- changelog/22.0/22.0.0/summary.md | 14 ++++ go/test/endtoend/cluster/vtgate_process.go | 6 +- go/test/endtoend/vtgate/misc_test.go | 75 ++++++++++++++++++++++ go/vt/discovery/replicationlag.go | 9 ++- 4 files changed, 98 insertions(+), 6 deletions(-) diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index 3f63b2d868f..a54a7a4a9ae 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -8,6 +8,7 @@ - **[RPC Changes](#rpc-changes)** - **[Prefer not promoting a replica that is currently taking a backup](#reparents-prefer-not-backing-up)** - **[VTOrc Config File Changes](#vtorc-config-file-changes)** + - **[VTGate Config File Changes](#vtgate-config-file-changes)** - **[Support for More Efficient JSON Replication](#efficient-json-replication)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** @@ -60,6 +61,19 @@ The following fields can be dynamically changed - To upgrade to the newer version of the configuration file, first switch to using the flags in your current deployment before upgrading. Then you can switch to using the configuration file in the newer release. +### VTGate Config File Changes + +The Viper configuration keys for the following flags has been changed to match their flag names. Previously they had a discovery prefix instead of it being part of the name. + +| Flag Name | Old Configuration Key | New Configuration Key | +|--------------------------------------------------|--------------------------------------------------|--------------------------------------------------| +| `discovery_low_replication_lag` | `discovery.low_replication_lag` | `discovery_low_replication_lag` | +| `discovery_high_replication_lag_minimum_serving` | `discovery.high_replication_lag_minimum_serving` | `discovery_high_replication_lag_minimum_serving` | +| `discovery_min_number_serving_vttablets` | `discovery.min_number_serving_vttablets` | `discovery_min_number_serving_vttablets` | +| `discovery_legacy_replication_lag_algorithm` | `discovery.legacy_replication_lag_algorithm` | `discovery_legacy_replication_lag_algorithm` | + +To upgrade to the newer version of the configuration keys, first switch to using the flags in your current deployment before upgrading. Then you can switch to using the new configuration keys in the newer release. + ### Support for More Efficient JSON Replication In [#7345](https://github.com/vitessio/vitess/pull/17345) we added support for [`--binlog-row-value-options=PARTIAL_JSON`](https://dev.mysql.com/doc/refman/en/replication-options-binary-log.html#sysvar_binlog_row_value_options). You can read more about [this feature added to MySQL 8.0 here](https://dev.mysql.com/blog-archive/efficient-json-replication-in-mysql-8-0/). diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index 4253fbb5860..2adbdf13250 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -70,7 +70,11 @@ type VtgateProcess struct { } type VTGateConfiguration struct { - TransactionMode string `json:"transaction_mode,omitempty"` + TransactionMode string `json:"transaction_mode,omitempty"` + DiscoveryLowReplicationLag string `json:"discovery_low_replication_lag,omitempty"` + DiscoveryHighReplicationLag string `json:"discovery_high_replication_lag,omitempty"` + DiscoveryMinServingVttablets string `json:"discovery_min_number_serving_vttablets,omitempty"` + DiscoveryLegacyReplicationLagAlgo string `json:"discovery_legacy_replication_lag_algorithm"` } // ToJSONString will marshal this configuration as JSON diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index bbcb338fa50..55fa139b290 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -814,6 +814,81 @@ func TestDDLTargeted(t *testing.T) { utils.AssertMatches(t, conn, `select id from ddl_targeted`, `[[INT64(1)]]`) } +// TestDynamicConfig tests the dynamic configurations. +func TestDynamicConfig(t *testing.T) { + t.Run("DiscoveryLowReplicationLag", func(t *testing.T) { + // Test initial config value + err := clusterInstance.VtgateProcess.WaitForConfig(`"discovery_low_replication_lag":30000000000`) + require.NoError(t, err) + defer func() { + // Restore default back. + clusterInstance.VtgateProcess.Config.DiscoveryLowReplicationLag = "30s" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + }() + clusterInstance.VtgateProcess.Config.DiscoveryLowReplicationLag = "15s" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + // Test final config value. + err = clusterInstance.VtgateProcess.WaitForConfig(`"discovery_low_replication_lag":"15s"`) + require.NoError(t, err) + }) + + t.Run("DiscoveryHighReplicationLag", func(t *testing.T) { + // Test initial config value + err := clusterInstance.VtgateProcess.WaitForConfig(`"discovery_high_replication_lag":7200000000000`) + require.NoError(t, err) + defer func() { + // Restore default back. + clusterInstance.VtgateProcess.Config.DiscoveryHighReplicationLag = "2h" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + }() + clusterInstance.VtgateProcess.Config.DiscoveryHighReplicationLag = "1h" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + // Test final config value. + err = clusterInstance.VtgateProcess.WaitForConfig(`"discovery_high_replication_lag":"1h"`) + require.NoError(t, err) + }) + + t.Run("DiscoveryMinServingVttablets", func(t *testing.T) { + // Test initial config value + err := clusterInstance.VtgateProcess.WaitForConfig(`"discovery_min_number_serving_vttablets":2`) + require.NoError(t, err) + defer func() { + // Restore default back. + clusterInstance.VtgateProcess.Config.DiscoveryMinServingVttablets = "2" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + }() + clusterInstance.VtgateProcess.Config.DiscoveryMinServingVttablets = "1" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + // Test final config value. + err = clusterInstance.VtgateProcess.WaitForConfig(`"discovery_min_number_serving_vttablets":"1"`) + require.NoError(t, err) + }) + + t.Run("DiscoveryLegacyReplicationLagAlgo", func(t *testing.T) { + // Test initial config value + err := clusterInstance.VtgateProcess.WaitForConfig(`"discovery_legacy_replication_lag_algorithm":""`) + require.NoError(t, err) + defer func() { + // Restore default back. + clusterInstance.VtgateProcess.Config.DiscoveryLegacyReplicationLagAlgo = "true" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + }() + clusterInstance.VtgateProcess.Config.DiscoveryLegacyReplicationLagAlgo = "false" + err = clusterInstance.VtgateProcess.RewriteConfiguration() + require.NoError(t, err) + // Test final config value. + err = clusterInstance.VtgateProcess.WaitForConfig(`"discovery_legacy_replication_lag_algorithm":"false"`) + require.NoError(t, err) + }) +} + func TestLookupErrorMetric(t *testing.T) { conn, closer := start(t) defer closer() diff --git a/go/vt/discovery/replicationlag.go b/go/vt/discovery/replicationlag.go index 9592440196a..7814be8ca83 100644 --- a/go/vt/discovery/replicationlag.go +++ b/go/vt/discovery/replicationlag.go @@ -28,10 +28,9 @@ import ( ) var ( - configKey = viperutil.KeyPrefixFunc("discovery") // lowReplicationLag defines the duration that replication lag is low enough that the VTTablet is considered healthy. lowReplicationLag = viperutil.Configure( - configKey("low_replication_lag"), + "discovery_low_replication_lag", viperutil.Options[time.Duration]{ FlagName: "discovery_low_replication_lag", Default: 30 * time.Second, @@ -39,7 +38,7 @@ var ( }, ) highReplicationLagMinServing = viperutil.Configure( - configKey("high_replication_lag"), + "discovery_high_replication_lag", viperutil.Options[time.Duration]{ FlagName: "discovery_high_replication_lag_minimum_serving", Default: 2 * time.Hour, @@ -47,7 +46,7 @@ var ( }, ) minNumTablets = viperutil.Configure( - configKey("min_number_serving_vttablets"), + "discovery_min_number_serving_vttablets", viperutil.Options[int]{ FlagName: "min_number_serving_vttablets", Default: 2, @@ -55,7 +54,7 @@ var ( }, ) legacyReplicationLagAlgorithm = viperutil.Configure( - configKey("legacy_replication_lag_algorithm"), + "discovery_legacy_replication_lag_algorithm", viperutil.Options[bool]{ FlagName: "legacy_replication_lag_algorithm", Default: true, From 69e02247bdf01f5ce4026b76ac1c71b44c8d9170 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:54:35 +0100 Subject: [PATCH 05/66] Add missing tables to globally routed list in schema tracker only if they are not already present in a VSchema (#17371) Signed-off-by: Rohit Nayak Signed-off-by: Manan Gupta Signed-off-by: Harshit Gangal Co-authored-by: Manan Gupta Co-authored-by: Harshit Gangal --- .../vreplication/global_routing_test.go | 296 +++++++++++ go/test/endtoend/vtgate/gen4/main_test.go | 15 + .../vtgate/gen4/unsharded2_schema.sql | 13 + go/vt/vtgate/vindexes/vschema.go | 37 +- go/vt/vtgate/vindexes/vschema_routing_test.go | 500 ++++++++++++++++++ go/vt/vtgate/vindexes/vschema_test.go | 151 ------ go/vt/vtgate/vschema_manager.go | 4 + test/config.json | 9 + 8 files changed, 872 insertions(+), 153 deletions(-) create mode 100644 go/test/endtoend/vreplication/global_routing_test.go create mode 100644 go/test/endtoend/vtgate/gen4/unsharded2_schema.sql create mode 100644 go/vt/vtgate/vindexes/vschema_routing_test.go diff --git a/go/test/endtoend/vreplication/global_routing_test.go b/go/test/endtoend/vreplication/global_routing_test.go new file mode 100644 index 00000000000..667c6352e2e --- /dev/null +++ b/go/test/endtoend/vreplication/global_routing_test.go @@ -0,0 +1,296 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package vreplication + +import ( + "bytes" + "fmt" + "strings" + "testing" + "text/template" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" + vttablet "vitess.io/vitess/go/vt/vttablet/common" +) + +type tgrTestConfig struct { + ksU1, ksU2, ksS1 string + ksU1Tables, ksU2Tables, ksS1Tables []string +} + +var grTestConfig = tgrTestConfig{ + ksU1: "unsharded1", + ksU2: "unsharded2", + ksS1: "sharded1", + ksU1Tables: []string{"t1", "t2", "t3"}, + ksU2Tables: []string{"t2", "t4", "t5"}, + ksS1Tables: []string{"t2", "t4", "t6"}, +} + +type grTestExpectations struct { + postKsU1, postKsU2, postKsS1 func(t *testing.T) +} + +// Scope helpers to this test file so we don't pollute the global namespace. +type grHelpers struct { + t *testing.T +} + +func (h *grHelpers) getSchema(tables []string) string { + var createSQL string + for _, table := range tables { + createSQL += fmt.Sprintf("CREATE TABLE %s (id int primary key, val varchar(32)) ENGINE=InnoDB;\n", table) + } + return createSQL +} + +func (h *grHelpers) getShardedVSchema(tables []string) string { + const vSchemaTmpl = `{ + "sharded": true, + "vindexes": { + "reverse_bits": { + "type": "reverse_bits" + } + }, + "tables": { + {{- range $i, $table := .Tables}} + {{- if gt $i 0}},{{end}} + "{{ $table }}": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + } + {{- end}} + } +} +` + type VSchemaData struct { + Tables []string + } + tmpl, err := template.New("vschema").Parse(vSchemaTmpl) + require.NoError(h.t, err) + var buf bytes.Buffer + err = tmpl.Execute(&buf, VSchemaData{tables}) + require.NoError(h.t, err) + return buf.String() +} + +func (h *grHelpers) insertData(t *testing.T, keyspace string, table string, id int, val string) { + vtgateConn, cancel := getVTGateConn() + defer cancel() + _, err := vtgateConn.ExecuteFetch(fmt.Sprintf("insert into %s.%s(id, val) values(%d, '%s')", + keyspace, table, id, val), 1, false) + require.NoError(t, err) +} + +// There is a race between when a table is created and it is updated in the global table cache in vtgate. +// This function waits for the table to be available in vtgate before proceeding. +func (h *grHelpers) waitForTableAvailability(t *testing.T, vtgateConn *mysql.Conn, table string) { + timer := time.NewTimer(defaultTimeout) + defer timer.Stop() + for { + _, err := vtgateConn.ExecuteFetch(fmt.Sprintf("select * from %s", table), 1, false) + if err == nil || !strings.Contains(err.Error(), fmt.Sprintf("table %s not found", table)) { + return + } + select { + case <-timer.C: + require.FailNow(t, "timed out waiting for table availability for %s", table) + default: + time.Sleep(defaultTick) + } + } +} + +// Check for the expected global routing behavior for the given tables. Expected logic is implemented in the callback. +func (h *grHelpers) checkForTable( + t *testing.T, + tables []string, + queryCallback func(rs *sqltypes.Result, err error), +) { + vtgateConn, cancel := getVTGateConn() + defer cancel() + + for _, table := range tables { + for _, target := range []string{"", "@primary"} { + _, err := vtgateConn.ExecuteFetch(fmt.Sprintf("use %s", target), 1, false) + require.NoError(t, err) + h.waitForTableAvailability(t, vtgateConn, table) + rs, err := vtgateConn.ExecuteFetch(fmt.Sprintf("select * from %s", table), 1, false) + queryCallback(rs, err) + } + } +} + +func (h *grHelpers) isGlobal(t *testing.T, tables []string, expectedVal string) bool { + asExpected := true + + h.checkForTable(t, tables, func(rs *sqltypes.Result, err error) { + require.NoError(t, err) + gotVal := rs.Rows[0][1].ToString() + if gotVal != expectedVal { + asExpected = false + } + }) + + return asExpected +} + +func (h *grHelpers) isAmbiguous(t *testing.T, tables []string) bool { + asExpected := true + + h.checkForTable(t, tables, func(rs *sqltypes.Result, err error) { + if err == nil || !strings.Contains(err.Error(), "ambiguous") { + asExpected = false + } + }) + + return asExpected +} + +// getExpectations returns a map of expectations for global routing tests. The key is a boolean indicating whether +// the unsharded keyspace has a vschema. The value is a struct containing callbacks for verifying the global routing +// behavior after each keyspace is added. +func (h *grHelpers) getExpectations() *map[bool]*grTestExpectations { + var exp = make(map[bool]*grTestExpectations) + exp[false] = &grTestExpectations{ + postKsU1: func(t *testing.T) { + require.True(t, h.isGlobal(t, []string{"t1", "t2", "t3"}, grTestConfig.ksU1)) + }, + postKsU2: func(t *testing.T) { + require.True(t, h.isGlobal(t, []string{"t1", "t3"}, grTestConfig.ksU1)) + require.True(t, h.isGlobal(t, []string{"t4", "t5"}, grTestConfig.ksU2)) + require.True(t, h.isAmbiguous(t, []string{"t2"})) + }, + postKsS1: func(t *testing.T) { + require.True(t, h.isGlobal(t, []string{"t2", "t4"}, grTestConfig.ksS1)) + require.True(t, h.isGlobal(t, []string{"t1", "t3"}, grTestConfig.ksU1)) + require.True(t, h.isGlobal(t, []string{"t5"}, grTestConfig.ksU2)) + require.True(t, h.isGlobal(t, []string{"t6"}, grTestConfig.ksS1)) + }, + } + exp[true] = &grTestExpectations{ + postKsU1: func(t *testing.T) { + require.True(t, h.isGlobal(t, []string{"t1", "t2", "t3"}, grTestConfig.ksU1)) + }, + postKsU2: func(t *testing.T) { + require.True(t, h.isGlobal(t, []string{"t1", "t3"}, grTestConfig.ksU1)) + require.True(t, h.isGlobal(t, []string{"t4", "t5"}, grTestConfig.ksU2)) + require.True(t, h.isAmbiguous(t, []string{"t2"})) + }, + postKsS1: func(t *testing.T) { + require.True(t, h.isAmbiguous(t, []string{"t2", "t4"})) + require.True(t, h.isGlobal(t, []string{"t1", "t3"}, grTestConfig.ksU1)) + require.True(t, h.isGlobal(t, []string{"t5"}, grTestConfig.ksU2)) + }, + } + return &exp +} + +func (h *grHelpers) getUnshardedVschema(unshardedHasVSchema bool, tables []string) string { + if !unshardedHasVSchema { + return "" + } + vschema := `{"tables": {` + for i, table := range tables { + if i != 0 { + vschema += `,` + } + vschema += fmt.Sprintf(`"%s": {}`, table) + } + vschema += `}}` + return vschema +} + +func (h *grHelpers) rebuildGraphs(t *testing.T, keyspaces []string) { + var err error + for _, ks := range keyspaces { + err = vc.VtctldClient.ExecuteCommand("RebuildKeyspaceGraph", ks) + require.NoError(t, err) + } + require.NoError(t, err) + err = vc.VtctldClient.ExecuteCommand("RebuildVSchemaGraph") + require.NoError(t, err) +} + +// TestGlobalRouting tests global routing for unsharded and sharded keyspaces by setting up keyspaces +// with different table configurations and verifying that the tables are globally routed +// by querying via vtgate. +func TestGlobalRouting(t *testing.T) { + h := grHelpers{t} + exp := *h.getExpectations() + for unshardedHasVSchema, funcs := range exp { + require.NotNil(t, funcs) + testGlobalRouting(t, unshardedHasVSchema, funcs) + } +} + +func testGlobalRouting(t *testing.T, unshardedHasVSchema bool, funcs *grTestExpectations) { + h := grHelpers{t: t} + setSidecarDBName("_vt") + vttablet.InitVReplicationConfigDefaults() + + vc = NewVitessCluster(t, nil) + defer vc.TearDown() + zone1 := vc.Cells["zone1"] + config := grTestConfig + vc.AddKeyspace(t, []*Cell{zone1}, config.ksU1, "0", h.getUnshardedVschema(unshardedHasVSchema, config.ksU1Tables), + h.getSchema(config.ksU1Tables), 1, 0, 100, nil) + verifyClusterHealth(t, vc) + for _, table := range config.ksU1Tables { + h.insertData(t, config.ksU1, table, 1, config.ksU1) + vtgateConn, cancel := getVTGateConn() + waitForRowCount(t, vtgateConn, config.ksU1+"@replica", table, 1) + cancel() + } + keyspaces := []string{config.ksU1} + h.rebuildGraphs(t, keyspaces) + funcs.postKsU1(t) + + vc.AddKeyspace(t, []*Cell{zone1}, config.ksU2, "0", h.getUnshardedVschema(unshardedHasVSchema, config.ksU2Tables), + h.getSchema(config.ksU2Tables), 1, 0, 200, nil) + verifyClusterHealth(t, vc) + for _, table := range config.ksU2Tables { + h.insertData(t, config.ksU2, table, 1, config.ksU2) + vtgateConn, cancel := getVTGateConn() + waitForRowCount(t, vtgateConn, config.ksU2+"@replica", table, 1) + cancel() + } + keyspaces = append(keyspaces, config.ksU2) + h.rebuildGraphs(t, keyspaces) + funcs.postKsU2(t) + + vc.AddKeyspace(t, []*Cell{zone1}, config.ksS1, "-80,80-", h.getShardedVSchema(config.ksS1Tables), h.getSchema(config.ksS1Tables), + 1, 0, 300, nil) + verifyClusterHealth(t, vc) + for _, table := range config.ksS1Tables { + h.insertData(t, config.ksS1, table, 1, config.ksS1) + vtgateConn, cancel := getVTGateConn() + waitForRowCount(t, vtgateConn, config.ksS1+"@replica", table, 1) + cancel() + } + keyspaces = append(keyspaces, config.ksS1) + h.rebuildGraphs(t, keyspaces) + funcs.postKsS1(t) +} diff --git a/go/test/endtoend/vtgate/gen4/main_test.go b/go/test/endtoend/vtgate/gen4/main_test.go index e8280b3aa06..4012017b0c3 100644 --- a/go/test/endtoend/vtgate/gen4/main_test.go +++ b/go/test/endtoend/vtgate/gen4/main_test.go @@ -61,6 +61,10 @@ var ( } ]} ` + unsharded2Ks = "uks2" + + //go:embed unsharded2_schema.sql + unsharded2SchemaSQL string ) func TestMain(m *testing.M) { @@ -100,6 +104,17 @@ func TestMain(m *testing.M) { return 1 } + // This keyspace is used to test automatic addition of tables to global routing rules when + // there are multiple unsharded keyspaces. + uKs2 := &cluster.Keyspace{ + Name: unsharded2Ks, + SchemaSQL: unsharded2SchemaSQL, + } + err = clusterInstance.StartUnshardedKeyspace(*uKs2, 0, false) + if err != nil { + return 1 + } + // apply routing rules err = clusterInstance.VtctldClientProcess.ApplyRoutingRules(routingRules) if err != nil { diff --git a/go/test/endtoend/vtgate/gen4/unsharded2_schema.sql b/go/test/endtoend/vtgate/gen4/unsharded2_schema.sql new file mode 100644 index 00000000000..c3df5bd0a56 --- /dev/null +++ b/go/test/endtoend/vtgate/gen4/unsharded2_schema.sql @@ -0,0 +1,13 @@ +create table u2_a +( + id bigint, + a bigint, + primary key (id) +) Engine = InnoDB; + +create table u2_b +( + id bigint, + b varchar(50), + primary key (id) +) Engine = InnoDB; diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 3852bbfcde3..278dd6932ae 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -25,10 +25,9 @@ import ( "strings" "time" - "vitess.io/vitess/go/ptr" - "vitess.io/vitess/go/json2" "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" @@ -473,6 +472,40 @@ func buildGlobalTables(source *vschemapb.SrvVSchema, vschema *VSchema) { } } +// AddAdditionalGlobalTables adds unique tables from unsharded keyspaces to the global tables. +// It is expected to be called from the schema tracking code. Note that this is called after `BuildVSchema` +// which means that the global tables are already populated with the tables from the sharded keyspaces and from +// unsharded keyspaces which have tables specified in associated vschemas. +func AddAdditionalGlobalTables(source *vschemapb.SrvVSchema, vschema *VSchema) { + newTables := make(map[string]*Table) + + // Collect valid uniquely named tables from unsharded keyspaces. + for ksname, ks := range source.Keyspaces { + ksvschema := vschema.Keyspaces[ksname] + // Ignore sharded keyspaces and those flagged for explicit routing. + if ks.RequireExplicitRouting || ks.Sharded { + continue + } + for tname, table := range ksvschema.Tables { + // Ignore tables already global (i.e. if specified in the vschema of an unsharded keyspace) or ambiguous. + if _, found := vschema.globalTables[tname]; !found { + _, ok := newTables[tname] + if !ok { + table.Keyspace = ksvschema.Keyspace + newTables[tname] = table + } else { + newTables[tname] = nil + } + } + } + } + + // Mark new tables found just once as globally routable, rest as ambiguous. + for k, v := range newTables { + vschema.globalTables[k] = v + } +} + func buildKeyspaceGlobalTables(vschema *VSchema, ksvschema *KeyspaceSchema) { for tname, t := range ksvschema.Tables { if gt, ok := vschema.globalTables[tname]; ok { diff --git a/go/vt/vtgate/vindexes/vschema_routing_test.go b/go/vt/vtgate/vindexes/vschema_routing_test.go new file mode 100644 index 00000000000..48ac9239fbb --- /dev/null +++ b/go/vt/vtgate/vindexes/vschema_routing_test.go @@ -0,0 +1,500 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package vindexes + +import ( + "encoding/json" + "errors" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + "vitess.io/vitess/go/vt/sqlparser" +) + +// TestAutoGlobalRoutingExtended tests the global routing of tables across various keyspace configurations, +// including unsharded and sharded keyspaces, with and without the RequireExplicitRouting flag. +func TestAutoGlobalRoutingExtended(t *testing.T) { + isTableGloballyRoutable := func(vschema *VSchema, tableName string) (isGlobal, isAmbiguous bool) { + table, err := vschema.FindTable("", tableName) + if err != nil { + if strings.Contains(err.Error(), "ambiguous") { + return false, true + } + return false, false + } + return table != nil, false + } + type testKeySpace struct { + name string + ks *vschemapb.Keyspace + } + unsharded1 := &testKeySpace{ + name: "unsharded1", + ks: &vschemapb.Keyspace{ + Tables: map[string]*vschemapb.Table{ + "table1": {}, + "table2": {}, + "scommon1": {}, + "ucommon3": {}, + }, + }, + } + unsharded2 := &testKeySpace{ + name: "unsharded2", + ks: &vschemapb.Keyspace{ + Tables: map[string]*vschemapb.Table{ + "table3": {}, + "table4": {}, + "scommon1": {}, + "scommon2": {}, + "ucommon3": {}, + }, + }, + } + sharded1 := &testKeySpace{ + name: "sharded1", + ks: &vschemapb.Keyspace{ + Sharded: true, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + Tables: map[string]*vschemapb.Table{ + "table5": {}, + "scommon1": {}, + "scommon2": {}, + }, + }, + } + sharded2 := &testKeySpace{ + name: "sharded2", + ks: &vschemapb.Keyspace{ + Sharded: true, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + Tables: map[string]*vschemapb.Table{ + "table6": {}, + "scommon2": {}, + "scommon3": {}, + }, + }, + } + for _, tables := range []*vschemapb.Keyspace{sharded1.ks, sharded2.ks} { + for _, t := range tables.Tables { + t.ColumnVindexes = append(t.ColumnVindexes, &vschemapb.ColumnVindex{ + Column: "c1", + Name: "xxhash", + }) + } + } + type testCase struct { + name string + keyspaces []*testKeySpace + expGlobalTables []string + expAmbiguousTables []string + explicit []string + } + testCases := []testCase{ + { + name: "no keyspaces", + keyspaces: []*testKeySpace{}, + expGlobalTables: nil, + expAmbiguousTables: nil, + }, + { + name: "one unsharded keyspace", + keyspaces: []*testKeySpace{unsharded1}, + expGlobalTables: []string{"table1", "table2", "scommon1", "ucommon3"}, + expAmbiguousTables: nil, + }, + { + name: "two unsharded keyspaces", + keyspaces: []*testKeySpace{unsharded1, unsharded2}, + expGlobalTables: []string{"table1", "table2", "table3", "table4", "scommon2"}, + expAmbiguousTables: []string{"scommon1", "ucommon3"}, + }, + { + name: "two unsharded keyspaces, one with RequireExplicitRouting", + keyspaces: []*testKeySpace{unsharded1, unsharded2}, + explicit: []string{"unsharded1"}, + expGlobalTables: []string{"table3", "table4", "scommon1", "scommon2", "ucommon3"}, + }, + { + name: "one sharded keyspace", + keyspaces: []*testKeySpace{sharded1}, + expGlobalTables: []string{"table5", "scommon1", "scommon2"}, + }, + { + name: "two sharded keyspaces", + keyspaces: []*testKeySpace{sharded1, sharded2}, + expGlobalTables: []string{"table5", "table6", "scommon1", "scommon3"}, + expAmbiguousTables: []string{"scommon2"}, + }, + { + name: "two sharded keyspaces, one with RequireExplicitRouting", + keyspaces: []*testKeySpace{sharded1, sharded2}, + explicit: []string{"sharded2"}, + expGlobalTables: []string{"table5", "scommon1", "scommon2"}, + }, + { + name: "two sharded keyspaces, both with RequireExplicitRouting", + keyspaces: []*testKeySpace{sharded1, sharded2}, + explicit: []string{"sharded1", "sharded2"}, + expGlobalTables: nil, + }, + { + name: "two sharded keyspaces, one unsharded keyspace", + keyspaces: []*testKeySpace{sharded1, sharded2, unsharded1}, + expGlobalTables: []string{"table1", "table2", "table5", "table6", "scommon3", "ucommon3"}, + expAmbiguousTables: []string{"scommon1", "scommon2"}, + }, + { + name: "two sharded keyspaces, one unsharded keyspace, one with RequireExplicitRouting", + keyspaces: []*testKeySpace{sharded1, sharded2, unsharded1, unsharded2}, + explicit: []string{"unsharded1"}, + expGlobalTables: []string{"table3", "table4", "table5", "table6", "scommon3", "ucommon3"}, + expAmbiguousTables: []string{"scommon1", "scommon2"}, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + allTables := make(map[string]bool) + source := &vschemapb.SrvVSchema{ + Keyspaces: make(map[string]*vschemapb.Keyspace), + } + for _, ks := range tc.keyspaces { + source.Keyspaces[ks.name] = ks.ks + // set it false for all keyspaces here and later override for those requested in the test case + ks.ks.RequireExplicitRouting = false + for tname := range ks.ks.Tables { + _, ok := allTables[tname] + if !ok { + allTables[tname] = true + } + } + } + for _, ksName := range tc.explicit { + source.Keyspaces[ksName].RequireExplicitRouting = true + } + vschema := BuildVSchema(source, sqlparser.NewTestParser()) + require.NotNil(t, vschema) + AddAdditionalGlobalTables(source, vschema) + + var globalTables, ambiguousTables []string + for tname := range allTables { + isGlobal, isAmbiguous := isTableGloballyRoutable(vschema, tname) + if isGlobal { + globalTables = append(globalTables, tname) + } else if isAmbiguous { + ambiguousTables = append(ambiguousTables, tname) + } + } + sort.Strings(globalTables) + sort.Strings(ambiguousTables) + sort.Strings(tc.expGlobalTables) + sort.Strings(tc.expAmbiguousTables) + require.EqualValuesf(t, tc.expGlobalTables, globalTables, "global tables mismatch") + require.EqualValuesf(t, tc.expAmbiguousTables, ambiguousTables, "ambiguous tables mismatch") + }) + } +} + +// TestAutoGlobalRouting tests adding tables in unsharded keyspaces to global routing if they don't have +// an associated VSchema which has the RequireExplicitRouting flag set. These tables should also not be +// already part of the global routing tables via the VSchema of sharded keyspaces. +func TestAutoGlobalRoutingBasic(t *testing.T) { + // Create two unsharded keyspaces and two sharded keyspaces, each with some common tables. + unsharded1 := &vschemapb.Keyspace{ + Tables: map[string]*vschemapb.Table{ + "table1": {}, // unique, should be added to global routing + "table2": {}, // unique, should be added to global routing + "scommon1": {}, // common with sharded1, should not be added to global routing because it is already global because of sharded1 + "ucommon3": {}, // common with unsharded2, should not be added to global routing because it is ambiguous because of unsharded2 + }, + } + unsharded2 := &vschemapb.Keyspace{ + Tables: map[string]*vschemapb.Table{ + "table3": {}, // unique, should be added to global routing + "table4": {}, // unique, should be added to global routing + "scommon1": {}, // common with sharded1, should not be added to global routing because it is already global because of sharded1 + "scommon2": {}, // common with sharded1, should not be added to global routing because it is already global because of sharded1 + "ucommon3": {}, // common with unsharded1, should not be added to global routing because it is ambiguous because of unsharded1 + }, + } + sharded1 := &vschemapb.Keyspace{ + Sharded: true, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + Tables: map[string]*vschemapb.Table{ + "table5": {}, // unique, should be added to global routing + "scommon1": {}, // common with unsharded1 and unsharded2, should be added to global routing because it's in the vschema + "scommon2": {}, // common with unsharded2, not ambiguous because sharded2 sets RequireExplicitRouting + }, + } + sharded2 := &vschemapb.Keyspace{ + Sharded: true, + RequireExplicitRouting: true, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + // none should be considered for choice as global or ambiguous because of RequireExplicitRouting + Tables: map[string]*vschemapb.Table{ + "table6": {}, // unique + "scommon2": {}, // common with sharded1, but has RequireExplicitRouting + "scommon3": {}, // unique + }, + } + for _, ks := range []*vschemapb.Keyspace{sharded1, sharded2} { + for _, t := range ks.Tables { + t.ColumnVindexes = append(t.ColumnVindexes, &vschemapb.ColumnVindex{ + Column: "c1", + Name: "xxhash", + }) + } + } + source := &vschemapb.SrvVSchema{ + Keyspaces: map[string]*vschemapb.Keyspace{ + "sharded1": sharded1, + "sharded2": sharded2, + }, + } + + vschema := BuildVSchema(source, sqlparser.NewTestParser()) + require.NotNil(t, vschema) + + // Check table is global + mustRouteGlobally := func(t *testing.T, tname, ksName string) { + t.Helper() + _, err := vschema.FindTable("", tname) + require.NoError(t, err) + // The vtgate data structures don't always set the keyspace name, so cannot reliably check that at the moment. + _ = ksName + } + + mustNotRouteGlobally := func(t *testing.T, tname string) { + t.Helper() + _, err := vschema.FindTable("", tname) + require.Error(t, err) + } + + // Verify the global tables + ks := vschema.Keyspaces["sharded1"] + require.EqualValues(t, vschema.globalTables, map[string]*Table{ + "table5": ks.Tables["table5"], + "scommon1": ks.Tables["scommon1"], + "scommon2": ks.Tables["scommon2"], + }) + mustRouteGlobally(t, "table5", "sharded1") + mustRouteGlobally(t, "scommon1", "sharded1") + mustRouteGlobally(t, "scommon2", "sharded1") + + // Add unsharded keyspaces to SrvVSchema and build VSchema + var err error + source.Keyspaces["unsharded1"] = unsharded1 + source.Keyspaces["unsharded2"] = unsharded2 + vschema.Keyspaces["unsharded1"], err = BuildKeyspace(unsharded1, sqlparser.NewTestParser()) + require.NoError(t, err) + vschema.Keyspaces["unsharded2"], err = BuildKeyspace(unsharded2, sqlparser.NewTestParser()) + require.NoError(t, err) + + // Verify the global tables don't change + mustRouteGlobally(t, "table5", "sharded1") + mustRouteGlobally(t, "scommon1", "sharded1") + mustRouteGlobally(t, "scommon2", "sharded1") + + // Add additional global tables and then verify that the unsharded global tables are added + AddAdditionalGlobalTables(source, vschema) + + mustRouteGlobally(t, "table1", "unsharded1") + mustRouteGlobally(t, "table2", "unsharded1") + + mustRouteGlobally(t, "table3", "unsharded2") + mustRouteGlobally(t, "table4", "unsharded2") + mustNotRouteGlobally(t, "ucommon3") + + mustRouteGlobally(t, "scommon1", "sharded1") + mustRouteGlobally(t, "scommon2", "sharded1") + mustRouteGlobally(t, "table5", "sharded1") + + mustNotRouteGlobally(t, "table6") + mustNotRouteGlobally(t, "scommon3") +} + +func TestVSchemaRoutingRules(t *testing.T) { + input := vschemapb.SrvVSchema{ + RoutingRules: &vschemapb.RoutingRules{ + Rules: []*vschemapb.RoutingRule{{ + FromTable: "rt1", + ToTables: []string{"ks1.t1", "ks2.t2"}, + }, { + FromTable: "rt2", + ToTables: []string{"ks2.t2"}, + }, { + FromTable: "escaped", + ToTables: []string{"`ks2`.`t2`"}, + }, { + FromTable: "dup", + ToTables: []string{"ks1.t1"}, + }, { + FromTable: "dup", + ToTables: []string{"ks1.t1"}, + }, { + FromTable: "badname", + ToTables: []string{"t1.t2.t3"}, + }, { + FromTable: "unqualified", + ToTables: []string{"t1"}, + }, { + FromTable: "badkeyspace", + ToTables: []string{"ks3.t1"}, + }, { + FromTable: "notfound", + ToTables: []string{"ks1.t2"}, + }}, + }, + Keyspaces: map[string]*vschemapb.Keyspace{ + "ks1": { + Sharded: true, + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Vindexes: map[string]*vschemapb.Vindex{ + "stfu1": { + Type: "stfu", + }, + }, + Tables: map[string]*vschemapb.Table{ + "t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Column: "c1", + Name: "stfu1", + }, + }, + }, + }, + }, + "ks2": { + ForeignKeyMode: vschemapb.Keyspace_managed, + Tables: map[string]*vschemapb.Table{ + "t2": {}, + }, + }, + }, + } + got := BuildVSchema(&input, sqlparser.NewTestParser()) + ks1 := &Keyspace{ + Name: "ks1", + Sharded: true, + } + ks2 := &Keyspace{ + Name: "ks2", + } + vindex1 := &stFU{ + name: "stfu1", + } + t1 := &Table{ + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: ks1, + ColumnVindexes: []*ColumnVindex{{ + Columns: []sqlparser.IdentifierCI{sqlparser.NewIdentifierCI("c1")}, + Type: "stfu", + Name: "stfu1", + Vindex: vindex1, + isUnique: vindex1.IsUnique(), + cost: vindex1.Cost(), + }}, + } + t1.Ordered = []*ColumnVindex{ + t1.ColumnVindexes[0], + } + t2 := &Table{ + Name: sqlparser.NewIdentifierCS("t2"), + Keyspace: ks2, + } + want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, + RoutingRules: map[string]*RoutingRule{ + "rt1": { + Error: errors.New("table rt1 has more than one target: [ks1.t1 ks2.t2]"), + }, + "rt2": { + Tables: []*Table{t2}, + }, + "escaped": { + Tables: []*Table{t2}, + }, + "dup": { + Error: errors.New("duplicate rule for entry dup"), + }, + "badname": { + Error: errors.New("invalid table name: 't1.t2.t3', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "unqualified": { + Error: errors.New("invalid table name: 't1', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "badkeyspace": { + Error: errors.New("VT05003: unknown database 'ks3' in vschema"), + }, + "notfound": { + Error: errors.New("table t2 not found"), + }, + }, + globalTables: map[string]*Table{ + "t1": t1, + "t2": t2, + }, + uniqueVindexes: map[string]Vindex{ + "stfu1": vindex1, + }, + Keyspaces: map[string]*KeyspaceSchema{ + "ks1": { + Keyspace: ks1, + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Tables: map[string]*Table{ + "t1": t1, + }, + Vindexes: map[string]Vindex{ + "stfu1": vindex1, + }, + }, + "ks2": { + ForeignKeyMode: vschemapb.Keyspace_managed, + Keyspace: ks2, + Tables: map[string]*Table{ + "t2": t2, + }, + Vindexes: map[string]Vindex{}, + }, + }, + } + gotb, _ := json.MarshalIndent(got, "", " ") + wantb, _ := json.MarshalIndent(want, "", " ") + assert.Equal(t, string(wantb), string(gotb), string(gotb)) +} diff --git a/go/vt/vtgate/vindexes/vschema_test.go b/go/vt/vtgate/vindexes/vschema_test.go index f9bcf43ddaa..70e70745e9b 100644 --- a/go/vt/vtgate/vindexes/vschema_test.go +++ b/go/vt/vtgate/vindexes/vschema_test.go @@ -748,157 +748,6 @@ func TestShardedVSchemaOwnerInfo(t *testing.T) { } } -func TestVSchemaRoutingRules(t *testing.T) { - input := vschemapb.SrvVSchema{ - RoutingRules: &vschemapb.RoutingRules{ - Rules: []*vschemapb.RoutingRule{{ - FromTable: "rt1", - ToTables: []string{"ks1.t1", "ks2.t2"}, - }, { - FromTable: "rt2", - ToTables: []string{"ks2.t2"}, - }, { - FromTable: "escaped", - ToTables: []string{"`ks2`.`t2`"}, - }, { - FromTable: "dup", - ToTables: []string{"ks1.t1"}, - }, { - FromTable: "dup", - ToTables: []string{"ks1.t1"}, - }, { - FromTable: "badname", - ToTables: []string{"t1.t2.t3"}, - }, { - FromTable: "unqualified", - ToTables: []string{"t1"}, - }, { - FromTable: "badkeyspace", - ToTables: []string{"ks3.t1"}, - }, { - FromTable: "notfound", - ToTables: []string{"ks1.t2"}, - }}, - }, - Keyspaces: map[string]*vschemapb.Keyspace{ - "ks1": { - Sharded: true, - ForeignKeyMode: vschemapb.Keyspace_unmanaged, - Vindexes: map[string]*vschemapb.Vindex{ - "stfu1": { - Type: "stfu", - }, - }, - Tables: map[string]*vschemapb.Table{ - "t1": { - ColumnVindexes: []*vschemapb.ColumnVindex{ - { - Column: "c1", - Name: "stfu1", - }, - }, - }, - }, - }, - "ks2": { - ForeignKeyMode: vschemapb.Keyspace_managed, - Tables: map[string]*vschemapb.Table{ - "t2": {}, - }, - }, - }, - } - got := BuildVSchema(&input, sqlparser.NewTestParser()) - ks1 := &Keyspace{ - Name: "ks1", - Sharded: true, - } - ks2 := &Keyspace{ - Name: "ks2", - } - vindex1 := &stFU{ - name: "stfu1", - } - t1 := &Table{ - Name: sqlparser.NewIdentifierCS("t1"), - Keyspace: ks1, - ColumnVindexes: []*ColumnVindex{{ - Columns: []sqlparser.IdentifierCI{sqlparser.NewIdentifierCI("c1")}, - Type: "stfu", - Name: "stfu1", - Vindex: vindex1, - isUnique: vindex1.IsUnique(), - cost: vindex1.Cost(), - }}, - } - t1.Ordered = []*ColumnVindex{ - t1.ColumnVindexes[0], - } - t2 := &Table{ - Name: sqlparser.NewIdentifierCS("t2"), - Keyspace: ks2, - } - want := &VSchema{ - MirrorRules: map[string]*MirrorRule{}, - RoutingRules: map[string]*RoutingRule{ - "rt1": { - Error: errors.New("table rt1 has more than one target: [ks1.t1 ks2.t2]"), - }, - "rt2": { - Tables: []*Table{t2}, - }, - "escaped": { - Tables: []*Table{t2}, - }, - "dup": { - Error: errors.New("duplicate rule for entry dup"), - }, - "badname": { - Error: errors.New("invalid table name: 't1.t2.t3', it must be of the qualified form . (dots are not allowed in either name)"), - }, - "unqualified": { - Error: errors.New("invalid table name: 't1', it must be of the qualified form . (dots are not allowed in either name)"), - }, - "badkeyspace": { - Error: errors.New("VT05003: unknown database 'ks3' in vschema"), - }, - "notfound": { - Error: errors.New("table t2 not found"), - }, - }, - globalTables: map[string]*Table{ - "t1": t1, - "t2": t2, - }, - uniqueVindexes: map[string]Vindex{ - "stfu1": vindex1, - }, - Keyspaces: map[string]*KeyspaceSchema{ - "ks1": { - Keyspace: ks1, - ForeignKeyMode: vschemapb.Keyspace_unmanaged, - Tables: map[string]*Table{ - "t1": t1, - }, - Vindexes: map[string]Vindex{ - "stfu1": vindex1, - }, - }, - "ks2": { - ForeignKeyMode: vschemapb.Keyspace_managed, - Keyspace: ks2, - Tables: map[string]*Table{ - "t2": t2, - }, - Vindexes: map[string]Vindex{}, - }, - }, - } - gotb, _ := json.MarshalIndent(got, "", " ") - wantb, _ := json.MarshalIndent(want, "", " ") - assert.Equal(t, string(wantb), string(gotb), string(gotb)) -} - func TestVSchemaMirrorRules(t *testing.T) { input := vschemapb.SrvVSchema{ MirrorRules: &vschemapb.MirrorRules{ diff --git a/go/vt/vtgate/vschema_manager.go b/go/vt/vtgate/vschema_manager.go index 62ea2cd3455..290971c45ed 100644 --- a/go/vt/vtgate/vschema_manager.go +++ b/go/vt/vtgate/vschema_manager.go @@ -194,6 +194,10 @@ func (vm *VSchemaManager) buildAndEnhanceVSchema(v *vschemapb.SrvVSchema) *vinde // We mark the keyspaces that have foreign key management in Vitess and have cyclic foreign keys // to have an error. This makes all queries against them to fail. markErrorIfCyclesInFk(vschema) + // Add tables from schema tracking into globally routable tables, if they are not already present. + // We need to skip if already present, to handle the case where MoveTables has switched traffic + // and removed the source vschema but not from the source database because user asked to --keep-data + vindexes.AddAdditionalGlobalTables(v, vschema) } return vschema } diff --git a/test/config.json b/test/config.json index c08097e2a99..1fe200b8dbb 100644 --- a/test/config.json +++ b/test/config.json @@ -1310,6 +1310,15 @@ "RetryMax": 1, "Tags": [] }, + "global_routing": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "TestGlobalRouting", "-timeout", "30m"], + "Command": [], + "Manual": false, + "Shard": "vreplication_v2", + "RetryMax": 1, + "Tags": [] + }, "vreplication_fk": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "TestFKWorkflow"], From 68861b13114de36dd306bc89020d1723a7f83e02 Mon Sep 17 00:00:00 2001 From: Noble Mittal <62551163+beingnoble03@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:08:00 +0530 Subject: [PATCH 06/66] VTAdmin(web): Better visualization for JSON screens (#17459) Signed-off-by: Noble Mittal --- web/vtadmin/package-lock.json | 68 ++++++++++++- web/vtadmin/package.json | 1 + .../components/jsonViewTree/JSONViewTree.tsx | 95 +++++++++++++++++++ .../components/routes/keyspace/Keyspace.tsx | 9 +- .../src/components/routes/shard/Shard.tsx | 5 +- .../src/components/routes/stream/Stream.tsx | 20 +++- .../src/components/routes/tablet/Tablet.tsx | 12 ++- .../components/routes/workflow/Workflow.tsx | 8 +- 8 files changed, 209 insertions(+), 9 deletions(-) create mode 100644 web/vtadmin/src/components/jsonViewTree/JSONViewTree.tsx diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json index 8ad7c67a5b4..5439928837c 100644 --- a/web/vtadmin/package-lock.json +++ b/web/vtadmin/package-lock.json @@ -28,6 +28,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "react-flow-renderer": "^10.3.17", + "react-json-tree": "^0.19.0", "react-query": "^3.5.9", "react-router-dom": "^5.3.4", "react-tiny-popover": "^6.0.5", @@ -4828,8 +4829,7 @@ "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", - "dev": true + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" }, "node_modules/@types/lodash-es": { "version": "4.17.12", @@ -6633,6 +6633,19 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6649,6 +6662,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -15231,6 +15254,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-base16-styling": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.10.0.tgz", + "integrity": "sha512-H1k2eFB6M45OaiRru3PBXkuCcn2qNmx+gzLb4a9IPMR7tMH8oBRXU5jGbPDYG1Hz+82d88ED0vjR8BmqU3pQdg==", + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.17.0", + "color": "^4.2.3", + "csstype": "^3.1.3", + "lodash-es": "^4.17.21" + } + }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -15288,6 +15323,20 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-json-tree": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.19.0.tgz", + "integrity": "sha512-PqT1WRVcWP+RROsZPQfNEKIC1iM/ZMfY4g5jN6oDnXp5593PPRAYgoHcgYCDjflAHQMtxl8XGdlTwIBdEGUXvw==", + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.17.0", + "react-base16-styling": "^0.10.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-query": { "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", @@ -16161,6 +16210,21 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", diff --git a/web/vtadmin/package.json b/web/vtadmin/package.json index 5d4d5dc787a..3d850fd1cc9 100644 --- a/web/vtadmin/package.json +++ b/web/vtadmin/package.json @@ -27,6 +27,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "react-flow-renderer": "^10.3.17", + "react-json-tree": "^0.19.0", "react-query": "^3.5.9", "react-router-dom": "^5.3.4", "react-tiny-popover": "^6.0.5", diff --git a/web/vtadmin/src/components/jsonViewTree/JSONViewTree.tsx b/web/vtadmin/src/components/jsonViewTree/JSONViewTree.tsx new file mode 100644 index 00000000000..af4e71db38a --- /dev/null +++ b/web/vtadmin/src/components/jsonViewTree/JSONViewTree.tsx @@ -0,0 +1,95 @@ +/** + * Copyright 2025 The Vitess Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useState } from 'react'; +import { JSONTree } from 'react-json-tree'; + +const vtAdminTheme = { + scheme: 'vtadmin', + author: 'custom', + base00: '#ffffff', + base01: '#f6f8fa', + base02: '#e6e8eb', + base03: '#8c8c8c', + base04: '#3c3c3c', + base05: '#2c2c2c', + base06: '#0057b8', + base07: '#000000', + base08: '#00875a', + base09: '#2c2c2c', + base0A: '#e44d26', + base0B: '#2c2c2c', + base0C: '#1a73e8', + base0D: '#3d5afe', + base0E: '#3cba54', + base0F: '#ff6f61', +}; + +interface JSONViewTreeProps { + data: any; +} + +const JSONViewTree: React.FC = ({ data }) => { + const [expandAll, setExpandAll] = useState(false); + const [treeKey, setTreeKey] = useState(0); + + const handleExpand = () => { + setExpandAll(true); + setTreeKey((prev) => prev + 1); + }; + + const handleCollapse = () => { + setExpandAll(false); + setTreeKey((prev) => prev + 1); + }; + + const getItemString = (type: string, data: any) => { + if (Array.isArray(data)) { + return `${type}[${data.length}]`; + } + return type; + }; + + if (!data) return null; + return ( +
+
+ + +
+ expandAll} + /> +
+ ); +}; + +export default JSONViewTree; diff --git a/web/vtadmin/src/components/routes/keyspace/Keyspace.tsx b/web/vtadmin/src/components/routes/keyspace/Keyspace.tsx index 61bf52bb189..068f9cea2cd 100644 --- a/web/vtadmin/src/components/routes/keyspace/Keyspace.tsx +++ b/web/vtadmin/src/components/routes/keyspace/Keyspace.tsx @@ -19,7 +19,6 @@ import { Link, Redirect, Route } from 'react-router-dom'; import { useKeyspace } from '../../../hooks/api'; import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; import { isReadOnlyMode } from '../../../util/env'; -import { Code } from '../../Code'; import { ContentContainer } from '../../layout/ContentContainer'; import { NavCrumbs } from '../../layout/NavCrumbs'; import { WorkspaceHeader } from '../../layout/WorkspaceHeader'; @@ -32,6 +31,8 @@ import { Advanced } from './Advanced'; import style from './Keyspace.module.scss'; import { KeyspaceShards } from './KeyspaceShards'; import { KeyspaceVSchema } from './KeyspaceVSchema'; +import JSONViewTree from '../../jsonViewTree/JSONViewTree'; +import { Code } from '../../Code'; interface RouteParams { clusterID: string; @@ -94,6 +95,7 @@ export const Keyspace = () => { + @@ -114,6 +116,11 @@ export const Keyspace = () => { + + + + + {!isReadOnlyMode() && ( diff --git a/web/vtadmin/src/components/routes/shard/Shard.tsx b/web/vtadmin/src/components/routes/shard/Shard.tsx index 686dc089d8f..8f713be9b13 100644 --- a/web/vtadmin/src/components/routes/shard/Shard.tsx +++ b/web/vtadmin/src/components/routes/shard/Shard.tsx @@ -24,12 +24,13 @@ import { WorkspaceTitle } from '../../layout/WorkspaceTitle'; import { ContentContainer } from '../../layout/ContentContainer'; import { Tab } from '../../tabs/Tab'; import { TabContainer } from '../../tabs/TabContainer'; -import { Code } from '../../Code'; import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; import { KeyspaceLink } from '../../links/KeyspaceLink'; import { useKeyspace } from '../../../hooks/api'; import { ShardTablets } from './ShardTablets'; import Advanced from './Advanced'; +import JSONViewTree from '../../jsonViewTree/JSONViewTree'; +import { Code } from '../../Code'; interface RouteParams { clusterID: string; @@ -114,6 +115,7 @@ export const Shard = () => { + @@ -123,6 +125,7 @@ export const Shard = () => { {shard && } + {shard && } diff --git a/web/vtadmin/src/components/routes/stream/Stream.tsx b/web/vtadmin/src/components/routes/stream/Stream.tsx index 45e9846315a..6143ac3e302 100644 --- a/web/vtadmin/src/components/routes/stream/Stream.tsx +++ b/web/vtadmin/src/components/routes/stream/Stream.tsx @@ -13,17 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Link, useParams } from 'react-router-dom'; +import { Link, Redirect, Route, Switch, useParams, useRouteMatch } from 'react-router-dom'; import { useWorkflow } from '../../../hooks/api'; import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; import { formatStreamKey, getStream } from '../../../util/workflows'; -import { Code } from '../../Code'; import { ContentContainer } from '../../layout/ContentContainer'; import { NavCrumbs } from '../../layout/NavCrumbs'; import { WorkspaceHeader } from '../../layout/WorkspaceHeader'; import { WorkspaceTitle } from '../../layout/WorkspaceTitle'; import style from './Stream.module.scss'; +import JSONViewTree from '../../jsonViewTree/JSONViewTree'; +import { TabContainer } from '../../tabs/TabContainer'; +import { Tab } from '../../tabs/Tab'; +import { Code } from '../../Code'; interface RouteParams { clusterID: string; @@ -36,6 +39,7 @@ interface RouteParams { export const Stream = () => { const params = useParams(); + const { path, url } = useRouteMatch(); const { data: workflow } = useWorkflow({ clusterID: params.clusterID, keyspace: params.keyspace, @@ -72,7 +76,17 @@ export const Stream = () => { - + + + + + + + {stream && } + {stream && } + + + ); diff --git a/web/vtadmin/src/components/routes/tablet/Tablet.tsx b/web/vtadmin/src/components/routes/tablet/Tablet.tsx index b0181251fd0..f4a9ca20248 100644 --- a/web/vtadmin/src/components/routes/tablet/Tablet.tsx +++ b/web/vtadmin/src/components/routes/tablet/Tablet.tsx @@ -19,7 +19,6 @@ import { useExperimentalTabletDebugVars, useTablet } from '../../../hooks/api'; import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; import { isReadOnlyMode } from '../../../util/env'; import { formatDisplayType, formatState } from '../../../util/tablets'; -import { Code } from '../../Code'; import { ContentContainer } from '../../layout/ContentContainer'; import { NavCrumbs } from '../../layout/NavCrumbs'; import { WorkspaceHeader } from '../../layout/WorkspaceHeader'; @@ -34,6 +33,8 @@ import style from './Tablet.module.scss'; import { TabletCharts } from './TabletCharts'; import { env } from '../../../util/env'; import FullStatus from './FullStatus'; +import JSONViewTree from '../../jsonViewTree/JSONViewTree'; +import { Code } from '../../Code'; interface RouteParams { alias: string; @@ -108,6 +109,7 @@ export const Tablet = () => { + @@ -128,6 +130,14 @@ export const Tablet = () => { + +
+ + + {env().VITE_ENABLE_EXPERIMENTAL_TABLET_DEBUG_VARS && } +
+
+ {tablet && } {!isReadOnlyMode() && ( diff --git a/web/vtadmin/src/components/routes/workflow/Workflow.tsx b/web/vtadmin/src/components/routes/workflow/Workflow.tsx index 939d1c6d386..7b3f0df32a5 100644 --- a/web/vtadmin/src/components/routes/workflow/Workflow.tsx +++ b/web/vtadmin/src/components/routes/workflow/Workflow.tsx @@ -30,11 +30,12 @@ import { ContentContainer } from '../../layout/ContentContainer'; import { TabContainer } from '../../tabs/TabContainer'; import { Tab } from '../../tabs/Tab'; import { getStreams } from '../../../util/workflows'; -import { Code } from '../../Code'; import { ShardLink } from '../../links/ShardLink'; import { WorkflowVDiff } from './WorkflowVDiff'; import { Select } from '../../inputs/Select'; import { formatDateTimeShort } from '../../../util/time'; +import JSONViewTree from '../../jsonViewTree/JSONViewTree'; +import { Code } from '../../Code'; interface RouteParams { clusterID: string; @@ -168,6 +169,7 @@ export const Workflow = () => { + @@ -192,6 +194,10 @@ export const Workflow = () => { + + + + From 1ce75500467e4161bbb1fb3291e8b2242f2af8e2 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 7 Jan 2025 21:25:51 +0530 Subject: [PATCH 07/66] Reference Table DML Join Fix (#17414) Signed-off-by: Harshit Gangal --- go/test/endtoend/utils/cmp.go | 12 ++ .../endtoend/vtgate/plan_tests/main_test.go | 5 +- .../vtgate/plan_tests/plan_e2e_test.go | 19 +- go/vt/sqlparser/ast_funcs.go | 19 ++ .../planbuilder/operators/cte_merging.go | 2 +- go/vt/vtgate/planbuilder/operators/delete.go | 4 +- .../planbuilder/operators/join_merging.go | 16 +- .../operators/subquery_planning.go | 2 +- .../planbuilder/operators/union_merging.go | 2 +- go/vt/vtgate/planbuilder/operators/update.go | 4 +- go/vt/vtgate/planbuilder/plan_test.go | 4 +- .../planbuilder/testdata/reference_cases.json | 173 ++++++++++++++++++ .../planbuilder/testdata/sampledata/user.sql | 11 +- .../planbuilder/testdata/schemas/main.sql | 38 +++- .../planbuilder/testdata/schemas/user.sql | 112 ++++++------ .../testdata/unsupported_cases.json | 7 +- go/vt/vtgate/semantics/analyzer.go | 2 +- go/vt/vtgate/semantics/semantic_table.go | 14 +- 18 files changed, 353 insertions(+), 93 deletions(-) diff --git a/go/test/endtoend/utils/cmp.go b/go/test/endtoend/utils/cmp.go index dd9614e79fa..3a05c75c33b 100644 --- a/go/test/endtoend/utils/cmp.go +++ b/go/test/endtoend/utils/cmp.go @@ -215,6 +215,18 @@ func (mcmp *MySQLCompare) Exec(query string) *sqltypes.Result { return vtQr } +// ExecVitessAndMySQL executes Vitess and MySQL with the queries provided. +func (mcmp *MySQLCompare) ExecVitessAndMySQL(vtQ, mQ string) *sqltypes.Result { + mcmp.t.Helper() + vtQr, err := mcmp.VtConn.ExecuteFetch(vtQ, 1000, true) + require.NoError(mcmp.t, err, "[Vitess Error] for query: "+vtQ) + + mysqlQr, err := mcmp.MySQLConn.ExecuteFetch(mQ, 1000, true) + require.NoError(mcmp.t, err, "[MySQL Error] for query: "+mQ) + compareVitessAndMySQLResults(mcmp.t, vtQ, mcmp.VtConn, vtQr, mysqlQr, CompareOptions{}) + return vtQr +} + // ExecAssert is the same as Exec, but it only does assertions, it won't FailNow func (mcmp *MySQLCompare) ExecAssert(query string) *sqltypes.Result { mcmp.t.Helper() diff --git a/go/test/endtoend/vtgate/plan_tests/main_test.go b/go/test/endtoend/vtgate/plan_tests/main_test.go index 504ec3ffb26..2dc2e70120b 100644 --- a/go/test/endtoend/vtgate/plan_tests/main_test.go +++ b/go/test/endtoend/vtgate/plan_tests/main_test.go @@ -22,6 +22,7 @@ import ( "os" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" @@ -86,7 +87,7 @@ func TestMain(m *testing.M) { // TODO: (@GuptaManan100/@systay): Also run the tests with normalizer on. clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--normalize_queries=false", - "--schema_change_signal=false", + "--schema_change_signal=true", ) // Start vtgate @@ -178,7 +179,7 @@ func verifyTestExpectations(t *testing.T, pd engine.PrimitiveDescription, test p // 1. Verify that the Join primitive sees atleast 1 row on the left side. engine.WalkPrimitiveDescription(pd, func(description engine.PrimitiveDescription) { if description.OperatorType == "Join" { - require.NotZero(t, description.Inputs[0].RowsReceived[0]) + assert.NotZero(t, description.Inputs[0].RowsReceived[0]) } }) diff --git a/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go b/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go index 5c5447fe6b6..ffe712c141c 100644 --- a/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go +++ b/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go @@ -19,11 +19,22 @@ package plan_tests import ( "testing" + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/sqlparser" ) func TestE2ECases(t *testing.T) { - e2eTestCaseFiles := []string{"select_cases.json", "filter_cases.json", "dml_cases.json"} + err := utils.WaitForAuthoritative(t, "main", "source_of_ref", clusterInstance.VtgateProcess.ReadVSchema) + require.NoError(t, err) + + e2eTestCaseFiles := []string{ + "select_cases.json", + "filter_cases.json", + "dml_cases.json", + "reference_cases.json", + } mcmp, closer := start(t) defer closer() loadSampleData(t, mcmp) @@ -34,7 +45,11 @@ func TestE2ECases(t *testing.T) { if test.SkipE2E { mcmp.AsT().Skip(test.Query) } - mcmp.Exec(test.Query) + stmt, err := sqlparser.NewTestParser().Parse(test.Query) + require.NoError(mcmp.AsT(), err) + sqlparser.RemoveKeyspaceIgnoreSysSchema(stmt) + + mcmp.ExecVitessAndMySQL(test.Query, sqlparser.String(stmt)) pd := utils.ExecTrace(mcmp.AsT(), mcmp.VtConn, test.Query) verifyTestExpectations(mcmp.AsT(), pd, test) if mcmp.VtConn.IsClosed() { diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 836c824010d..2891d532d16 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -2440,6 +2440,25 @@ func RemoveKeyspace(in SQLNode) { }) } +// RemoveKeyspaceIgnoreSysSchema removes the Qualifier.Qualifier on all ColNames and Qualifier on all TableNames in the AST +// except for the system schema. +func RemoveKeyspaceIgnoreSysSchema(in SQLNode) { + Rewrite(in, nil, func(cursor *Cursor) bool { + switch expr := cursor.Node().(type) { + case *ColName: + if expr.Qualifier.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.Qualifier.String()) { + expr.Qualifier.Qualifier = NewIdentifierCS("") + } + case TableName: + if expr.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.String()) { + expr.Qualifier = NewIdentifierCS("") + cursor.Replace(expr) + } + } + return true + }) +} + func convertStringToInt(integer string) int { val, _ := strconv.Atoi(integer) return val diff --git a/go/vt/vtgate/planbuilder/operators/cte_merging.go b/go/vt/vtgate/planbuilder/operators/cte_merging.go index cb19e06b2a7..0c1556c81e4 100644 --- a/go/vt/vtgate/planbuilder/operators/cte_merging.go +++ b/go/vt/vtgate/planbuilder/operators/cte_merging.go @@ -31,7 +31,7 @@ func tryMergeRecurse(ctx *plancontext.PlanningContext, in *RecurseCTE) (Operator } func tryMergeCTE(ctx *plancontext.PlanningContext, seed, term Operator, in *RecurseCTE) *Route { - seedRoute, termRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(seed, term) + seedRoute, termRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(ctx, seed, term) if seedRoute == nil { return nil } diff --git a/go/vt/vtgate/planbuilder/operators/delete.go b/go/vt/vtgate/planbuilder/operators/delete.go index 81e36d54315..015220470e0 100644 --- a/go/vt/vtgate/planbuilder/operators/delete.go +++ b/go/vt/vtgate/planbuilder/operators/delete.go @@ -124,7 +124,7 @@ func createDeleteWithInputOp(ctx *plancontext.PlanningContext, del *sqlparser.De } var delOps []dmlOp - for _, target := range ctx.SemTable.Targets.Constituents() { + for _, target := range ctx.SemTable.DMLTargets.Constituents() { op := createDeleteOpWithTarget(ctx, target, del.Ignore) delOps = append(delOps, op) } @@ -322,7 +322,7 @@ func updateQueryGraphWithSource(ctx *plancontext.PlanningContext, input Operator return op, NoRewrite } if len(qg.Tables) > 1 { - panic(vterrors.VT12001("DELETE on reference table with join")) + panic(vterrors.VT12001("DML on reference table with join")) } for _, tbl := range qg.Tables { if tbl.ID != tblID { diff --git a/go/vt/vtgate/planbuilder/operators/join_merging.go b/go/vt/vtgate/planbuilder/operators/join_merging.go index c035b7d11ed..cb3569cf79e 100644 --- a/go/vt/vtgate/planbuilder/operators/join_merging.go +++ b/go/vt/vtgate/planbuilder/operators/join_merging.go @@ -28,7 +28,7 @@ import ( // If they can be merged, a new operator with the merged routing is returned // If they cannot be merged, nil is returned. func (jm *joinMerger) mergeJoinInputs(ctx *plancontext.PlanningContext, lhs, rhs Operator, joinPredicates []sqlparser.Expr) *Route { - lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(lhs, rhs) + lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(ctx, lhs, rhs) if lhsRoute == nil { return nil } @@ -102,13 +102,13 @@ func mergeAnyShardRoutings(ctx *plancontext.PlanningContext, a, b *AnyShardRouti } } -func prepareInputRoutes(lhs Operator, rhs Operator) (*Route, *Route, Routing, Routing, routingType, routingType, bool) { +func prepareInputRoutes(ctx *plancontext.PlanningContext, lhs Operator, rhs Operator) (*Route, *Route, Routing, Routing, routingType, routingType, bool) { lhsRoute, rhsRoute := operatorsToRoutes(lhs, rhs) if lhsRoute == nil || rhsRoute == nil { return nil, nil, nil, nil, 0, 0, false } - lhsRoute, rhsRoute, routingA, routingB, sameKeyspace := getRoutesOrAlternates(lhsRoute, rhsRoute) + lhsRoute, rhsRoute, routingA, routingB, sameKeyspace := getRoutesOrAlternates(ctx, lhsRoute, rhsRoute) a, b := getRoutingType(routingA), getRoutingType(routingB) return lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace @@ -159,7 +159,7 @@ func (rt routingType) String() string { // getRoutesOrAlternates gets the Routings from each Route. If they are from different keyspaces, // we check if this is a table with alternates in other keyspaces that we can use -func getRoutesOrAlternates(lhsRoute, rhsRoute *Route) (*Route, *Route, Routing, Routing, bool) { +func getRoutesOrAlternates(ctx *plancontext.PlanningContext, lhsRoute, rhsRoute *Route) (*Route, *Route, Routing, Routing, bool) { routingA := lhsRoute.Routing routingB := rhsRoute.Routing sameKeyspace := routingA.Keyspace() == routingB.Keyspace() @@ -171,13 +171,17 @@ func getRoutesOrAlternates(lhsRoute, rhsRoute *Route) (*Route, *Route, Routing, return lhsRoute, rhsRoute, routingA, routingB, sameKeyspace } - if refA, ok := routingA.(*AnyShardRouting); ok { + // If we have a reference route, we will try to find an alternate route in same keyspace as other routing keyspace. + // If the reference route is part of DML table update target, alternate keyspace route cannot be considered. + if refA, ok := routingA.(*AnyShardRouting); ok && + !TableID(lhsRoute).IsOverlapping(ctx.SemTable.DMLTargets) { if altARoute := refA.AlternateInKeyspace(routingB.Keyspace()); altARoute != nil { return altARoute, rhsRoute, altARoute.Routing, routingB, true } } - if refB, ok := routingB.(*AnyShardRouting); ok { + if refB, ok := routingB.(*AnyShardRouting); ok && + !TableID(rhsRoute).IsOverlapping(ctx.SemTable.DMLTargets) { if altBRoute := refB.AlternateInKeyspace(routingA.Keyspace()); altBRoute != nil { return lhsRoute, altBRoute, routingA, altBRoute.Routing, true } diff --git a/go/vt/vtgate/planbuilder/operators/subquery_planning.go b/go/vt/vtgate/planbuilder/operators/subquery_planning.go index a2aca74fb6e..e222ae0f343 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_planning.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_planning.go @@ -730,7 +730,7 @@ func mergeSubqueryInputs(ctx *plancontext.PlanningContext, in, out Operator, joi return nil } - inRoute, outRoute, inRouting, outRouting, sameKeyspace := getRoutesOrAlternates(inRoute, outRoute) + inRoute, outRoute, inRouting, outRouting, sameKeyspace := getRoutesOrAlternates(ctx, inRoute, outRoute) inner, outer := getRoutingType(inRouting), getRoutingType(outRouting) switch { diff --git a/go/vt/vtgate/planbuilder/operators/union_merging.go b/go/vt/vtgate/planbuilder/operators/union_merging.go index 000d176b61a..6173b59e0dc 100644 --- a/go/vt/vtgate/planbuilder/operators/union_merging.go +++ b/go/vt/vtgate/planbuilder/operators/union_merging.go @@ -108,7 +108,7 @@ func mergeUnionInputs( lhsExprs, rhsExprs sqlparser.SelectExprs, distinct bool, ) (Operator, sqlparser.SelectExprs) { - lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(lhs, rhs) + lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(ctx, lhs, rhs) if lhsRoute == nil { return nil, nil } diff --git a/go/vt/vtgate/planbuilder/operators/update.go b/go/vt/vtgate/planbuilder/operators/update.go index dd0a86c2de2..18a81175f7b 100644 --- a/go/vt/vtgate/planbuilder/operators/update.go +++ b/go/vt/vtgate/planbuilder/operators/update.go @@ -164,7 +164,7 @@ func createUpdateWithInputOp(ctx *plancontext.PlanningContext, upd *sqlparser.Up ueMap := prepareUpdateExpressionList(ctx, upd) var updOps []dmlOp - for _, target := range ctx.SemTable.Targets.Constituents() { + for _, target := range ctx.SemTable.DMLTargets.Constituents() { op := createUpdateOpWithTarget(ctx, upd, target, ueMap[target]) updOps = append(updOps, op) } @@ -308,7 +308,7 @@ func errIfUpdateNotSupported(ctx *plancontext.PlanningContext, stmt *sqlparser.U } } - // Now we check if any of the foreign key columns that are being udpated have dependencies on other updated columns. + // Now we check if any of the foreign key columns that are being updated have dependencies on other updated columns. // This is unsafe, and we currently don't support this in Vitess. if err := ctx.SemTable.ErrIfFkDependentColumnUpdated(stmt.Exprs); err != nil { panic(err) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index df813b04dea..f3bed93e3c8 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -84,6 +84,7 @@ func (s *planTestSuite) TestPlan() { s.addPKsProvided(vschema, "user", []string{"user_extra"}, []string{"id", "user_id"}) s.addPKsProvided(vschema, "ordering", []string{"order"}, []string{"oid", "region_id"}) s.addPKsProvided(vschema, "ordering", []string{"order_event"}, []string{"oid", "ename"}) + s.addPKsProvided(vschema, "main", []string{"source_of_ref"}, []string{"id"}) // You will notice that some tests expect user.Id instead of user.id. // This is because we now pre-create vindex columns in the symbol @@ -305,6 +306,7 @@ func (s *planTestSuite) TestOne() { s.addPKsProvided(vschema, "user", []string{"user_extra"}, []string{"id", "user_id"}) s.addPKsProvided(vschema, "ordering", []string{"order"}, []string{"oid", "region_id"}) s.addPKsProvided(vschema, "ordering", []string{"order_event"}, []string{"oid", "ename"}) + s.addPKsProvided(vschema, "main", []string{"source_of_ref"}, []string{"id"}) s.testFile("onecase.json", vw, false) } @@ -666,7 +668,7 @@ func (s *planTestSuite) testFile(filename string, vschema *vschemawrapper.VSchem current := PlanTest{ Comment: tcase.Comment, Query: tcase.Query, - SkipE2E: true, + SkipE2E: tcase.SkipE2E, } vschema.Version = Gen4 out := getPlanOutput(tcase, vschema, render) diff --git a/go/vt/vtgate/planbuilder/testdata/reference_cases.json b/go/vt/vtgate/planbuilder/testdata/reference_cases.json index 6aa01355934..1bf893beeef 100644 --- a/go/vt/vtgate/planbuilder/testdata/reference_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/reference_cases.json @@ -2,6 +2,7 @@ { "comment": "select from unqualified ambiguous reference routes to reference source", "query": "select * from ambiguous_ref_with_source", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select * from ambiguous_ref_with_source", @@ -24,6 +25,7 @@ { "comment": "join with unqualified ambiguous reference table routes to optimal keyspace", "query": "select user.col from user join ambiguous_ref_with_source", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join ambiguous_ref_with_source", @@ -47,6 +49,7 @@ { "comment": "ambiguous unqualified reference table self-join routes to reference source", "query": "select r1.col from ambiguous_ref_with_source r1 join ambiguous_ref_with_source", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select r1.col from ambiguous_ref_with_source r1 join ambiguous_ref_with_source", @@ -69,6 +72,7 @@ { "comment": "ambiguous unqualified reference table can merge with other opcodes left to right.", "query": "select ambiguous_ref_with_source.col from ambiguous_ref_with_source join user", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select ambiguous_ref_with_source.col from ambiguous_ref_with_source join user", @@ -92,6 +96,7 @@ { "comment": "ambiguous unqualified reference table can merge with other opcodes left to right and vindex value is in the plan", "query": "select ambiguous_ref_with_source.col from ambiguous_ref_with_source join (select aa from user where user.id=1) user", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select ambiguous_ref_with_source.col from ambiguous_ref_with_source join (select aa from user where user.id=1) user", @@ -119,6 +124,7 @@ { "comment": "qualified join to reference table routes to optimal keyspace", "query": "select user.col from user join main.ambiguous_ref_with_source", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join main.ambiguous_ref_with_source", @@ -142,6 +148,7 @@ { "comment": "insert into ambiguous unqualified reference table routes to source", "query": "insert into ambiguous_ref_with_source(col) values(1)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into ambiguous_ref_with_source(col) values(1)", @@ -164,6 +171,7 @@ { "comment": "Reference tables using left join with a derived table having a limit clause", "query": "SELECT u.id FROM ( SELECT a.id, a.u_id FROM user.ref_with_source AS a WHERE a.id IN (3) ORDER BY a.d_at LIMIT 1) as u LEFT JOIN user.ref_with_source AS u0 ON u.u_id = u0.u_uid ORDER BY u.id", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "SELECT u.id FROM ( SELECT a.id, a.u_id FROM user.ref_with_source AS a WHERE a.id IN (3) ORDER BY a.d_at LIMIT 1) as u LEFT JOIN user.ref_with_source AS u0 ON u.u_id = u0.u_uid ORDER BY u.id", @@ -208,6 +216,7 @@ { "comment": "insert into qualified ambiguous reference table routes to source", "query": "insert into user.ambiguous_ref_with_source(col) values(1)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into user.ambiguous_ref_with_source(col) values(1)", @@ -230,6 +239,7 @@ { "comment": "update unqualified ambiguous reference table routes to source", "query": "update ambiguous_ref_with_source set col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update ambiguous_ref_with_source set col = 1", @@ -252,6 +262,7 @@ { "comment": "update qualified ambiguous reference table route to source", "query": "update user.ambiguous_ref_with_source set col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update user.ambiguous_ref_with_source set col = 1", @@ -274,6 +285,7 @@ { "comment": "delete from unqualified ambiguous reference table routes to source", "query": "delete from ambiguous_ref_with_source where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from ambiguous_ref_with_source where col = 1", @@ -296,6 +308,7 @@ { "comment": "delete from qualified ambiguous reference table route to source", "query": "delete from user.ambiguous_ref_with_source where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from user.ambiguous_ref_with_source where col = 1", @@ -318,6 +331,7 @@ { "comment": "join with unqualified unambiguous ref with source routes to requested table", "query": "select user.col from user join ref_with_source", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join ref_with_source", @@ -341,6 +355,7 @@ { "comment": "join with unqualified reference optimize routes when source & reference have different names", "query": "select user.col from user join source_of_ref", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join source_of_ref", @@ -364,6 +379,7 @@ { "comment": "join with unqualified reference respects routing rules", "query": "select user.col from user join rerouted_ref", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join rerouted_ref", @@ -387,6 +403,7 @@ { "comment": "join with reference to unqualified source routes to optimal keyspace", "query": "select user.col from user join global_ref", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select user.col from user join global_ref", @@ -410,6 +427,7 @@ { "comment": "insert into qualified reference with unqualified source routes to source", "query": "insert into user.global_ref(col) values(1)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into user.global_ref(col) values(1)", @@ -432,6 +450,7 @@ { "comment": "delete from reference table with another name - query send to source table", "query": "delete from user.ref_with_source where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from user.ref_with_source where col = 1", @@ -454,6 +473,7 @@ { "comment": "update from reference table with another name - query send to source table", "query": "update user.ref_with_source set x = 4 where col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update user.ref_with_source set x = 4 where col = 1", @@ -476,6 +496,7 @@ { "comment": "insert from reference table with another name - query send to source table", "query": "insert into user.ref_with_source(x) values(4)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into user.ref_with_source(x) values(4)", @@ -498,6 +519,7 @@ { "comment": "delete from reference table - query send to source table", "query": "delete from source_of_ref where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from source_of_ref where col = 1", @@ -520,6 +542,7 @@ { "comment": "update from reference table - query send to source table", "query": "update source_of_ref set x = 4 where col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update source_of_ref set x = 4 where col = 1", @@ -542,6 +565,7 @@ { "comment": "insert from reference table - query send to source table", "query": "insert into source_of_ref(x) values(4)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into source_of_ref(x) values(4)", @@ -564,6 +588,7 @@ { "comment": "delete from reference table qualified with unsharded - query send to source table", "query": "delete from main.source_of_ref where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from main.source_of_ref where col = 1", @@ -586,6 +611,7 @@ { "comment": "update from reference table qualified with unsharded - query send to source table", "query": "update main.source_of_ref set x = 4 where col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update main.source_of_ref set x = 4 where col = 1", @@ -608,6 +634,7 @@ { "comment": "insert from reference table qualified with unsharded - query send to source table", "query": "insert into main.source_of_ref(x) values(4)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into main.source_of_ref(x) values(4)", @@ -630,6 +657,7 @@ { "comment": "delete from reference table with another name - query send to source table", "query": "delete from user.ref_with_source where col = 1", + "skip_e2e": true, "plan": { "QueryType": "DELETE", "Original": "delete from user.ref_with_source where col = 1", @@ -652,6 +680,7 @@ { "comment": "update from reference table with another name - query send to source table", "query": "update user.ref_with_source set x = 4 where col = 1", + "skip_e2e": true, "plan": { "QueryType": "UPDATE", "Original": "update user.ref_with_source set x = 4 where col = 1", @@ -674,6 +703,7 @@ { "comment": "insert from reference table with another name - query send to source table", "query": "insert into user.ref_with_source(x) values(4)", + "skip_e2e": true, "plan": { "QueryType": "INSERT", "Original": "insert into user.ref_with_source(x) values(4)", @@ -696,6 +726,7 @@ { "comment": "select with join to reference table in sharded keyspace: should route shard-scoped", "query": "select * from user.ref_with_source ref, `user`.`user` u where ref.id = u.ref_id and u.id = 2", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select * from user.ref_with_source ref, `user`.`user` u where ref.id = u.ref_id and u.id = 2", @@ -723,6 +754,7 @@ { "comment": "select with join to reference table in unsharded keyspace: should route shard-scoped", "query": "select * from source_of_ref ref, `user`.`user` u where ref.id = u.ref_id and u.id = 2", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select * from source_of_ref ref, `user`.`user` u where ref.id = u.ref_id and u.id = 2", @@ -750,6 +782,7 @@ { "comment": "two sharded and two unsharded reference table join - all should be merged into one route", "query": "select 1 from user u join user_extra ue on u.id = ue.user_id join main.source_of_ref sr on sr.foo = ue.foo join main.rerouted_ref rr on rr.bar = sr.bar", + "skip_e2e": true, "plan": { "QueryType": "SELECT", "Original": "select 1 from user u join user_extra ue on u.id = ue.user_id join main.source_of_ref sr on sr.foo = ue.foo join main.rerouted_ref rr on rr.bar = sr.bar", @@ -771,5 +804,145 @@ "user.user_extra" ] } + }, + { + "comment": "update reference table with join on sharded table", + "query": "update main.source_of_ref as sr join main.rerouted_ref as rr on sr.id = rr.id inner join user.music as m on sr.col = m.col set sr.tt = 5 where m.user_id = 1", + "plan": { + "QueryType": "UPDATE", + "Original": "update main.source_of_ref as sr join main.rerouted_ref as rr on sr.id = rr.id inner join user.music as m on sr.col = m.col set sr.tt = 5 where m.user_id = 1", + "Instructions": { + "OperatorType": "DMLWithInput", + "TargetTabletType": "PRIMARY", + "Offset": [ + "0:[0]" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "m_col": 0 + }, + "TableName": "music_rerouted_ref, source_of_ref", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select m.col from music as m where 1 != 1", + "Query": "select m.col from music as m where m.user_id = 1 lock in share mode", + "Table": "music", + "Values": [ + "1" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sr.id from source_of_ref as sr, rerouted_ref as rr where 1 != 1", + "Query": "select sr.id from source_of_ref as sr, rerouted_ref as rr where sr.col = :m_col and sr.id = rr.id lock in share mode", + "Table": "rerouted_ref, source_of_ref" + } + ] + }, + { + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update source_of_ref as sr set sr.tt = 5 where sr.id in ::dml_vals", + "Table": "source_of_ref" + } + ] + }, + "TablesUsed": [ + "main.rerouted_ref", + "main.source_of_ref", + "user.music" + ] + } + }, + { + "comment": "delete from reference table with join on sharded table", + "query": "delete sr from main.source_of_ref as sr join main.rerouted_ref as rr on sr.id = rr.id inner join user.music as m on sr.col = m.col where m.user_id = 1", + "plan": { + "QueryType": "DELETE", + "Original": "delete sr from main.source_of_ref as sr join main.rerouted_ref as rr on sr.id = rr.id inner join user.music as m on sr.col = m.col where m.user_id = 1", + "Instructions": { + "OperatorType": "DMLWithInput", + "TargetTabletType": "PRIMARY", + "Offset": [ + "0:[0]" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "m_col": 0 + }, + "TableName": "music_rerouted_ref, source_of_ref", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select m.col from music as m where 1 != 1", + "Query": "select m.col from music as m where m.user_id = 1", + "Table": "music", + "Values": [ + "1" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select sr.id from source_of_ref as sr, rerouted_ref as rr where 1 != 1", + "Query": "select sr.id from source_of_ref as sr, rerouted_ref as rr where sr.col = :m_col and sr.id = rr.id", + "Table": "rerouted_ref, source_of_ref" + } + ] + }, + { + "OperatorType": "Delete", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "delete from source_of_ref as sr where sr.id in ::dml_vals", + "Table": "source_of_ref" + } + ] + }, + "TablesUsed": [ + "main.rerouted_ref", + "main.source_of_ref", + "user.music" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/sampledata/user.sql b/go/vt/vtgate/planbuilder/testdata/sampledata/user.sql index 044a1ee140d..ff1afd68fca 100644 --- a/go/vt/vtgate/planbuilder/testdata/sampledata/user.sql +++ b/go/vt/vtgate/planbuilder/testdata/sampledata/user.sql @@ -11,4 +11,13 @@ INSERT INTO sales_extra(colx, cola, colb, start, end) VALUES (13, 'a_3', 'b_3',1000, 1500); INSERT INTO sales_extra(colx, cola, colb, start, end) -VALUES (14, 'a_4', 'b_4',1500, 2000); \ No newline at end of file +VALUES (14, 'a_4', 'b_4',1500, 2000); + +INSERT INTO music (id, user_id, col) +VALUES (100, 1, 'foo'); + +INSERT INTO source_of_ref (id, col, tt) +VALUES (200, 'foo', 2); + +INSERT INTO rerouted_ref (id, ref_col, name) +VALUES (200, 'bar', 'baz'); \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/schemas/main.sql b/go/vt/vtgate/planbuilder/testdata/schemas/main.sql index fb03b69419b..e615871cf2b 100644 --- a/go/vt/vtgate/planbuilder/testdata/schemas/main.sql +++ b/go/vt/vtgate/planbuilder/testdata/schemas/main.sql @@ -1,26 +1,44 @@ -CREATE TABLE `unsharded` ( - `id` INT NOT NULL PRIMARY KEY, - `col` VARCHAR(255) DEFAULT NULL, - `col1` VARCHAR(255) DEFAULT NULL, - `col2` VARCHAR(255) DEFAULT NULL, - `name` VARCHAR(255) DEFAULT NULL, - `baz` INT +CREATE TABLE `unsharded` +( + `id` INT NOT NULL PRIMARY KEY, + `col` VARCHAR(255) DEFAULT NULL, + `col1` VARCHAR(255) DEFAULT NULL, + `col2` VARCHAR(255) DEFAULT NULL, + `name` VARCHAR(255) DEFAULT NULL, + `baz` INT ); -CREATE TABLE `unsharded_auto` ( +CREATE TABLE `unsharded_auto` +( `id` INT NOT NULL PRIMARY KEY, `col1` VARCHAR(255) DEFAULT NULL, `col2` VARCHAR(255) DEFAULT NULL ); -CREATE TABLE `unsharded_a` ( +CREATE TABLE `unsharded_a` +( `id` INT NOT NULL PRIMARY KEY, `col` VARCHAR(255) DEFAULT NULL, `name` VARCHAR(255) DEFAULT NULL ); -CREATE TABLE `unsharded_b` ( +CREATE TABLE `unsharded_b` +( `id` INT NOT NULL PRIMARY KEY, `col` VARCHAR(255) DEFAULT NULL, `name` VARCHAR(255) DEFAULT NULL +); + +CREATE TABLE `source_of_ref` +( + `id` INT NOT NULL PRIMARY KEY, + `col` VARCHAR(255) DEFAULT NULL, + `tt` BIGINT DEFAULT NULL +); + +CREATE TABLE `rerouted_ref` +( + `id` INT NOT NULL PRIMARY KEY, + `ref_col` VARCHAR(255) DEFAULT NULL, + `name` VARCHAR(255) DEFAULT NULL ); \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/schemas/user.sql b/go/vt/vtgate/planbuilder/testdata/schemas/user.sql index 818d2508069..10c1886a992 100644 --- a/go/vt/vtgate/planbuilder/testdata/schemas/user.sql +++ b/go/vt/vtgate/planbuilder/testdata/schemas/user.sql @@ -1,25 +1,25 @@ CREATE TABLE user ( - id INT PRIMARY KEY, - col BIGINT, - intcol BIGINT, - user_id INT, - id1 INT, - id2 INT, - id3 INT, - m INT, - bar INT, - a INT, - name VARCHAR(255), - col1 VARCHAR(255), - col2 VARCHAR(255), - costly VARCHAR(255), - predef1 VARCHAR(255), - predef2 VARCHAR(255), - textcol1 VARCHAR(255), - textcol2 VARCHAR(255), - someColumn VARCHAR(255), - foo VARCHAR(255) + id INT PRIMARY KEY, + col BIGINT, + intcol BIGINT, + user_id INT, + id1 INT, + id2 INT, + id3 INT, + m INT, + bar INT, + a INT, + name VARCHAR(255), + col1 VARCHAR(255), + col2 VARCHAR(255), + costly VARCHAR(255), + predef1 VARCHAR(255), + predef2 VARCHAR(255), + textcol1 VARCHAR(255), + textcol2 VARCHAR(255), + someColumn VARCHAR(255), + foo VARCHAR(255) ); CREATE TABLE user_metadata @@ -34,15 +34,23 @@ CREATE TABLE user_metadata CREATE TABLE music ( - user_id INT, - id INT, - col1 VARCHAR(255), - col2 VARCHAR(255), - genre VARCHAR(255), + user_id INT, + id INT, + col VARCHAR(255), + col1 VARCHAR(255), + col2 VARCHAR(255), + genre VARCHAR(255), componist VARCHAR(255), PRIMARY KEY (user_id) ); +CREATE TABLE name_user_vdx +( + name INT, + keyspace_id VARBINARY(10), + primary key (name) +); + CREATE TABLE samecolvin ( col VARCHAR(255), @@ -118,69 +126,63 @@ CREATE TABLE authoritative CREATE TABLE colb_colc_map ( - colb INT PRIMARY KEY, - colc INT, + colb INT PRIMARY KEY, + colc INT, keyspace_id VARCHAR(255) ); CREATE TABLE seq ( - id INT, - next_id BIGINT, - cache BIGINT, + id INT, + next_id BIGINT, + cache BIGINT, PRIMARY KEY (id) ) COMMENT 'vitess_sequence'; CREATE TABLE user_extra ( - id INT, - user_id INT, - extra_id INT, - col INT, - m2 INT, + id INT, + user_id INT, + extra_id INT, + col INT, + m2 INT, PRIMARY KEY (id, extra_id) ); CREATE TABLE name_user_map ( - name VARCHAR(255), - keyspace_id VARCHAR(255) -); - -CREATE TABLE name_user_vdx -( - name VARCHAR(255), - keyspace_id VARCHAR(255) + name VARCHAR(255), + keyspace_id VARCHAR(255) ); CREATE TABLE costly_map ( - costly VARCHAR(255), - keyspace_id VARCHAR(255) + costly VARCHAR(255), + keyspace_id VARCHAR(255) ); CREATE TABLE unq_binary_idx ( - id INT PRIMARY KEY, - col1 INT + id INT PRIMARY KEY, + col1 INT ); CREATE TABLE sales ( - oid INT PRIMARY KEY, - col1 VARCHAR(255) + oid INT PRIMARY KEY, + col1 VARCHAR(255) ); CREATE TABLE sales_extra ( - colx INT PRIMARY KEY, - cola VARCHAR(255), - colb VARCHAR(255), - start INT, - end INT + colx INT PRIMARY KEY, + cola VARCHAR(255), + colb VARCHAR(255), + start INT, + end INT ); CREATE TABLE ref ( - col INT PRIMARY KEY + col INT PRIMARY KEY ); \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 9241cec595c..55329586b0e 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -342,7 +342,12 @@ { "comment": "reference table delete with join", "query": "delete r from user u join ref_with_source r on u.col = r.col", - "plan": "VT12001: unsupported: DELETE on reference table with join" + "plan": "VT12001: unsupported: DML on reference table with join" + }, + { + "comment": "reference table update with join", + "query": "update user u join ref_with_source r on u.col = r.col set r.col = 5", + "plan": "VT12001: unsupported: DML on reference table with join" }, { "comment": "group_concat unsupported when needs full evaluation at vtgate with more than 1 column", diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index 988932f4414..62cdc019ddf 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -174,7 +174,7 @@ func (a *analyzer) newSemTable( Direct: a.binder.direct, ExprTypes: a.typer.m, Tables: a.tables.Tables, - Targets: a.binder.targets, + DMLTargets: a.binder.targets, NotSingleRouteErr: a.notSingleRouteErr, NotUnshardedErr: a.unshardedErr, Warning: a.warning, diff --git a/go/vt/vtgate/semantics/semantic_table.go b/go/vt/vtgate/semantics/semantic_table.go index 492259427c5..30a41ba5f12 100644 --- a/go/vt/vtgate/semantics/semantic_table.go +++ b/go/vt/vtgate/semantics/semantic_table.go @@ -130,8 +130,8 @@ type ( // It doesn't recurse inside derived tables to find the original dependencies. Direct ExprDependencies - // Targets contains the TableSet of each table getting modified by the update/delete statement. - Targets TableSet + // DMLTargets contains the TableSet of each table getting modified by the update/delete statement. + DMLTargets TableSet // ColumnEqualities is used for transitive closures (e.g., if a == b and b == c, then a == c). ColumnEqualities map[columnName][]sqlparser.Expr @@ -203,7 +203,7 @@ func (st *SemTable) CopyDependencies(from, to sqlparser.Expr) { // GetChildForeignKeysForTargets gets the child foreign keys as a list for all the target tables. func (st *SemTable) GetChildForeignKeysForTargets() (fks []vindexes.ChildFKInfo) { - for _, ts := range st.Targets.Constituents() { + for _, ts := range st.DMLTargets.Constituents() { fks = append(fks, st.childForeignKeysInvolved[ts]...) } return fks @@ -211,7 +211,7 @@ func (st *SemTable) GetChildForeignKeysForTargets() (fks []vindexes.ChildFKInfo) // GetChildForeignKeysForTableSet gets the child foreign keys as a listfor the TableSet. func (st *SemTable) GetChildForeignKeysForTableSet(target TableSet) (fks []vindexes.ChildFKInfo) { - for _, ts := range st.Targets.Constituents() { + for _, ts := range st.DMLTargets.Constituents() { if target.IsSolvedBy(ts) { fks = append(fks, st.childForeignKeysInvolved[ts]...) } @@ -239,7 +239,7 @@ func (st *SemTable) GetChildForeignKeysList() []vindexes.ChildFKInfo { // GetParentForeignKeysForTargets gets the parent foreign keys as a list for all the target tables. func (st *SemTable) GetParentForeignKeysForTargets() (fks []vindexes.ParentFKInfo) { - for _, ts := range st.Targets.Constituents() { + for _, ts := range st.DMLTargets.Constituents() { fks = append(fks, st.parentForeignKeysInvolved[ts]...) } return fks @@ -247,7 +247,7 @@ func (st *SemTable) GetParentForeignKeysForTargets() (fks []vindexes.ParentFKInf // GetParentForeignKeysForTableSet gets the parent foreign keys as a list for the TableSet. func (st *SemTable) GetParentForeignKeysForTableSet(target TableSet) (fks []vindexes.ParentFKInfo) { - for _, ts := range st.Targets.Constituents() { + for _, ts := range st.DMLTargets.Constituents() { if target.IsSolvedBy(ts) { fks = append(fks, st.parentForeignKeysInvolved[ts]...) } @@ -971,7 +971,7 @@ func (st *SemTable) UpdateChildFKExpr(origUpdExpr *sqlparser.UpdateExpr, newExpr // GetTargetTableSetForTableName returns the TableSet for the given table name from the target tables. func (st *SemTable) GetTargetTableSetForTableName(name sqlparser.TableName) (TableSet, error) { - for _, target := range st.Targets.Constituents() { + for _, target := range st.DMLTargets.Constituents() { tbl, err := st.Tables[target.TableOffset()].Name() if err != nil { return "", err From 72d91bdae7922444f7268c0069f3adf7ec254a52 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:36:07 +0200 Subject: [PATCH 08/66] schemadiff: skip keys with expressions in Online DDL analysis (#17475) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/schemadiff/key.go | 10 ++++++++++ go/vt/schemadiff/onlineddl.go | 5 +++++ go/vt/schemadiff/onlineddl_test.go | 5 +++++ go/vt/schemadiff/table.go | 11 ++++++++--- go/vt/schemadiff/table_test.go | 18 ++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/go/vt/schemadiff/key.go b/go/vt/schemadiff/key.go index 865073a5a98..97f3af1630c 100644 --- a/go/vt/schemadiff/key.go +++ b/go/vt/schemadiff/key.go @@ -68,6 +68,16 @@ func (i *IndexDefinitionEntity) IsUnique() bool { return i.IndexDefinition.Info.IsUnique() } +// HasExpression returns true if the index uses an expression, e.g. `KEY idx1 ((id + 1))`. +func (i *IndexDefinitionEntity) HasExpression() bool { + for _, col := range i.IndexDefinition.Columns { + if col.Expression != nil { + return true + } + } + return false +} + // HasNullable returns true if any of the columns in the index are nullable. func (i *IndexDefinitionEntity) HasNullable() bool { for _, col := range i.ColumnList.Entities { diff --git a/go/vt/schemadiff/onlineddl.go b/go/vt/schemadiff/onlineddl.go index f02ccb1224d..06f3384c8fd 100644 --- a/go/vt/schemadiff/onlineddl.go +++ b/go/vt/schemadiff/onlineddl.go @@ -162,6 +162,11 @@ func PrioritizedUniqueKeys(createTableEntity *CreateTableEntity) *IndexDefinitio if !key.IsUnique() { continue } + if key.HasExpression() { + // If the key has an expression this means it unreliably covers the columns, + // we cannot trust it. + continue + } uniqueKeys = append(uniqueKeys, key) } sort.SliceStable(uniqueKeys, func(i, j int) bool { diff --git a/go/vt/schemadiff/onlineddl_test.go b/go/vt/schemadiff/onlineddl_test.go index 834490dca1b..f5309b4f943 100644 --- a/go/vt/schemadiff/onlineddl_test.go +++ b/go/vt/schemadiff/onlineddl_test.go @@ -932,6 +932,11 @@ func TestRevertible(t *testing.T) { toSchema: `id int primary key, e1 set('a', 'b'), e2 set('a'), e3 set('a', 'b', 'c'), e4 set('a', 'x'), e5 set('a', 'x', 'b'), e6 set('b'), e7 varchar(1), e8 tinyint`, expandedColumnNames: `e3,e4,e5,e6,e7,e8`, }, + { + name: "index with expression", + fromSchema: "id int, primary key (id), key idx1 ((id + 1))", + toSchema: "id int, primary key (id), key idx2 ((id + 2))", + }, } var ( diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index e002ef18e15..e9bb35cb3bd 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -500,9 +500,14 @@ func (c *CreateTableEntity) IndexDefinitionEntities() []*IndexDefinitionEntity { keys := c.CreateTable.TableSpec.Indexes entities := make([]*IndexDefinitionEntity, len(keys)) for i, key := range keys { - colEntities := make([]*ColumnDefinitionEntity, len(key.Columns)) - for i, keyCol := range key.Columns { - colEntities[i] = colMap[keyCol.Column.Lowered()] + colEntities := []*ColumnDefinitionEntity{} + for _, keyCol := range key.Columns { + colEntity, ok := colMap[keyCol.Column.Lowered()] + if !ok { + // This can happen if the index is on an expression, e.g. `KEY idx1 ((id + 1))`. + continue + } + colEntities = append(colEntities, colEntity) } entities[i] = NewIndexDefinitionEntity(c.Env, key, NewColumnDefinitionEntityList(colEntities)) } diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index 84c40d769c2..ac871dbd4af 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -891,6 +891,18 @@ func TestCreateTableDiff(t *testing.T) { "+ KEY `i_idx` (`i`) INVISIBLE", }, }, + { + name: "keys with expression", + from: "create table t1 (id int, primary key (id), key idx1 ((id + 1)))", + to: "create table t1 (id int, primary key (id), key idx2 ((id + 2)))", + diff: "alter table t1 drop key idx1, add key idx2 ((id + 2))", + cdiff: "ALTER TABLE `t1` DROP KEY `idx1`, ADD KEY `idx2` ((`id` + 2))", + textdiffs: []string{ + "- KEY `idx1` ((`id` + 1))", + "+ KEY `idx2` ((`id` + 2))", + }, + }, + // FULLTEXT keys { name: "add one fulltext key", @@ -2564,6 +2576,12 @@ func TestValidate(t *testing.T) { alter: "alter table t engine=innodb", expectErr: &DuplicateKeyNameError{Table: "t", Key: "PRIMARY"}, }, + { + name: "key with expression", + from: "create table t (id int, primary key (id), key idx1 ((id + 1)))", + alter: "alter table t add key idx2 ((id + 2))", + to: "create table t (id int, primary key (id), key idx1 ((id + 1)), key idx2 ((id + 2)))", + }, // partitions { name: "drop column used by partitions", From 6ac89989b63c1e897897a27ebd371679401d1218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Wed, 8 Jan 2025 14:09:28 +0100 Subject: [PATCH 09/66] Improved Compatibility Around LAST_INSERT_ID - evalengine (#17409) Signed-off-by: Andres Taylor Signed-off-by: Vicent Marti Signed-off-by: Harshit Gangal Signed-off-by: Florent Poinsard Co-authored-by: Vicent Marti Co-authored-by: Harshit Gangal Co-authored-by: Florent Poinsard --- changelog/22.0/22.0.0/summary.md | 7 ++ go/test/endtoend/utils/cmp.go | 4 +- .../vtgate/plan_tests/plan_e2e_test.go | 2 +- .../endtoend/vtgate/queries/misc/main_test.go | 2 +- .../endtoend/vtgate/queries/misc/misc_test.go | 95 ++++++++++++++++++- go/vt/sqlparser/ast_test.go | 8 ++ go/vt/vtgate/engine/cached_size.go | 2 +- go/vt/vtgate/engine/fake_vcursor_test.go | 28 +++--- go/vt/vtgate/engine/insert.go | 6 +- go/vt/vtgate/engine/insert_common.go | 2 +- go/vt/vtgate/engine/insert_select.go | 2 +- go/vt/vtgate/engine/primitive.go | 2 + go/vt/vtgate/engine/set.go | 17 ++-- go/vt/vtgate/evalengine/cached_size.go | 12 +++ go/vt/vtgate/evalengine/compiler_asm.go | 15 +++ go/vt/vtgate/evalengine/compiler_test.go | 93 ++++++++++++++++++ go/vt/vtgate/evalengine/expr_env.go | 2 + go/vt/vtgate/evalengine/fn_misc.go | 32 +++++++ .../evalengine/integration/comparison_test.go | 4 + go/vt/vtgate/evalengine/translate_builtin.go | 5 + go/vt/vtgate/executorcontext/vcursor_impl.go | 6 ++ go/vt/vtgate/planbuilder/insert.go | 11 ++- .../planbuilder/operator_transformers.go | 6 +- .../planbuilder/testdata/aggr_cases.json | 38 ++++++++ .../planbuilder/testdata/dml_cases.json | 24 +++++ .../planbuilder/testdata/set_cases.json | 23 +++++ 26 files changed, 403 insertions(+), 45 deletions(-) diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index a54a7a4a9ae..bfc55064148 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -10,6 +10,7 @@ - **[VTOrc Config File Changes](#vtorc-config-file-changes)** - **[VTGate Config File Changes](#vtgate-config-file-changes)** - **[Support for More Efficient JSON Replication](#efficient-json-replication)** + - **[Support for LAST_INSERT_ID(x)](#last-insert-id)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -80,6 +81,12 @@ In [#7345](https://github.com/vitessio/vitess/pull/17345) we added support for [ If you are using MySQL 8.0 or later and using JSON columns, you can now enable this MySQL feature across your Vitess cluster(s) to lower the disk space needed for binary logs and improve the CPU and memory usage in both `mysqld` (standard intrashard MySQL replication) and `vttablet` ([VReplication](https://vitess.io/docs/reference/vreplication/vreplication/)) without losing any capabilities or features. +### Support for `LAST_INSERT_ID(x)` + +In [#17408](https://github.com/vitessio/vitess/pull/17408) and [#17409](https://github.com/vitessio/vitess/pull/17409), we added the ability to use `LAST_INSERT_ID(x)` in Vitess directly at vtgate. This improvement allows certain queries—like `SELECT last_insert_id(123);` or `SELECT last_insert_id(count(*)) ...`—to be handled without relying on MySQL for the final value. + +**Limitations**: +- When using `LAST_INSERT_ID(x)` in ordered queries (e.g., `SELECT last_insert_id(col) FROM table ORDER BY foo`), MySQL sets the session’s last-insert-id value according to the *last row returned*. Vitess does not guarantee the same behavior. ## Minor Changes diff --git a/go/test/endtoend/utils/cmp.go b/go/test/endtoend/utils/cmp.go index 3a05c75c33b..b2e1eca03e9 100644 --- a/go/test/endtoend/utils/cmp.go +++ b/go/test/endtoend/utils/cmp.go @@ -215,8 +215,8 @@ func (mcmp *MySQLCompare) Exec(query string) *sqltypes.Result { return vtQr } -// ExecVitessAndMySQL executes Vitess and MySQL with the queries provided. -func (mcmp *MySQLCompare) ExecVitessAndMySQL(vtQ, mQ string) *sqltypes.Result { +// ExecVitessAndMySQLDifferentQueries executes Vitess and MySQL with the queries provided. +func (mcmp *MySQLCompare) ExecVitessAndMySQLDifferentQueries(vtQ, mQ string) *sqltypes.Result { mcmp.t.Helper() vtQr, err := mcmp.VtConn.ExecuteFetch(vtQ, 1000, true) require.NoError(mcmp.t, err, "[Vitess Error] for query: "+vtQ) diff --git a/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go b/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go index ffe712c141c..0068616c3b8 100644 --- a/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go +++ b/go/test/endtoend/vtgate/plan_tests/plan_e2e_test.go @@ -49,7 +49,7 @@ func TestE2ECases(t *testing.T) { require.NoError(mcmp.AsT(), err) sqlparser.RemoveKeyspaceIgnoreSysSchema(stmt) - mcmp.ExecVitessAndMySQL(test.Query, sqlparser.String(stmt)) + mcmp.ExecVitessAndMySQLDifferentQueries(test.Query, sqlparser.String(stmt)) pd := utils.ExecTrace(mcmp.AsT(), mcmp.VtConn, test.Query) verifyTestExpectations(mcmp.AsT(), pd, test) if mcmp.VtConn.IsClosed() { diff --git a/go/test/endtoend/vtgate/queries/misc/main_test.go b/go/test/endtoend/vtgate/queries/misc/main_test.go index ee9be542634..536dfa7500a 100644 --- a/go/test/endtoend/vtgate/queries/misc/main_test.go +++ b/go/test/endtoend/vtgate/queries/misc/main_test.go @@ -95,7 +95,7 @@ func TestMain(m *testing.M) { vtParams = clusterInstance.GetVTParams(keyspaceName) // create mysql instance and connection parameters - conn, closer, err := utils.NewMySQL(clusterInstance, keyspaceName, schemaSQL) + conn, closer, err := utils.NewMySQL(clusterInstance, keyspaceName, schemaSQL, uschemaSQL) if err != nil { fmt.Println(err) return 1 diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index 9f9860bd0e0..7ab0fe7ef54 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -25,6 +25,7 @@ import ( "time" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/sqlparser" _ "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" @@ -163,6 +164,8 @@ func TestSetAndGetLastInsertID(t *testing.T) { "update t1 set id2 = last_insert_id(%d) where id1 = 2", "update t1 set id2 = 88 where id1 = last_insert_id(%d)", "delete from t1 where id1 = last_insert_id(%d)", + "select id2, last_insert_id(count(*)) from t1 where %d group by id2", + "set @x = last_insert_id(%d)", } for _, workload := range []string{"olap", "oltp"} { @@ -175,7 +178,7 @@ func TestSetAndGetLastInsertID(t *testing.T) { require.NoError(t, err) } - // Insert a row for UPDATE tests + // Insert a few rows for UPDATE tests mcmp.Exec("insert into t1 (id1, id2) values (1, 10)") for _, query := range queries { @@ -186,6 +189,96 @@ func TestSetAndGetLastInsertID(t *testing.T) { } } +func TestSetAndGetLastInsertIDWithInsertUnsharded(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + tests := []string{ + "insert into uks.unsharded(id1, id2) values (last_insert_id(%d),12)", + "insert into uks.unsharded(id1, id2) select last_insert_id(%d), 453", + } + + i := 0 + getVal := func() int { + defer func() { i++ }() + return i + } + + runTests := func(mcmp *utils.MySQLCompare) { + for _, test := range tests { + + lastInsertID := getVal() + query := fmt.Sprintf(test, lastInsertID) + + stmt, err := sqlparser.NewTestParser().Parse(query) + require.NoError(mcmp.AsT(), err) + sqlparser.RemoveKeyspaceIgnoreSysSchema(stmt) + + mcmp.ExecVitessAndMySQLDifferentQueries(query, sqlparser.String(stmt)) + mcmp.Exec("select last_insert_id()") + } + } + + for _, workload := range []string{"olap", "oltp"} { + mcmp.Run(workload, func(mcmp *utils.MySQLCompare) { + _, err := mcmp.VtConn.ExecuteFetch("set workload = "+workload, 1, false) + require.NoError(t, err) + runTests(mcmp) + + // run the queries again, but inside a transaction this time + mcmp.Exec("begin") + runTests(mcmp) + mcmp.Exec("commit") + }) + } + + // Now test to set the last insert id to 0, see that it has changed correctly even if the value is 0 + mcmp.ExecVitessAndMySQLDifferentQueries( + "insert into uks.unsharded(id1, id2) values (last_insert_id(0),12)", + "insert into unsharded(id1, id2) values (last_insert_id(0),12)", + ) + mcmp.Exec("select last_insert_id()") +} + +func TestSetAndGetLastInsertIDWithInsert(t *testing.T) { + mcmp, closer := start(t) + defer closer() + + tests := []string{ + "insert into t1(id1, id2) values (last_insert_id(%d) ,%d)", + "insert into t1(id1, id2) values (%d, last_insert_id(%d))", + "insert into t1(id1, id2) select last_insert_id(%d), %d", + "insert into t1(id1, id2) select last_insert_id(id1+%d), 12 from t1 where 1 > %d", + } + + i := 0 + getVal := func() int { + defer func() { i++ }() + return i + } + + runTests := func(mcmp *utils.MySQLCompare) { + for _, test := range tests { + query := fmt.Sprintf(test, getVal(), getVal()) + mcmp.Exec(query) + mcmp.Exec("select last_insert_id()") + } + } + + for _, workload := range []string{"olap", "oltp"} { + mcmp.Run(workload, func(mcmp *utils.MySQLCompare) { + _, err := mcmp.VtConn.ExecuteFetch("set workload = "+workload, 1, false) + require.NoError(t, err) + runTests(mcmp) + + // run the queries again, but inside a transaction this time + mcmp.Exec("begin") + runTests(mcmp) + mcmp.Exec("commit") + }) + } +} + // TestVindexHints tests that vindex hints work as intended. func TestVindexHints(t *testing.T) { mcmp, closer := start(t) diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index f01b47cbd7b..c1484df7cc4 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -917,3 +917,11 @@ func TestCloneComments(t *testing.T) { assert.Equal(t, "b", val) } } + +func TestRemoveKeyspace(t *testing.T) { + stmt, err := NewTestParser().Parse("select 1 from uks.unsharded") + require.NoError(t, err) + RemoveKeyspaceIgnoreSysSchema(stmt) + + require.Equal(t, "select 1 from unsharded", String(stmt)) +} diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index e59832cdab5..50d3a4b6bbf 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -465,7 +465,7 @@ func (cached *Insert) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(240) + size += int64(224) } // field InsertCommon vitess.io/vitess/go/vt/vtgate/engine.InsertCommon size += cached.InsertCommon.CachedSize(false) diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index f27ca380876..aac3e9b584c 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -400,6 +400,20 @@ func (t *noopVCursor) GetDBDDLPluginName() string { panic("unimplemented") } +func (t *noopVCursor) SetLastInsertID(uint64) {} +func (t *noopVCursor) VExplainLogging() {} +func (t *noopVCursor) DisableLogging() {} +func (t *noopVCursor) GetVExplainLogs() []ExecuteEntry { + return nil +} +func (t *noopVCursor) GetLogs() ([]ExecuteEntry, error) { + return nil, nil +} + +// RecordMirrorStats implements VCursor. +func (t *noopVCursor) RecordMirrorStats(sourceExecTime, targetExecTime time.Duration, targetErr error) { +} + var ( _ VCursor = (*loggingVCursor)(nil) _ SessionActions = (*loggingVCursor)(nil) @@ -893,20 +907,6 @@ func (t *loggingVCursor) RecordMirrorStats(sourceExecTime, targetExecTime time.D } } -func (t *noopVCursor) VExplainLogging() {} -func (t *noopVCursor) DisableLogging() {} -func (t *noopVCursor) GetVExplainLogs() []ExecuteEntry { - return nil -} - -func (t *noopVCursor) GetLogs() ([]ExecuteEntry, error) { - return nil, nil -} - -// RecordMirrorStats implements VCursor. -func (t *noopVCursor) RecordMirrorStats(sourceExecTime, targetExecTime time.Duration, targetErr error) { -} - func expectResult(t *testing.T, result, want *sqltypes.Result) { t.Helper() fieldsResult := fmt.Sprintf("%v", result.Fields) diff --git a/go/vt/vtgate/engine/insert.go b/go/vt/vtgate/engine/insert.go index 10a4048572f..5bc206f7465 100644 --- a/go/vt/vtgate/engine/insert.go +++ b/go/vt/vtgate/engine/insert.go @@ -58,11 +58,9 @@ type Insert struct { // Alias represents the row alias with columns if specified in the query. Alias string - - FetchLastInsertID bool } -// newQueryInsert creates an Insert with a query string. +// newQueryInsert creates an Insert with a query string. Used in testing. func newQueryInsert(opcode InsertOpcode, keyspace *vindexes.Keyspace, query string) *Insert { return &Insert{ InsertCommon: InsertCommon{ @@ -73,7 +71,7 @@ func newQueryInsert(opcode InsertOpcode, keyspace *vindexes.Keyspace, query stri } } -// newInsert creates a new Insert. +// newInsert creates a new Insert. Used in testing. func newInsert( opcode InsertOpcode, ignore bool, diff --git a/go/vt/vtgate/engine/insert_common.go b/go/vt/vtgate/engine/insert_common.go index 629d848d978..d4cae045e86 100644 --- a/go/vt/vtgate/engine/insert_common.go +++ b/go/vt/vtgate/engine/insert_common.go @@ -161,7 +161,7 @@ func (ins *InsertCommon) executeUnshardedTableQuery(ctx context.Context, vcursor if err != nil { return nil, err } - qr, err := execShard(ctx, loggingPrimitive, vcursor, query, bindVars, rss[0], true, !ins.PreventAutoCommit /* canAutocommit */, false) + qr, err := execShard(ctx, loggingPrimitive, vcursor, query, bindVars, rss[0], true, !ins.PreventAutoCommit /* canAutocommit */, ins.FetchLastInsertID) if err != nil { return nil, err } diff --git a/go/vt/vtgate/engine/insert_select.go b/go/vt/vtgate/engine/insert_select.go index bccee5f2cf9..af834858175 100644 --- a/go/vt/vtgate/engine/insert_select.go +++ b/go/vt/vtgate/engine/insert_select.go @@ -51,7 +51,7 @@ type ( } ) -// newInsertSelect creates a new InsertSelect. +// newInsertSelect creates a new InsertSelect. Used in testing. func newInsertSelect( ignore bool, keyspace *vindexes.Keyspace, diff --git a/go/vt/vtgate/engine/primitive.go b/go/vt/vtgate/engine/primitive.go index e6fa102581e..7734dd81a6b 100644 --- a/go/vt/vtgate/engine/primitive.go +++ b/go/vt/vtgate/engine/primitive.go @@ -147,6 +147,8 @@ type ( // RecordMirrorStats is used to record stats about a mirror query. RecordMirrorStats(time.Duration, time.Duration, error) + + SetLastInsertID(uint64) } // SessionActions gives primitives ability to interact with the session state diff --git a/go/vt/vtgate/engine/set.go b/go/vt/vtgate/engine/set.go index 95fb5c87a32..f0de330cbed 100644 --- a/go/vt/vtgate/engine/set.go +++ b/go/vt/vtgate/engine/set.go @@ -22,23 +22,18 @@ import ( "fmt" "strings" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/sysvars" - - vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" - - "vitess.io/vitess/go/vt/log" - - "vitess.io/vitess/go/vt/srvtopo" - - "vitess.io/vitess/go/vt/vtgate/evalengine" - "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/log" querypb "vitess.io/vitess/go/vt/proto/query" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/schema" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/srvtopo" + "vitess.io/vitess/go/vt/sysvars" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vtgate/vindexes" ) diff --git a/go/vt/vtgate/evalengine/cached_size.go b/go/vt/vtgate/evalengine/cached_size.go index c1ed1f9475c..d51c65c75b4 100644 --- a/go/vt/vtgate/evalengine/cached_size.go +++ b/go/vt/vtgate/evalengine/cached_size.go @@ -1181,6 +1181,18 @@ func (cached *builtinLastDay) CachedSize(alloc bool) int64 { size += cached.CallExpr.CachedSize(false) return size } +func (cached *builtinLastInsertID) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(48) + } + // field CallExpr vitess.io/vitess/go/vt/vtgate/evalengine.CallExpr + size += cached.CallExpr.CachedSize(false) + return size +} func (cached *builtinLeftRight) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/evalengine/compiler_asm.go b/go/vt/vtgate/evalengine/compiler_asm.go index dfb1a30bffc..7dda215353f 100644 --- a/go/vt/vtgate/evalengine/compiler_asm.go +++ b/go/vt/vtgate/evalengine/compiler_asm.go @@ -5138,3 +5138,18 @@ func (asm *assembler) Introduce(offset int, t sqltypes.Type, col collations.Type return 1 }, "INTRODUCE (SP-1)") } + +func (asm *assembler) Fn_LAST_INSERT_ID() { + asm.emit(func(env *ExpressionEnv) int { + arg := env.vm.stack[env.vm.sp-1] + if arg == nil { + env.VCursor().SetLastInsertID(0) + } else { + iarg := evalToInt64(arg) + uarg := env.vm.arena.newEvalUint64(uint64(iarg.i)) + env.vm.stack[env.vm.sp-1] = uarg + env.VCursor().SetLastInsertID(uarg.u) + } + return 1 + }, "FN LAST_INSERT_ID UINT64(SP-1)") +} diff --git a/go/vt/vtgate/evalengine/compiler_test.go b/go/vt/vtgate/evalengine/compiler_test.go index 88c13a479ed..7396529dcf1 100644 --- a/go/vt/vtgate/evalengine/compiler_test.go +++ b/go/vt/vtgate/evalengine/compiler_test.go @@ -903,6 +903,99 @@ func TestBindVarLiteral(t *testing.T) { } } +type testVcursor struct { + lastInsertID *uint64 + env *vtenv.Environment +} + +func (t *testVcursor) TimeZone() *time.Location { + return time.UTC +} + +func (t *testVcursor) GetKeyspace() string { + return "apa" +} + +func (t *testVcursor) SQLMode() string { + return "oltp" +} + +func (t *testVcursor) Environment() *vtenv.Environment { + return t.env +} + +func (t *testVcursor) SetLastInsertID(id uint64) { + t.lastInsertID = &id +} + +var _ evalengine.VCursor = (*testVcursor)(nil) + +func TestLastInsertID(t *testing.T) { + var testCases = []struct { + expression string + result uint64 + missing bool + }{ + { + expression: `last_insert_id(1)`, + result: 1, + }, { + expression: `12`, + missing: true, + }, { + expression: `last_insert_id(666)`, + result: 666, + }, { + expression: `last_insert_id(null)`, + result: 0, + }, + } + + venv := vtenv.NewTestEnv() + for _, tc := range testCases { + t.Run(tc.expression, func(t *testing.T) { + expr, err := venv.Parser().ParseExpr(tc.expression) + require.NoError(t, err) + + cfg := &evalengine.Config{ + Collation: collations.CollationUtf8mb4ID, + NoConstantFolding: true, + NoCompilation: false, + Environment: venv, + } + t.Run("eval", func(t *testing.T) { + cfg.NoCompilation = true + runTest(t, expr, cfg, tc) + }) + t.Run("compiled", func(t *testing.T) { + cfg.NoCompilation = false + runTest(t, expr, cfg, tc) + }) + }) + } +} + +func runTest(t *testing.T, expr sqlparser.Expr, cfg *evalengine.Config, tc struct { + expression string + result uint64 + missing bool +}) { + converted, err := evalengine.Translate(expr, cfg) + require.NoError(t, err) + + vc := &testVcursor{env: vtenv.NewTestEnv()} + env := evalengine.NewExpressionEnv(context.Background(), nil, vc) + + _, err = env.Evaluate(converted) + require.NoError(t, err) + if tc.missing { + require.Nil(t, vc.lastInsertID) + } else { + require.NotNil(t, vc.lastInsertID) + require.Equal(t, tc.result, *vc.lastInsertID) + } +} + func TestCompilerNonConstant(t *testing.T) { var testCases = []struct { expression string diff --git a/go/vt/vtgate/evalengine/expr_env.go b/go/vt/vtgate/evalengine/expr_env.go index 38a65f9b4e0..4a7f9849ab0 100644 --- a/go/vt/vtgate/evalengine/expr_env.go +++ b/go/vt/vtgate/evalengine/expr_env.go @@ -35,6 +35,7 @@ type VCursor interface { GetKeyspace() string SQLMode() string Environment() *vtenv.Environment + SetLastInsertID(id uint64) } type ( @@ -140,6 +141,7 @@ func (e *emptyVCursor) GetKeyspace() string { func (e *emptyVCursor) SQLMode() string { return config.DefaultSQLMode } +func (e *emptyVCursor) SetLastInsertID(_ uint64) {} func NewEmptyVCursor(env *vtenv.Environment, tz *time.Location) VCursor { return &emptyVCursor{env: env, tz: tz} diff --git a/go/vt/vtgate/evalengine/fn_misc.go b/go/vt/vtgate/evalengine/fn_misc.go index 8813b62f823..2a2119ee6f4 100644 --- a/go/vt/vtgate/evalengine/fn_misc.go +++ b/go/vt/vtgate/evalengine/fn_misc.go @@ -81,6 +81,10 @@ type ( builtinUUIDToBin struct { CallExpr } + + builtinLastInsertID struct { + CallExpr + } ) var _ IR = (*builtinInetAton)(nil) @@ -95,6 +99,7 @@ var _ IR = (*builtinBinToUUID)(nil) var _ IR = (*builtinIsUUID)(nil) var _ IR = (*builtinUUID)(nil) var _ IR = (*builtinUUIDToBin)(nil) +var _ IR = (*builtinLastInsertID)(nil) func (call *builtinInetAton) eval(env *ExpressionEnv) (eval, error) { arg, err := call.arg1(env) @@ -194,6 +199,33 @@ func (call *builtinInet6Aton) compile(c *compiler) (ctype, error) { return ctype{Type: sqltypes.VarBinary, Flag: flagNullable, Col: collationBinary}, nil } +func (call *builtinLastInsertID) eval(env *ExpressionEnv) (eval, error) { + arg, err := call.arg1(env) + if err != nil { + return nil, err + } + if arg == nil { + env.VCursor().SetLastInsertID(0) + return nil, err + } + insertID := uint64(evalToInt64(arg).i) + env.VCursor().SetLastInsertID(insertID) + return newEvalUint64(insertID), nil +} + +func (call *builtinLastInsertID) compile(c *compiler) (ctype, error) { + arg, err := call.Arguments[0].compile(c) + if err != nil { + return ctype{}, err + } + c.asm.Fn_LAST_INSERT_ID() + return ctype{Type: sqltypes.Uint64, Flag: arg.Flag & flagNullable, Col: collationNumeric}, nil +} + +func (call *builtinLastInsertID) constant() bool { + return false // we don't want this function to be simplified away +} + func printIPv6AsIPv4(addr netip.Addr) (netip.Addr, bool) { b := addr.AsSlice() if len(b) != 16 { diff --git a/go/vt/vtgate/evalengine/integration/comparison_test.go b/go/vt/vtgate/evalengine/integration/comparison_test.go index ea327601975..d559cb8ab1d 100644 --- a/go/vt/vtgate/evalengine/integration/comparison_test.go +++ b/go/vt/vtgate/evalengine/integration/comparison_test.go @@ -209,6 +209,10 @@ type vcursor struct { env *vtenv.Environment } +func (vc *vcursor) SetLastInsertID(id uint64) {} + +var _ evalengine.VCursor = (*vcursor)(nil) + func (vc *vcursor) GetKeyspace() string { return "vttest" } diff --git a/go/vt/vtgate/evalengine/translate_builtin.go b/go/vt/vtgate/evalengine/translate_builtin.go index 476ee32483b..1f8bd7798aa 100644 --- a/go/vt/vtgate/evalengine/translate_builtin.go +++ b/go/vt/vtgate/evalengine/translate_builtin.go @@ -662,6 +662,11 @@ func (ast *astCompiler) translateFuncExpr(fn *sqlparser.FuncExpr) (IR, error) { return nil, argError(method) } return &builtinReplace{CallExpr: call, collate: ast.cfg.Collation}, nil + case "last_insert_id": + if len(args) != 1 { + return nil, argError(method) + } + return &builtinLastInsertID{CallExpr: call}, nil default: return nil, translateExprNotSupported(fn) } diff --git a/go/vt/vtgate/executorcontext/vcursor_impl.go b/go/vt/vtgate/executorcontext/vcursor_impl.go index df989fd7a67..3f8d7def797 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl.go @@ -1594,3 +1594,9 @@ func (vc *VCursorImpl) GetContextWithTimeOut(ctx context.Context) (context.Conte func (vc *VCursorImpl) IgnoreMaxMemoryRows() bool { return vc.ignoreMaxMemoryRows } + +func (vc *VCursorImpl) SetLastInsertID(id uint64) { + vc.SafeSession.mu.Lock() + defer vc.SafeSession.mu.Unlock() + vc.SafeSession.LastInsertId = id +} diff --git a/go/vt/vtgate/planbuilder/insert.go b/go/vt/vtgate/planbuilder/insert.go index 80516871623..d3ad5afac72 100644 --- a/go/vt/vtgate/planbuilder/insert.go +++ b/go/vt/vtgate/planbuilder/insert.go @@ -51,7 +51,7 @@ func gen4InsertStmtPlanner(version querypb.ExecuteOptions_PlannerVersion, insStm } if ks != nil { if tables[0].AutoIncrement == nil && !ctx.SemTable.ForeignKeysPresent() { - plan := insertUnshardedShortcut(insStmt, ks, tables) + plan := insertUnshardedShortcut(ctx, insStmt, ks, tables) setCommentDirectivesOnPlan(plan, insStmt) return newPlanResult(plan, operators.QualifiedTables(ks, tables)...), nil } @@ -90,12 +90,13 @@ func errOutIfPlanCannotBeConstructed(ctx *plancontext.PlanningContext, vTbl *vin return ctx.SemTable.NotUnshardedErr } -func insertUnshardedShortcut(stmt *sqlparser.Insert, ks *vindexes.Keyspace, tables []*vindexes.Table) engine.Primitive { +func insertUnshardedShortcut(ctx *plancontext.PlanningContext, stmt *sqlparser.Insert, ks *vindexes.Keyspace, tables []*vindexes.Table) engine.Primitive { eIns := &engine.Insert{ InsertCommon: engine.InsertCommon{ - Opcode: engine.InsertUnsharded, - Keyspace: ks, - TableName: tables[0].Name.String(), + Opcode: engine.InsertUnsharded, + Keyspace: ks, + TableName: tables[0].Name.String(), + FetchLastInsertID: ctx.SemTable.ShouldFetchLastInsertID(), }, } eIns.Query = generateQuery(stmt) diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index bc71c7195b4..b51eac449fc 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -190,6 +190,7 @@ func transformInsertionSelection(ctx *plancontext.PlanningContext, op *operators ForceNonStreaming: op.ForceNonStreaming, Generate: autoIncGenerate(ins.AutoIncrement), ColVindexes: ins.ColVindexes, + FetchLastInsertID: ctx.SemTable.ShouldFetchLastInsertID(), }, VindexValueOffset: ins.VindexValueOffset, } @@ -659,9 +660,8 @@ func buildInsertPrimitive( } eins := &engine.Insert{ - InsertCommon: ic, - VindexValues: ins.VindexValues, - FetchLastInsertID: ctx.SemTable.ShouldFetchLastInsertID(), + InsertCommon: ic, + VindexValues: ins.VindexValues, } // we would need to generate the query on the fly. The only exception here is diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 49a03a8f05a..1ecbf3d4ff9 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -6160,6 +6160,44 @@ ] } }, + { + "comment": "last_insert_id on aggregation calculated at the vtgate level", + "query": "select last_insert_id(count(*)) from user", + "plan": { + "QueryType": "SELECT", + "Original": "select last_insert_id(count(*)) from user", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "last_insert_id(count(*)) as last_insert_id(count(*))" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum_count_star(0) AS count(*)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FetchLastInsertID": true, + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, { "comment": "aggregation on top of aggregation works fine", "query": "select distinct count(*) from user, (select distinct count(*) from user) X", diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.json b/go/vt/vtgate/planbuilder/testdata/dml_cases.json index 8893b4df0c0..95cb14e38f5 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.json @@ -2648,6 +2648,30 @@ }, "skip_e2e": true }, + { + "comment": "insert using last_insert_id with argument (already an e2e test for this plan)", + "query": "insert into unsharded values(last_insert_id(789), 2)", + "plan": { + "QueryType": "INSERT", + "Original": "insert into unsharded values(last_insert_id(789), 2)", + "Instructions": { + "OperatorType": "Insert", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "FetchLastInsertID": true, + "Query": "insert into unsharded values (last_insert_id(789), 2)", + "TableName": "unsharded" + }, + "TablesUsed": [ + "main.unsharded" + ] + }, + "skip_e2e": true + }, { "comment": "update vindex value to null with multiple primary keyspace id", "query": "update user set name = null where id in (1, 2, 3)", diff --git a/go/vt/vtgate/planbuilder/testdata/set_cases.json b/go/vt/vtgate/planbuilder/testdata/set_cases.json index 58cb2fffa75..02c5603a03c 100644 --- a/go/vt/vtgate/planbuilder/testdata/set_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/set_cases.json @@ -605,5 +605,28 @@ ] } } + }, + { + "comment": "set last_insert_id with agrument to user defined variable", + "query": "set @foo = last_insert_id(1)", + "plan": { + "QueryType": "SET", + "Original": "set @foo = last_insert_id(1)", + "Instructions": { + "OperatorType": "Set", + "Ops": [ + { + "Type": "UserDefinedVariable", + "Name": "foo", + "Expr": "last_insert_id(1)" + } + ], + "Inputs": [ + { + "OperatorType": "SingleRow" + } + ] + } + } } ] From 513a0671bd27aaccb28706fa6df803e8598789c4 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 8 Jan 2025 19:30:57 +0530 Subject: [PATCH 10/66] [Java] Fix dependency issues in Java package (#17481) Signed-off-by: Harshit Gangal --- java/example/pom.xml | 2 +- java/grpc-client/src/test/resources/ca.config | 3 +++ java/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/java/example/pom.xml b/java/example/pom.xml index fa3220f51bd..fabab27dd77 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -32,7 +32,7 @@ mysql mysql-connector-java - 8.0.28 + 8.0.33 false diff --git a/java/grpc-client/src/test/resources/ca.config b/java/grpc-client/src/test/resources/ca.config index e0955f28ccf..c5758831e06 100644 --- a/java/grpc-client/src/test/resources/ca.config +++ b/java/grpc-client/src/test/resources/ca.config @@ -2,6 +2,7 @@ default_bits = 1024 default_keyfile = keyfile.pem distinguished_name = req_distinguished_name + x509_extensions = v3_ca attributes = req_attributes prompt = no output_password = mypass @@ -15,3 +16,5 @@ emailAddress = test@email.address [ req_attributes ] challengePassword = A challenge password +[ v3_ca ] + basicConstraints = CA:TRUE diff --git a/java/pom.xml b/java/pom.xml index 6742258a6b8..e68bbd5574e 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -72,8 +72,8 @@ 4.1.110.Final 2.0.65.Final - 4.28.3 - 3.24.3 + 3.25.5 + 3.25.5 3.0.0 2.24.1 From 6d35e825cec4b1deb9fc69591c581fdc61eb0731 Mon Sep 17 00:00:00 2001 From: Shail Pujan <114280481+shailpujan88@users.noreply.github.com> Date: Wed, 8 Jan 2025 19:31:40 +0530 Subject: [PATCH 11/66] Added the initial script for the 40x example for backup and restore (#16893) Signed-off-by: Shail Pujan Signed-off-by: Florent Poinsard Signed-off-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Florent Poinsard Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> --- examples/local/401_backup.sh | 40 ++++++++++++++++ examples/local/402_list_backup.sh | 28 +++++++++++ examples/local/403_restore_from_backup.sh | 46 +++++++++++++++++++ .../{401_teardown.sh => 501_teardown.sh} | 0 test/local_example.sh | 8 +++- 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100755 examples/local/401_backup.sh create mode 100755 examples/local/402_list_backup.sh create mode 100755 examples/local/403_restore_from_backup.sh rename examples/local/{401_teardown.sh => 501_teardown.sh} (100%) diff --git a/examples/local/401_backup.sh b/examples/local/401_backup.sh new file mode 100755 index 00000000000..1529440ea26 --- /dev/null +++ b/examples/local/401_backup.sh @@ -0,0 +1,40 @@ +# Copyright 2025 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script takes backups of the 'customer' keyspace and all its shards. + +# Load common environment variables and functions +source ../common/env.sh + +# Set keyspace and shard details for the 'customer' keyspace +KEYSPACE="customer" +SHARDS=("-80" "80-") + +# Ensure the keyspace and shards are healthy +echo "Ensuring keyspace $KEYSPACE exists and shards are healthy..." +for shard in "${SHARDS[@]}"; do + if ! wait_for_healthy_shard "$KEYSPACE" "$shard"; then + echo "Shard $shard is not healthy. Exiting..." + exit 1 + fi +done + +# Backup all shards of the customer keyspace +for shard in "${SHARDS[@]}"; do + echo "Backing up shard $shard in keyspace $KEYSPACE..." + vtctldclient BackupShard "$KEYSPACE/$shard" || fail "Backup failed for shard $shard." + echo "Backup succeeded for shard $shard." +done + +echo "Backup process completed successfully for all shards in $KEYSPACE." diff --git a/examples/local/402_list_backup.sh b/examples/local/402_list_backup.sh new file mode 100755 index 00000000000..c19dc5f6df1 --- /dev/null +++ b/examples/local/402_list_backup.sh @@ -0,0 +1,28 @@ +# Copyright 2025 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Load common environment variables and functions +source ../common/env.sh # Import necessary environment variables and functions from a common script + +# Set keyspace and shard details for the 'customer' keyspace +KEYSPACE="customer" # Define the keyspace to work with +SHARDS=("-80" "80-") # Define the shards within the keyspace to list backups for + +# List backups for each shard +for shard in "${SHARDS[@]}"; do # Loop through each shard defined earlier + echo "Listing available backups for keyspace $KEYSPACE and shard $shard..." # Log the start of the backup listing + vtctldclient GetBackups "$KEYSPACE/$shard" || echo "Failed to list backups for keyspace $KEYSPACE and shard $shard" # Attempt to list backups; log failure if it occurs +done + +echo "Backup listing process completed." # Log completion of the backup listing process diff --git a/examples/local/403_restore_from_backup.sh b/examples/local/403_restore_from_backup.sh new file mode 100755 index 00000000000..73fafd34aa0 --- /dev/null +++ b/examples/local/403_restore_from_backup.sh @@ -0,0 +1,46 @@ +# Copyright 2025 The Vitess Authors. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script restores the first replica tablet from backups for the 'customer' keyspace. + +# Load common environment variables and functions +source ../common/env.sh # Import necessary environment variables and functions from a common script + +# Set keyspace and shard details for the 'customer' keyspace +KEYSPACE="customer" # Define the keyspace to work with +SHARDS=("-80" "80-") # Define the shards within the keyspace to restore + +# Restore all shards of the customer keyspace from backups +for shard in "${SHARDS[@]}"; do # Loop through each shard defined earlier + echo "Finding replica tablets for shard $shard..." # Log the start of the tablet search + + # Fetch the list of replica tablets for the current shard + REPLICA_TABLETS=$(vtctldclient GetTablets --keyspace="$KEYSPACE" --shard="$shard" --tablet-type=replica | awk '{print $1}') # Extract the first column containing tablet names + REPLICA_COUNT=$(echo "$REPLICA_TABLETS" | wc -l) # Count the number of replica tablets found + + # Check if any replica tablets were found + if [ "$REPLICA_COUNT" -lt 1 ]; then # If the count is less than 1, no replicas were found + echo "No replica tablets found for shard $shard. Exiting..." # Log a message and exit if none are found + exit 1 # Exit the script with an error code + fi + + # Choose the first replica for restoration + RESTORE_TABLET=$(echo "$REPLICA_TABLETS" | head -n 1) # Select the first replica tablet from the list + echo "Restoring tablet $RESTORE_TABLET from backup for shard $shard..." # Log the restoration action + + # Restore from backup and handle any failures + vtctldclient RestoreFromBackup "$RESTORE_TABLET" || fail "Restore failed for tablet $RESTORE_TABLET" # Attempt to restore from backup and log an error message if it fails +done + +echo "Restore process completed successfully for $KEYSPACE." # Log completion of the restore process diff --git a/examples/local/401_teardown.sh b/examples/local/501_teardown.sh similarity index 100% rename from examples/local/401_teardown.sh rename to examples/local/501_teardown.sh diff --git a/test/local_example.sh b/test/local_example.sh index 391e75a9224..27f512a34eb 100755 --- a/test/local_example.sh +++ b/test/local_example.sh @@ -98,5 +98,11 @@ mysql --table < ../common/select_customer80-_data.sql ./306_down_shard_0.sh -./401_teardown.sh +./401_backup.sh + +./402_list_backup.sh + +./403_restore_from_backup.sh + +./501_teardown.sh From 06def1405671266d64ac93832a755dc2c245fe32 Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Wed, 8 Jan 2025 15:48:46 +0100 Subject: [PATCH 12/66] Fix crash in the evalengine (#17487) Signed-off-by: Dirkjan Bussink --- go/vt/vtgate/evalengine/arena.go | 4 ++-- go/vt/vtgate/evalengine/compiler_test.go | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/go/vt/vtgate/evalengine/arena.go b/go/vt/vtgate/evalengine/arena.go index ccfe63f514f..c5457f076e8 100644 --- a/go/vt/vtgate/evalengine/arena.go +++ b/go/vt/vtgate/evalengine/arena.go @@ -71,7 +71,7 @@ func (a *Arena) newEvalEnum(raw []byte, values *EnumSetValues) *evalEnum { } else { a.aEnum = append(a.aEnum, evalEnum{}) } - val := &a.aEnum[len(a.aInt64)-1] + val := &a.aEnum[len(a.aEnum)-1] s := string(raw) val.string = s val.value = valueIdx(values, s) @@ -84,7 +84,7 @@ func (a *Arena) newEvalSet(raw []byte, values *EnumSetValues) *evalSet { } else { a.aSet = append(a.aSet, evalSet{}) } - val := &a.aSet[len(a.aInt64)-1] + val := &a.aSet[len(a.aSet)-1] s := string(raw) val.string = s val.set = evalSetBits(values, s) diff --git a/go/vt/vtgate/evalengine/compiler_test.go b/go/vt/vtgate/evalengine/compiler_test.go index 7396529dcf1..343bb0cd043 100644 --- a/go/vt/vtgate/evalengine/compiler_test.go +++ b/go/vt/vtgate/evalengine/compiler_test.go @@ -760,6 +760,20 @@ func TestCompilerSingle(t *testing.T) { expression: `WEEK(timestamp '2024-01-01 10:34:58', 1)`, result: `INT64(1)`, }, + { + expression: `column0 + 1`, + values: []sqltypes.Value{sqltypes.MakeTrusted(sqltypes.Enum, []byte("foo"))}, + // Returns 0, as unknown enums evaluate here to -1. We have this test to + // exercise the path to push enums onto the stack. + result: `FLOAT64(0)`, + }, + { + expression: `column0 + 1`, + values: []sqltypes.Value{sqltypes.MakeTrusted(sqltypes.Set, []byte("foo"))}, + // Returns 1, as unknown sets evaluate here to 0. We have this test to + // exercise the path to push sets onto the stack. + result: `FLOAT64(1)`, + }, } tz, _ := time.LoadLocation("Europe/Madrid") From b865d138eec37d492bc465a7060564e395c0a7e5 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 9 Jan 2025 10:32:06 +0530 Subject: [PATCH 13/66] split upgrade downgrade queries test to 2 CI workflows (#17464) Signed-off-by: Harshit Gangal --- .../upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_onlineddl_flow.yml | 2 +- ...e_downgrade_test_query_serving_queries.yml | 2 +- ...downgrade_test_query_serving_queries_2.yml | 212 ++++++++++++++++++ ...t_query_serving_queries_2_next_release.yml | 208 +++++++++++++++++ ...de_downgrade_test_query_serving_schema.yml | 2 +- ...rade_downgrade_test_reparent_old_vtctl.yml | 2 +- ...e_downgrade_test_reparent_old_vttablet.yml | 2 +- .../upgrade_downgrade_test_semi_sync.yml | 2 +- test/config.json | 16 +- 11 files changed, 436 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml create mode 100644 .github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index a56aad2f523..0c558b00684 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 00aab1b78ff..680b0da87e0 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -76,7 +76,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index 72426e70a61..dd389663a35 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -83,7 +83,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 5ac1a55334c..e4ccc793933 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml new file mode 100644 index 00000000000..87a78d0b659 --- /dev/null +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml @@ -0,0 +1,212 @@ +name: Query Serving (Queries - 2) - Upgrade Downgrade Testing +on: + push: + pull_request: + +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Upgrade Downgrade Testing Query Serving (Queries - 2)') + cancel-in-progress: true + +permissions: read-all + +# This test ensures that our end-to-end tests work using Vitess components +# (vtgate, vttablet, etc) built on different versions. + +jobs: + + upgrade_downgrade_test: + name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) + runs-on: gh-hosted-runners-16cores-1-24.04 + + steps: + - name: Skip CI + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then + echo "skipping CI due to the 'Skip CI' label" + exit 1 + fi + + - name: Check if workflow needs to be skipped + id: skip-workflow + run: | + skip='false' + if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then + skip='true' + fi + echo Skip ${skip} + echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT + + - name: Check out commit's code + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + fetch-depth: 0 + + - name: Set output with latest release branch + id: output-previous-release-ref + if: steps.skip-workflow.outputs.skip-workflow == 'false' + run: | + previous_release_ref=$(./tools/get_previous_release.sh ${{github.base_ref}} ${{github.ref}}) + echo $previous_release_ref + echo "previous_release_ref=${previous_release_ref}" >> $GITHUB_OUTPUT + + - name: Check for changes in relevant files + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 + id: changes + with: + token: '' + filters: | + end_to_end: + - 'go/**' + - 'go/**/*.go' + - 'test.go' + - 'Makefile' + - 'build.env' + - 'go.sum' + - 'go.mod' + - 'proto/*.proto' + - 'tools/**' + - 'config/**' + - 'bootstrap.sh' + - '.github/workflows/upgrade_downgrade_test_query_serving_queries.yml' + + - name: Set up Go + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version: 1.23.4 + + - name: Set up python + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + + - name: Tune the OS + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" + + - name: Get base dependencies + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + sudo DEBIAN_FRONTEND="noninteractive" apt-get update + # Uninstall any previously installed MySQL first + sudo systemctl stop apparmor + sudo DEBIAN_FRONTEND="noninteractive" apt-get remove -y --purge mysql-server mysql-client mysql-common + sudo apt-get -y autoremove + sudo apt-get -y autoclean + sudo deluser mysql + sudo rm -rf /var/lib/mysql + sudo rm -rf /etc/mysql + # Install mysql80 + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get update + sudo DEBIAN_FRONTEND="noninteractive" apt-get install -y mysql-server mysql-client + # Install everything else we need, and configure + sudo apt-get install -y make unzip g++ etcd-client etcd-server curl git wget eatmydata + sudo service mysql stop + sudo service etcd stop + sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 + sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ + sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" + + # install JUnit report formatter + go install github.com/vitessio/go-junit-report@HEAD + + # Build current commit's binaries + - name: Get dependencies for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + go mod download + + - name: Building the binaries for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 + run: | + source build.env + NOVTADMINBUILD=1 make build + mkdir -p /tmp/vitess-build-current/ + cp -R bin /tmp/vitess-build-current/ + rm -Rf bin/* + + # Checkout to the last release of Vitess + - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + + - name: Get dependencies for the last release + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + go mod download + + - name: Building last release's binaries + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 + run: | + source build.env + NOVTADMINBUILD=1 make build + mkdir -p /tmp/vitess-build-other/ + cp -R bin /tmp/vitess-build-other/ + rm -Rf bin/* + + - name: Convert ErrorContains checks to Error checks + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + + + # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n + - name: Use last release's VTGate + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + source build.env + + cp -r /tmp/vitess-build-current/bin/* $PWD/bin/ + rm -f $PWD/bin/vtgate + cp /tmp/vitess-build-other/bin/vtgate $PWD/bin/vtgate + vtgate --version + + # Running a test with vtgate at version n-1 and vttablet/vtctld at version n + - name: Run query serving tests (vtgate=N-1, vttablet=N, vtctld=N) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + rm -rf /tmp/vtdataroot + mkdir -p /tmp/vtdataroot + + source build.env + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries_2 + + # Swap the binaries again. This time, vtgate will be at version n, and vttablet/vtctld will be at version n-1 + - name: Use current version VTGate, and other version VTTablet/VTctld + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + source build.env + + rm -f $PWD/bin/vtgate $PWD/bin/vttablet $PWD/bin/mysqlctl $PWD/bin/mysqlctld + cp /tmp/vitess-build-current/bin/vtgate $PWD/bin/vtgate + + cp /tmp/vitess-build-other/bin/vtctld $PWD/bin + cp /tmp/vitess-build-other/bin/vtctldclient $PWD/bin + cp /tmp/vitess-build-other/bin/vtctl $PWD/bin + cp /tmp/vitess-build-other/bin/vtctlclient $PWD/bin + + cp /tmp/vitess-build-other/bin/vttablet $PWD/bin/vttablet + cp /tmp/vitess-build-other/bin/mysqlctl $PWD/bin/mysqlctl + cp /tmp/vitess-build-other/bin/mysqlctld $PWD/bin/mysqlctld + vtgate --version + vttablet --version + + # Running a test with vtgate at version n and vttablet/vtctld at version n-1 + - name: Run query serving tests (vtgate=N, vttablet=N-1, vtctld=N-1) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + rm -rf /tmp/vtdataroot + mkdir -p /tmp/vtdataroot + + source build.env + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries_2 diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml new file mode 100644 index 00000000000..d3cfc662b5b --- /dev/null +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml @@ -0,0 +1,208 @@ +name: Query Serving (Queries - 2) Next Release - Upgrade Downgrade Testing +on: + push: + pull_request: + +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Upgrade Downgrade Testing Query Serving (Queries - 2) Next Release') + cancel-in-progress: true + +permissions: read-all + +# This test ensures that our end-to-end tests work using Vitess components +# (vtgate, vttablet, etc) built on different versions. + +jobs: + + upgrade_downgrade_test: + name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) Next Release + runs-on: gh-hosted-runners-16cores-1-24.04 + + steps: + - name: Skip CI + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then + echo "skipping CI due to the 'Skip CI' label" + exit 1 + fi + + - name: Check out commit's code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + fetch-depth: 0 + + - name: Set output with latest release branch + id: output-next-release-ref + run: | + next_release_ref=$(./tools/get_next_release.sh ${{github.base_ref}} ${{github.ref}}) + echo $next_release_ref + echo "next_release_ref=${next_release_ref}" >> $GITHUB_OUTPUT + + - name: Check if workflow needs to be skipped + id: skip-workflow + run: | + skip='false' + if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then + skip='true' + fi + if [[ "${{steps.output-next-release-ref.outputs.next_release_ref}}" == "" ]]; then + skip='true' + fi + echo Skip ${skip} + echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT + + - name: Check for changes in relevant files + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 + id: changes + with: + token: '' + filters: | + end_to_end: + - 'go/**' + - 'go/**/*.go' + - 'test.go' + - 'Makefile' + - 'build.env' + - 'go.sum' + - 'go.mod' + - 'proto/*.proto' + - 'tools/**' + - 'config/**' + - 'bootstrap.sh' + - '.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml' + + - name: Set up Go + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version-file: go.mod + + - name: Set up python + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + + - name: Tune the OS + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" + + - name: Get base dependencies + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + sudo DEBIAN_FRONTEND="noninteractive" apt-get update + # Uninstall any nextly installed MySQL first + sudo systemctl stop apparmor + sudo DEBIAN_FRONTEND="noninteractive" apt-get remove -y --purge mysql-server mysql-client mysql-common + sudo apt-get -y autoremove + sudo apt-get -y autoclean + sudo deluser mysql + sudo rm -rf /var/lib/mysql + sudo rm -rf /etc/mysql + # Install mysql80 + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get update + sudo DEBIAN_FRONTEND="noninteractive" apt-get install -y mysql-server mysql-client + # Install everything else we need, and configure + sudo apt-get install -y make unzip g++ etcd-client etcd-server curl git wget eatmydata + sudo service mysql stop + sudo service etcd stop + sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 + sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ + sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" + + # install JUnit report formatter + go install github.com/vitessio/go-junit-report@HEAD + + # Checkout to the next release of Vitess + - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + + - name: Get dependencies for the next release + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + go mod download + + - name: Building next release's binaries + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 + run: | + source build.env + NOVTADMINBUILD=1 make build + mkdir -p /tmp/vitess-build-other/ + cp -R bin /tmp/vitess-build-other/ + rm -Rf bin/* + + # Checkout to this build's commit + - name: Check out commit's code + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Get dependencies for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + go mod download + + - name: Building the binaries for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 + run: | + source build.env + NOVTADMINBUILD=1 make build + mkdir -p /tmp/vitess-build-current/ + cp -R bin /tmp/vitess-build-current/ + + - name: Convert ErrorContains checks to Error checks + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + + + # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n + - name: Use next release's VTGate + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + source build.env + rm -f $PWD/bin/vtgate + cp /tmp/vitess-build-other/bin/vtgate $PWD/bin/vtgate + vtgate --version + + # Running a test with vtgate at version n+1 and vttablet at version n + - name: Run query serving tests (vtgate=N+1, vttablet=N) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + rm -rf /tmp/vtdataroot + mkdir -p /tmp/vtdataroot + + source build.env + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries_2 + + # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n+1 + - name: Use current version VTGate, and other version VTTablet + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + source build.env + + rm -f $PWD/bin/vtgate $PWD/bin/vttablet $PWD/bin/mysqlctl $PWD/bin/mysqlctld + cp /tmp/vitess-build-current/bin/vtgate $PWD/bin/vtgate + cp /tmp/vitess-build-other/bin/vttablet $PWD/bin/vttablet + cp /tmp/vitess-build-other/bin/mysqlctl $PWD/bin/mysqlctl + cp /tmp/vitess-build-other/bin/mysqlctld $PWD/bin/mysqlctld + vtgate --version + vttablet --version + + # Running a test with vtgate at version n and vttablet at version n+1 + - name: Run query serving tests (vtgate=N, vttablet=N+1) + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + rm -rf /tmp/vtdataroot + mkdir -p /tmp/vtdataroot + + source build.env + eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries_2 diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 4b5fad0ab29..5616c247888 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 701025d7ecc..532be0b998e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 8b121d4af10..2804e757652 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index f12e323654e..76706f77b65 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.7 + go-version: 1.23.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/config.json b/test/config.json index 1fe200b8dbb..dfc0910f10e 100644 --- a/test/config.json +++ b/test/config.json @@ -604,7 +604,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 2, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_subquery": { "File": "unused.go", @@ -613,7 +613,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 2, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_union": { "File": "unused.go", @@ -622,7 +622,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 2, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_insert": { "File": "unused.go", @@ -631,7 +631,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 2, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_vexplain": { "File": "unused.go", @@ -640,7 +640,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 2, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_reference": { "File": "unused.go", @@ -649,7 +649,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 1, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_queries_random": { "File": "unused.go", @@ -658,7 +658,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 1, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_kill": { "File": "unused.go", @@ -667,7 +667,7 @@ "Manual": false, "Shard": "vtgate_queries", "RetryMax": 1, - "Tags": ["upgrade_downgrade_query_serving_queries"] + "Tags": ["upgrade_downgrade_query_serving_queries_2"] }, "vtgate_concurrentdml": { "File": "unused.go", From aabf1c9b907691f3c26eab3d75ca123b66735bcc Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:05:27 +0200 Subject: [PATCH 14/66] CI: fix to Online DDL flow test, do not t.Log from within a goroutine (#17496) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go b/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go index ee8141860f4..d34b63b833b 100644 --- a/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go +++ b/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go @@ -244,7 +244,7 @@ func TestOnlineDDLFlow(t *testing.T) { select { case <-ticker.C: case <-workloadCtx.Done(): - t.Logf("Terminating routine throttler check") + fmt.Println("Terminating routine throttler check") return } } @@ -258,8 +258,8 @@ func TestOnlineDDLFlow(t *testing.T) { wg.Add(1) go func() { defer cancel() - defer t.Logf("Terminating workload") defer wg.Done() + defer fmt.Println("Terminating workload") runMultipleConnections(workloadCtx, t) }() }) From 8fe04c52e55da75e011700c78fc1aadc9cc0a0bc Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 10 Jan 2025 10:06:37 +0530 Subject: [PATCH 15/66] connection pool: max idle connections implementation (#17443) Signed-off-by: Harshit Gangal --- changelog/22.0/22.0.0/summary.md | 12 ++++ go/flags/endtoend/vtcombo.txt | 3 + go/flags/endtoend/vttablet.txt | 3 + go/pools/smartconnpool/pool.go | 48 +++++++++++++++ go/pools/smartconnpool/pool_test.go | 45 ++++++++++++++ go/vt/vttablet/tabletserver/connpool/pool.go | 1 + .../tabletserver/connpool/pool_test.go | 58 ++++++++++++++++++- .../vttablet/tabletserver/tabletenv/config.go | 13 ++++- .../tabletserver/tabletenv/config_test.go | 15 ++--- 9 files changed, 185 insertions(+), 13 deletions(-) diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index bfc55064148..e63ffcc3547 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -11,6 +11,7 @@ - **[VTGate Config File Changes](#vtgate-config-file-changes)** - **[Support for More Efficient JSON Replication](#efficient-json-replication)** - **[Support for LAST_INSERT_ID(x)](#last-insert-id)** + - **[Support for Maximum Idle Connections in the Pool](#max-idle-connections)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -88,6 +89,17 @@ In [#17408](https://github.com/vitessio/vitess/pull/17408) and [#17409](https:// **Limitations**: - When using `LAST_INSERT_ID(x)` in ordered queries (e.g., `SELECT last_insert_id(col) FROM table ORDER BY foo`), MySQL sets the session’s last-insert-id value according to the *last row returned*. Vitess does not guarantee the same behavior. +### Support for Maximum Idle Connections in the Pool + +In [#17443](https://github.com/vitessio/vitess/pull/17443) we introduced a new configurable max-idle-count parameter for connection pools. This allows you to specify the maximum number of idle connections retained in each connection pool to optimize performance and resource efficiency. + +You can control idle connection retention for the query server’s query pool, stream pool, and transaction pool with the following flags: +• --queryserver-config-query-pool-max-idle-count: Defines the maximum number of idle connections retained in the query pool. +• --queryserver-config-stream-pool-max-idle-count: Defines the maximum number of idle connections retained in the stream pool. +• --queryserver-config-txpool-max-idle-count: Defines the maximum number of idle connections retained in the transaction pool. + +This feature ensures that, during traffic spikes, idle connections are available for faster responses, while minimizing overhead in low-traffic periods by limiting the number of idle connections retained. It helps strike a balance between performance, efficiency, and cost. + ## Minor Changes #### VTTablet Flags diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 1c57dd0c08e..052c19ecaae 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -282,11 +282,13 @@ Flags: --queryserver-config-pool-conn-max-lifetime duration query server connection max lifetime, vttablet manages various mysql connection pools. This config means if a connection has lived at least this long, it connection will be removed from pool upon the next time it is returned to the pool. --queryserver-config-pool-size int query server read pool size, connection pool is used by regular queries (non streaming, not in a transaction) (default 16) --queryserver-config-query-cache-memory int query server query cache size in bytes, maximum amount of memory to be used for caching. vttablet analyzes every incoming query and generate a query plan, these plans are being cached in a lru cache. This config controls the capacity of the lru cache. (default 33554432) + --queryserver-config-query-pool-max-idle-count int query server query pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-query-pool-timeout duration query server query pool timeout, it is how long vttablet waits for a connection from the query pool. If set to 0 (default) then the overall query timeout is used instead. --queryserver-config-query-timeout duration query server query timeout, this is the query timeout in vttablet side. If a query takes more than this timeout, it will be killed. (default 30s) --queryserver-config-schema-change-signal query server schema signal, will signal connected vtgates that schema has changed whenever this is detected. VTGates will need to have -schema_change_signal enabled for this to work (default true) --queryserver-config-schema-reload-time duration query server schema reload time, how often vttablet reloads schemas from underlying MySQL instance. vttablet keeps table schemas in its own memory and periodically refreshes it from MySQL. This config controls the reload time. (default 30m0s) --queryserver-config-stream-buffer-size int query server stream buffer size, the maximum number of bytes sent from vttablet for each stream call. It's recommended to keep this value in sync with vtgate's stream_buffer_size. (default 32768) + --queryserver-config-stream-pool-max-idle-count int query server stream pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-stream-pool-size int query server stream connection pool size, stream pool is used by stream queries: queries that return results to client in a streaming fashion (default 200) --queryserver-config-stream-pool-timeout duration query server stream pool timeout, it is how long vttablet waits for a connection from the stream pool. If set to 0 (default) then there is no timeout. --queryserver-config-strict-table-acl only allow queries that pass table acl checks @@ -294,6 +296,7 @@ Flags: --queryserver-config-transaction-cap int query server transaction cap is the maximum number of transactions allowed to happen at any given point of a time for a single vttablet. E.g. by setting transaction cap to 100, there are at most 100 transactions will be processed by a vttablet and the 101th transaction will be blocked (and fail if it cannot get connection within specified timeout) (default 20) --queryserver-config-transaction-timeout duration query server transaction timeout, a transaction will be killed if it takes longer than this value (default 30s) --queryserver-config-truncate-error-len int truncate errors sent to client if they are longer than this value (0 means do not truncate) + --queryserver-config-txpool-max-idle-count int query server transaction pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-txpool-timeout duration query server transaction pool timeout, it is how long vttablet waits if tx pool is full (default 1s) --queryserver-config-warn-result-size int query server result size warning threshold, warn if number of rows returned from vttablet for non-streaming queries exceeds this --queryserver-enable-views Enable views support in vttablet. diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index bc647fb5347..e2b0c30db7f 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -274,11 +274,13 @@ Flags: --queryserver-config-pool-conn-max-lifetime duration query server connection max lifetime, vttablet manages various mysql connection pools. This config means if a connection has lived at least this long, it connection will be removed from pool upon the next time it is returned to the pool. --queryserver-config-pool-size int query server read pool size, connection pool is used by regular queries (non streaming, not in a transaction) (default 16) --queryserver-config-query-cache-memory int query server query cache size in bytes, maximum amount of memory to be used for caching. vttablet analyzes every incoming query and generate a query plan, these plans are being cached in a lru cache. This config controls the capacity of the lru cache. (default 33554432) + --queryserver-config-query-pool-max-idle-count int query server query pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-query-pool-timeout duration query server query pool timeout, it is how long vttablet waits for a connection from the query pool. If set to 0 (default) then the overall query timeout is used instead. --queryserver-config-query-timeout duration query server query timeout, this is the query timeout in vttablet side. If a query takes more than this timeout, it will be killed. (default 30s) --queryserver-config-schema-change-signal query server schema signal, will signal connected vtgates that schema has changed whenever this is detected. VTGates will need to have -schema_change_signal enabled for this to work (default true) --queryserver-config-schema-reload-time duration query server schema reload time, how often vttablet reloads schemas from underlying MySQL instance. vttablet keeps table schemas in its own memory and periodically refreshes it from MySQL. This config controls the reload time. (default 30m0s) --queryserver-config-stream-buffer-size int query server stream buffer size, the maximum number of bytes sent from vttablet for each stream call. It's recommended to keep this value in sync with vtgate's stream_buffer_size. (default 32768) + --queryserver-config-stream-pool-max-idle-count int query server stream pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-stream-pool-size int query server stream connection pool size, stream pool is used by stream queries: queries that return results to client in a streaming fashion (default 200) --queryserver-config-stream-pool-timeout duration query server stream pool timeout, it is how long vttablet waits for a connection from the stream pool. If set to 0 (default) then there is no timeout. --queryserver-config-strict-table-acl only allow queries that pass table acl checks @@ -286,6 +288,7 @@ Flags: --queryserver-config-transaction-cap int query server transaction cap is the maximum number of transactions allowed to happen at any given point of a time for a single vttablet. E.g. by setting transaction cap to 100, there are at most 100 transactions will be processed by a vttablet and the 101th transaction will be blocked (and fail if it cannot get connection within specified timeout) (default 20) --queryserver-config-transaction-timeout duration query server transaction timeout, a transaction will be killed if it takes longer than this value (default 30s) --queryserver-config-truncate-error-len int truncate errors sent to client if they are longer than this value (0 means do not truncate) + --queryserver-config-txpool-max-idle-count int query server transaction pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods. --queryserver-config-txpool-timeout duration query server transaction pool timeout, it is how long vttablet waits if tx pool is full (default 1s) --queryserver-config-warn-result-size int query server result size warning threshold, warn if number of rows returned from vttablet for non-streaming queries exceeds this --queryserver-enable-views Enable views support in vttablet. diff --git a/go/pools/smartconnpool/pool.go b/go/pools/smartconnpool/pool.go index d49032f34a1..b024cc656df 100644 --- a/go/pools/smartconnpool/pool.go +++ b/go/pools/smartconnpool/pool.go @@ -92,6 +92,7 @@ type RefreshCheck func() (bool, error) type Config[C Connection] struct { Capacity int64 + MaxIdleCount int64 IdleTimeout time.Duration MaxLifetime time.Duration RefreshInterval time.Duration @@ -123,6 +124,8 @@ type ConnPool[C Connection] struct { active atomic.Int64 // capacity is the maximum number of connections that this pool can open capacity atomic.Int64 + // maxIdleCount is the maximum idle connections in the pool + idleCount atomic.Int64 // workers is a waitgroup for all the currently running worker goroutines workers sync.WaitGroup @@ -138,6 +141,8 @@ type ConnPool[C Connection] struct { // maxCapacity is the maximum value to which capacity can be set; when the pool // is re-opened, it defaults to this capacity maxCapacity int64 + // maxIdleCount is the maximum idle connections in the pool + maxIdleCount int64 // maxLifetime is the maximum time a connection can be open maxLifetime atomic.Int64 // idleTimeout is the maximum time a connection can remain idle @@ -158,6 +163,7 @@ func NewPool[C Connection](config *Config[C]) *ConnPool[C] { pool := &ConnPool[C]{} pool.freshSettingsStack.Store(-1) pool.config.maxCapacity = config.Capacity + pool.config.maxIdleCount = config.MaxIdleCount pool.config.maxLifetime.Store(config.MaxLifetime.Nanoseconds()) pool.config.idleTimeout.Store(config.IdleTimeout.Nanoseconds()) pool.config.refreshInterval.Store(config.RefreshInterval.Nanoseconds()) @@ -192,6 +198,7 @@ func (pool *ConnPool[C]) runWorker(close <-chan struct{}, interval time.Duration func (pool *ConnPool[C]) open() { pool.close = make(chan struct{}) pool.capacity.Store(pool.config.maxCapacity) + pool.setIdleCount() // The expire worker takes care of removing from the waiter list any clients whose // context has been cancelled. @@ -315,6 +322,16 @@ func (pool *ConnPool[C]) MaxCapacity() int64 { return pool.config.maxCapacity } +func (pool *ConnPool[C]) setIdleCount() { + capacity := pool.Capacity() + maxIdleCount := pool.config.maxIdleCount + if maxIdleCount == 0 || maxIdleCount > capacity { + pool.idleCount.Store(capacity) + } else { + pool.idleCount.Store(maxIdleCount) + } +} + // InUse returns the number of connections that the pool has lent out to clients and that // haven't been returned yet. func (pool *ConnPool[C]) InUse() int64 { @@ -340,6 +357,10 @@ func (pool *ConnPool[C]) SetIdleTimeout(duration time.Duration) { pool.config.idleTimeout.Store(duration.Nanoseconds()) } +func (pool *ConnPool[D]) IdleCount() int64 { + return pool.idleCount.Load() +} + func (pool *ConnPool[D]) RefreshInterval() time.Duration { return time.Duration(pool.config.refreshInterval.Load()) } @@ -396,6 +417,10 @@ func (pool *ConnPool[C]) put(conn *Pooled[C]) { } if !pool.wait.tryReturnConn(conn) { + if pool.closeOnIdleLimitReached(conn) { + return + } + connSetting := conn.Conn.Setting() if connSetting == nil { pool.clean.Push(conn) @@ -407,6 +432,23 @@ func (pool *ConnPool[C]) put(conn *Pooled[C]) { } } +// closeOnIdleLimitReached closes a connection if the number of idle connections (active - inuse) in the pool +// exceeds the idleCount limit. It returns true if the connection is closed, false otherwise. +func (pool *ConnPool[C]) closeOnIdleLimitReached(conn *Pooled[C]) bool { + for { + open := pool.active.Load() + idle := open - pool.borrowed.Load() + if idle <= pool.idleCount.Load() { + return false + } + if pool.active.CompareAndSwap(open, open-1) { + pool.Metrics.idleClosed.Add(1) + conn.Close() + return true + } + } +} + func (pool *ConnPool[D]) extendedMaxLifetime() time.Duration { maxLifetime := pool.config.maxLifetime.Load() if maxLifetime == 0 { @@ -629,6 +671,9 @@ func (pool *ConnPool[C]) setCapacity(ctx context.Context, newcap int64) error { if oldcap == newcap { return nil } + // update the idle count to match the new capacity if necessary + // wait for connections to be returned to the pool if we're reducing the capacity. + defer pool.setIdleCount() const delay = 10 * time.Millisecond @@ -732,6 +777,9 @@ func (pool *ConnPool[C]) RegisterStats(stats *servenv.Exporter, name string) { // the smartconnpool doesn't have a maximum capacity return pool.Capacity() }) + stats.NewGaugeFunc(name+"IdleAllowed", "Tablet server conn pool idle allowed limit", func() int64 { + return pool.IdleCount() + }) stats.NewCounterFunc(name+"WaitCount", "Tablet server conn pool wait count", func() int64 { return pool.Metrics.WaitCount() }) diff --git a/go/pools/smartconnpool/pool_test.go b/go/pools/smartconnpool/pool_test.go index 701327005ad..44bd431d189 100644 --- a/go/pools/smartconnpool/pool_test.go +++ b/go/pools/smartconnpool/pool_test.go @@ -746,6 +746,51 @@ func TestExtendedLifetimeTimeout(t *testing.T) { } } +// TestMaxIdleCount tests the MaxIdleCount setting, to check if the pool closes +// the idle connections when the number of idle connections exceeds the limit. +func TestMaxIdleCount(t *testing.T) { + testMaxIdleCount := func(t *testing.T, setting *Setting, maxIdleCount int64, expClosedConn int) { + var state TestState + + ctx := context.Background() + p := NewPool(&Config[*TestConn]{ + Capacity: 5, + MaxIdleCount: maxIdleCount, + LogWait: state.LogWait, + }).Open(newConnector(&state), nil) + + defer p.Close() + + var conns []*Pooled[*TestConn] + for i := 0; i < 5; i++ { + r, err := p.Get(ctx, setting) + require.NoError(t, err) + assert.EqualValues(t, i+1, state.open.Load()) + assert.EqualValues(t, 0, p.Metrics.IdleClosed()) + + conns = append(conns, r) + } + + for _, conn := range conns { + p.put(conn) + } + + closedConn := 0 + for _, conn := range conns { + if conn.Conn.IsClosed() { + closedConn++ + } + } + assert.EqualValues(t, expClosedConn, closedConn) + assert.EqualValues(t, expClosedConn, p.Metrics.IdleClosed()) + } + + t.Run("WithoutSettings", func(t *testing.T) { testMaxIdleCount(t, nil, 2, 3) }) + t.Run("WithSettings", func(t *testing.T) { testMaxIdleCount(t, sFoo, 2, 3) }) + t.Run("WithoutSettings-MaxIdleCount-Zero", func(t *testing.T) { testMaxIdleCount(t, nil, 0, 0) }) + t.Run("WithSettings-MaxIdleCount-Zero", func(t *testing.T) { testMaxIdleCount(t, sFoo, 0, 0) }) +} + func TestCreateFail(t *testing.T) { var state TestState state.chaos.failConnect = true diff --git a/go/vt/vttablet/tabletserver/connpool/pool.go b/go/vt/vttablet/tabletserver/connpool/pool.go index 14fcc6d0f2e..141d8257062 100644 --- a/go/vt/vttablet/tabletserver/connpool/pool.go +++ b/go/vt/vttablet/tabletserver/connpool/pool.go @@ -69,6 +69,7 @@ func NewPool(env tabletenv.Env, name string, cfg tabletenv.ConnPoolConfig) *Pool config := smartconnpool.Config[*Conn]{ Capacity: int64(cfg.Size), IdleTimeout: cfg.IdleTimeout, + MaxIdleCount: int64(cfg.MaxIdleCount), MaxLifetime: cfg.MaxLifetime, RefreshInterval: mysqlctl.PoolDynamicHostnameResolution, } diff --git a/go/vt/vttablet/tabletserver/connpool/pool_test.go b/go/vt/vttablet/tabletserver/connpool/pool_test.go index 8cf27cbb327..c305c61b7b4 100644 --- a/go/vt/vttablet/tabletserver/connpool/pool_test.go +++ b/go/vt/vttablet/tabletserver/connpool/pool_test.go @@ -55,10 +55,10 @@ func TestConnPoolTimeout(t *testing.T) { defer db.Close() cfg := tabletenv.ConnPoolConfig{ - Size: 1, + Size: 1, + Timeout: time.Second, + IdleTimeout: 10 * time.Second, } - cfg.Timeout = time.Second - cfg.IdleTimeout = 10 * time.Second connPool := NewPool(tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "PoolTest"), "TestPool", cfg) params := dbconfigs.New(db.ConnParams()) connPool.Open(params, params, params) @@ -135,6 +135,58 @@ func TestConnPoolSetCapacity(t *testing.T) { } } +// TestConnPoolMaxIdleCount tests the max idle count for the pool. +// The pool should close the idle connections if the idle count is more than the allowed idle count. +// Changing the pool capacity will affect the idle count allowed for that pool. +func TestConnPoolMaxIdleCount(t *testing.T) { + db := fakesqldb.New(t) + defer db.Close() + + cfg := tabletenv.ConnPoolConfig{ + Size: 5, + MaxIdleCount: 2, + } + connPool := NewPool(tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "PoolTest"), "TestPool", cfg) + params := dbconfigs.New(db.ConnParams()) + connPool.Open(params, params, params) + defer connPool.Close() + + assert.EqualValues(t, 5, connPool.Capacity(), "pool capacity should be 5") + assert.EqualValues(t, 2, connPool.IdleCount(), "pool idle count should be 2") + + var conns []*PooledConn + for i := 0; i < 3; i++ { + conn, err := connPool.Get(context.Background(), nil) + require.NoError(t, err) + conns = append(conns, conn) + } + + // after recycle - 1 idle connection + conns[0].Recycle() + assert.Zero(t, connPool.Metrics.IdleClosed(), "pool idle closed should be 0") + + // after recycle - 2 idle connection + conns[1].Recycle() + assert.Zero(t, connPool.Metrics.IdleClosed(), "pool idle closed should be 0") + + // after recycle - 3 idle connection, 1 will be closed + conns[2].Recycle() + assert.EqualValues(t, 1, connPool.Metrics.IdleClosed(), "pool idle closed should be 1") + + // changing the pool capacity will affect the idle count allowed for that pool. + // If setting the capacity to lower value than max idle count. + + err := connPool.SetCapacity(context.Background(), 4) + require.NoError(t, err) + assert.EqualValues(t, 4, connPool.Capacity(), "pool capacity should be 4") + assert.EqualValues(t, 2, connPool.IdleCount(), "pool idle count should be 2") + + err = connPool.SetCapacity(context.Background(), 1) + require.NoError(t, err) + assert.EqualValues(t, 1, connPool.Capacity(), "pool capacity should be 1") + assert.EqualValues(t, 1, connPool.IdleCount(), "pool idle count should be changed to 1") +} + func TestConnPoolStatJSON(t *testing.T) { db := fakesqldb.New(t) defer db.Close() diff --git a/go/vt/vttablet/tabletserver/tabletenv/config.go b/go/vt/vttablet/tabletserver/tabletenv/config.go index 994999f2368..42cc300f92d 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config.go @@ -143,6 +143,9 @@ func registerTabletEnvFlags(fs *pflag.FlagSet) { fs.DurationVar(¤tConfig.OltpReadPool.Timeout, "queryserver-config-query-pool-timeout", defaultConfig.OltpReadPool.Timeout, "query server query pool timeout, it is how long vttablet waits for a connection from the query pool. If set to 0 (default) then the overall query timeout is used instead.") fs.DurationVar(¤tConfig.OlapReadPool.Timeout, "queryserver-config-stream-pool-timeout", defaultConfig.OlapReadPool.Timeout, "query server stream pool timeout, it is how long vttablet waits for a connection from the stream pool. If set to 0 (default) then there is no timeout.") fs.DurationVar(¤tConfig.TxPool.Timeout, "queryserver-config-txpool-timeout", defaultConfig.TxPool.Timeout, "query server transaction pool timeout, it is how long vttablet waits if tx pool is full") + fs.IntVar(¤tConfig.OltpReadPool.MaxIdleCount, "queryserver-config-query-pool-max-idle-count", defaultConfig.OltpReadPool.MaxIdleCount, "query server query pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods.") + fs.IntVar(¤tConfig.OlapReadPool.MaxIdleCount, "queryserver-config-stream-pool-max-idle-count", defaultConfig.OlapReadPool.MaxIdleCount, "query server stream pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods.") + fs.IntVar(¤tConfig.TxPool.MaxIdleCount, "queryserver-config-txpool-max-idle-count", defaultConfig.TxPool.MaxIdleCount, "query server transaction pool - maximum number of idle connections to retain in the pool. Use this to balance between faster response times during traffic bursts and resource efficiency during low-traffic periods.") fs.DurationVar(¤tConfig.OltpReadPool.IdleTimeout, "queryserver-config-idle-timeout", defaultConfig.OltpReadPool.IdleTimeout, "query server idle timeout, vttablet manages various mysql connection pools. This config means if a connection has not been used in given idle timeout, this connection will be removed from pool. This effectively manages number of connection objects and optimize the pool performance.") fs.DurationVar(¤tConfig.OltpReadPool.MaxLifetime, "queryserver-config-pool-conn-max-lifetime", defaultConfig.OltpReadPool.MaxLifetime, "query server connection max lifetime, vttablet manages various mysql connection pools. This config means if a connection has lived at least this long, it connection will be removed from pool upon the next time it is returned to the pool.") @@ -424,6 +427,7 @@ type ConnPoolConfig struct { Size int `json:"size,omitempty"` Timeout time.Duration `json:"timeoutSeconds,omitempty"` IdleTimeout time.Duration `json:"idleTimeoutSeconds,omitempty"` + MaxIdleCount int `json:"maxIdleCount,omitempty"` MaxLifetime time.Duration `json:"maxLifetimeSeconds,omitempty"` PrefillParallelism int `json:"prefillParallelism,omitempty"` } @@ -433,9 +437,10 @@ func (cfg *ConnPoolConfig) MarshalJSON() ([]byte, error) { tmp := struct { Proxy - Timeout string `json:"timeoutSeconds,omitempty"` - IdleTimeout string `json:"idleTimeoutSeconds,omitempty"` - MaxLifetime string `json:"maxLifetimeSeconds,omitempty"` + Timeout string `json:"timeoutSeconds,omitempty"` + IdleTimeout string `json:"idleTimeoutSeconds,omitempty"` + MaxIdleCount int `json:"maxIdleCount,omitempty"` + MaxLifetime string `json:"maxLifetimeSeconds,omitempty"` }{ Proxy: Proxy(*cfg), } @@ -460,6 +465,7 @@ func (cfg *ConnPoolConfig) UnmarshalJSON(data []byte) (err error) { Size int `json:"size,omitempty"` Timeout string `json:"timeoutSeconds,omitempty"` IdleTimeout string `json:"idleTimeoutSeconds,omitempty"` + MaxIdleCount int `json:"maxIdleCount,omitempty"` MaxLifetime string `json:"maxLifetimeSeconds,omitempty"` PrefillParallelism int `json:"prefillParallelism,omitempty"` } @@ -490,6 +496,7 @@ func (cfg *ConnPoolConfig) UnmarshalJSON(data []byte) (err error) { } cfg.Size = tmp.Size + cfg.MaxIdleCount = tmp.MaxIdleCount cfg.PrefillParallelism = tmp.PrefillParallelism return nil diff --git a/go/vt/vttablet/tabletserver/tabletenv/config_test.go b/go/vt/vttablet/tabletserver/tabletenv/config_test.go index d16b6276964..9ae653bafb9 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config_test.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config_test.go @@ -28,13 +28,12 @@ import ( "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/mysqlctl" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/throttler" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/yaml2" - - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) func TestConfigParse(t *testing.T) { @@ -49,10 +48,11 @@ func TestConfigParse(t *testing.T) { }, }, OltpReadPool: ConnPoolConfig{ - Size: 16, - Timeout: 10 * time.Second, - IdleTimeout: 20 * time.Second, - MaxLifetime: 50 * time.Second, + Size: 16, + Timeout: 10 * time.Second, + IdleTimeout: 20 * time.Second, + MaxLifetime: 50 * time.Second, + MaxIdleCount: 8, }, RowStreamer: RowStreamerConfig{ MaxInnoDBTrxHistLen: 1000, @@ -113,6 +113,7 @@ txPool: {} oltpReadPool: size: 16 idleTimeoutSeconds: 20s + maxIdleCount: 8 maxLifetimeSeconds: 50s `) gotCfg := cfg From 4bd822b5fef7a345cab30a2c8e1dbf78556c862f Mon Sep 17 00:00:00 2001 From: Anirban Mukhopadhyay <5289943+anirbanmu@users.noreply.github.com> Date: Thu, 9 Jan 2025 22:01:51 -0800 Subject: [PATCH 16/66] vttestserver should only pass a BindAddressGprc if one is passed in (#17457) Signed-off-by: Anirban Mukhopadhyay Signed-off-by: Manan Gupta Co-authored-by: Anirban Mukhopadhyay Co-authored-by: Manan Gupta --- go/vt/vttest/vtprocess.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/vt/vttest/vtprocess.go b/go/vt/vttest/vtprocess.go index 6371811a60e..1719fafd8a7 100644 --- a/go/vt/vttest/vtprocess.go +++ b/go/vt/vttest/vtprocess.go @@ -205,7 +205,7 @@ func VtcomboProcess(environment Environment, args *Config, mysql MySQLManager) ( if args.VtComboBindAddress != "" { vtcomboBindAddress = args.VtComboBindAddress } - grpcBindAddress := "127.0.0.1" + grpcBindAddress := "" if servenv.GRPCBindAddress() != "" { grpcBindAddress = servenv.GRPCBindAddress() } From 694b02c8ca723ca75a817838e61738f49703552e Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 10 Jan 2025 12:16:29 +0530 Subject: [PATCH 17/66] Benchmark Prepared statement and expected Improvement (#17449) Signed-off-by: Harshit Gangal --- .../endtoend/preparestmt/benchmark_test.go | 144 ++++++++++++++++++ go/test/endtoend/preparestmt/main_test.go | 91 ++++------- go/test/endtoend/preparestmt/sSchema.sql | 10 ++ go/test/endtoend/preparestmt/sVschema.json | 22 +++ .../endtoend/preparestmt/stmt_methods_test.go | 27 ++-- go/test/endtoend/preparestmt/uSchema.sql | 56 +++++++ go/test/endtoend/preparestmt/uVschema.json | 8 + 7 files changed, 278 insertions(+), 80 deletions(-) create mode 100644 go/test/endtoend/preparestmt/benchmark_test.go create mode 100644 go/test/endtoend/preparestmt/sSchema.sql create mode 100644 go/test/endtoend/preparestmt/sVschema.json create mode 100644 go/test/endtoend/preparestmt/uSchema.sql create mode 100644 go/test/endtoend/preparestmt/uVschema.json diff --git a/go/test/endtoend/preparestmt/benchmark_test.go b/go/test/endtoend/preparestmt/benchmark_test.go new file mode 100644 index 00000000000..fcf10a6948a --- /dev/null +++ b/go/test/endtoend/preparestmt/benchmark_test.go @@ -0,0 +1,144 @@ +/* +Copyright 2024 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package preparestmt + +import ( + "math/rand/v2" + "testing" + + "github.com/icrowley/fake" +) + +/* +export ver=v1 p=~/benchmark && go test \ +-run '^$' -bench '^BenchmarkPreparedStmt' \ +-benchtime 2s -count 6 -cpu 4 \ +| tee $p/${ver}.txt +*/ +func BenchmarkPreparedStmt(b *testing.B) { + dbo := Connect(b) + defer dbo.Close() + + // prepare statement + insertStmt := `insert into sks.t1 (name, age, email, created_at, is_active) values(?, ?, ?, current_timestamp, ?)` + selectStmt := `select id, name, age, email from sks.t1 where age between ? and ? and is_active = ? limit ?` + updateStmt := `update sks.t1 set is_active = ? where id = ?` + deleteStmt := `delete from sks.t1 where is_active = ? and age = ?` + + joinStmt := `SELECT + user.id AS user_id +FROM + sks.t1 AS user +LEFT JOIN + sks.t1 AS parent ON user.id = parent.id AND parent.age = ? +LEFT JOIN + sks.t1 AS manager ON user.id = manager.id AND manager.is_active = ? +LEFT JOIN + sks.t1 AS child ON user.id = child.id +WHERE + user.is_active = ? + AND user.id = ? + AND parent.id = ? + AND manager.id = ?` + + iStmt, err := dbo.Prepare(insertStmt) + if err != nil { + b.Fatal(err) + } + defer iStmt.Close() + + b.Run("Insert", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := iStmt.Exec(fake.FirstName(), rand.IntN(100), fake.EmailAddress(), rand.IntN(2)) + if err != nil { + b.Fatal(err) + } + } + }) + + sStmt, err := dbo.Prepare(selectStmt) + if err != nil { + b.Fatal(err) + } + defer sStmt.Close() + + b.Run("Select", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + age := rand.IntN(80) + r, err := sStmt.Query(age, age+20, rand.IntN(2), rand.IntN(10)) + if err != nil { + b.Fatal(err) + } + r.Close() + } + }) + + jStmt, err := dbo.Prepare(joinStmt) + if err != nil { + b.Fatal(err) + } + defer jStmt.Close() + + b.Run("Join Select:Simple Route", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + age := rand.IntN(80) + active := rand.IntN(2) + id := rand.IntN(2000) + r, err := jStmt.Query(age, active, active, id, id, id) + if err != nil { + b.Fatal(err) + } + r.Close() + } + }) + + uStmt, err := dbo.Prepare(updateStmt) + if err != nil { + b.Fatal(err) + } + defer sStmt.Close() + + b.Run("Update", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err = uStmt.Exec(rand.IntN(2), rand.IntN(2000)) + if err != nil { + b.Fatal(err) + } + } + }) + + dStmt, err := dbo.Prepare(deleteStmt) + if err != nil { + b.Fatal(err) + } + defer sStmt.Close() + + b.Run("Delete", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err = dStmt.Exec(rand.IntN(2), rand.IntN(100)) + if err != nil { + b.Fatal(err) + } + } + }) + +} diff --git a/go/test/endtoend/preparestmt/main_test.go b/go/test/endtoend/preparestmt/main_test.go index 0e067062c94..dd0094fe825 100644 --- a/go/test/endtoend/preparestmt/main_test.go +++ b/go/test/endtoend/preparestmt/main_test.go @@ -18,6 +18,7 @@ package preparestmt import ( "database/sql" + _ "embed" "flag" "fmt" "os" @@ -51,7 +52,7 @@ type DBInfo struct { } func init() { - dbInfo.KeyspaceName = keyspaceName + dbInfo.KeyspaceName = uks dbInfo.Username = "testuser1" dbInfo.Password = "testpassword1" dbInfo.Params = []string{ @@ -65,9 +66,9 @@ var ( clusterInstance *cluster.LocalProcessCluster dbInfo DBInfo hostname = "localhost" - keyspaceName = "test_keyspace" + uks = "uks" + sks = "sks" testingID = 1 - tableName = "vt_prepare_stmt_test" cell = "zone1" mysqlAuthServerStatic = "mysql_auth_server_static.json" jsonExample = `{ @@ -108,57 +109,18 @@ var ( } } }` - sqlSchema = `create table ` + tableName + ` ( - id bigint auto_increment, - msg varchar(64), - keyspace_id bigint(20) unsigned NOT NULL, - tinyint_unsigned TINYINT, - bool_signed BOOL, - smallint_unsigned SMALLINT, - mediumint_unsigned MEDIUMINT, - int_unsigned INT, - float_unsigned FLOAT(10,2), - double_unsigned DOUBLE(16,2), - decimal_unsigned DECIMAL, - t_date DATE, - t_datetime DATETIME, - t_datetime_micros DATETIME(6), - t_time TIME, - t_timestamp TIMESTAMP, - c8 bit(8) DEFAULT NULL, - c16 bit(16) DEFAULT NULL, - c24 bit(24) DEFAULT NULL, - c32 bit(32) DEFAULT NULL, - c40 bit(40) DEFAULT NULL, - c48 bit(48) DEFAULT NULL, - c56 bit(56) DEFAULT NULL, - c63 bit(63) DEFAULT NULL, - c64 bit(64) DEFAULT NULL, - json_col JSON, - text_col TEXT, - data longblob, - tinyint_min TINYINT, - tinyint_max TINYINT, - tinyint_pos TINYINT, - tinyint_neg TINYINT, - smallint_min SMALLINT, - smallint_max SMALLINT, - smallint_pos SMALLINT, - smallint_neg SMALLINT, - medint_min MEDIUMINT, - medint_max MEDIUMINT, - medint_pos MEDIUMINT, - medint_neg MEDIUMINT, - int_min INT, - int_max INT, - int_pos INT, - int_neg INT, - bigint_min BIGINT, - bigint_max BIGINT, - bigint_pos BIGINT, - bigint_neg BIGINT, - primary key (id) - ) Engine=InnoDB` + + //go:embed uSchema.sql + uSQLSchema string + + //go:embed uVschema.json + uVschema string + + //go:embed sSchema.sql + sSQLSchema string + + //go:embed sVschema.json + sVschema string ) func TestMain(m *testing.M) { @@ -185,15 +147,13 @@ func TestMain(m *testing.M) { } // Start keyspace - keyspace := &cluster.Keyspace{ - Name: keyspaceName, - SchemaSQL: sqlSchema, - } - uks := &cluster.Keyspace{Name: "uks"} - if err := clusterInstance.StartUnshardedKeyspace(*keyspace, 1, false); err != nil { + ks := cluster.Keyspace{Name: uks, SchemaSQL: uSQLSchema, VSchema: uVschema} + if err := clusterInstance.StartUnshardedKeyspace(ks, 1, false); err != nil { return 1, err } - if err := clusterInstance.StartUnshardedKeyspace(*uks, 0, false); err != nil { + + ks = cluster.Keyspace{Name: sks, SchemaSQL: sSQLSchema, VSchema: sVschema} + if err := clusterInstance.StartKeyspace(ks, []string{"-"}, 0, false); err != nil { return 1, err } @@ -203,7 +163,8 @@ func TestMain(m *testing.M) { vtgateInstance.ExtraArgs = []string{ "--mysql_server_query_timeout", "1s", "--mysql_auth_server_static_file", clusterInstance.TmpDirectory + "/" + mysqlAuthServerStatic, - "--mysql_server_version", "8.0.16-7", + "--pprof-http", + "--schema_change_signal=false", } // Start vtgate @@ -251,7 +212,7 @@ func createConfig(name, data string) error { } // Connect will connect the vtgate through mysql protocol. -func Connect(t *testing.T, params ...string) *sql.DB { +func Connect(t testing.TB, params ...string) *sql.DB { dbo, err := sql.Open("mysql", dbInfo.ConnectionString(params...)) require.Nil(t, err) return dbo @@ -285,7 +246,7 @@ func execErr(dbo *sql.DB, stmt string, params ...any) *mysql.MySQLError { func selectWhere(t *testing.T, dbo *sql.DB, where string, params ...any) []tableData { var out []tableData // prepare query - qry := "SELECT msg, data, text_col, t_datetime, t_datetime_micros FROM " + tableName + qry := "SELECT msg, data, text_col, t_datetime, t_datetime_micros FROM vt_prepare_stmt_test" if where != "" { qry += " WHERE (" + where + ")" } @@ -307,7 +268,7 @@ func selectWhere(t *testing.T, dbo *sql.DB, where string, params ...any) []table func selectWhereWithTx(t *testing.T, tx *sql.Tx, where string, params ...any) []tableData { var out []tableData // prepare query - qry := "SELECT msg, data, text_col, t_datetime, t_datetime_micros FROM " + tableName + qry := "SELECT msg, data, text_col, t_datetime, t_datetime_micros FROM vt_prepare_stmt_test" if where != "" { qry += " WHERE (" + where + ")" } diff --git a/go/test/endtoend/preparestmt/sSchema.sql b/go/test/endtoend/preparestmt/sSchema.sql new file mode 100644 index 00000000000..7da6b759a9a --- /dev/null +++ b/go/test/endtoend/preparestmt/sSchema.sql @@ -0,0 +1,10 @@ +CREATE TABLE t1 +( + id BIGINT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + age INT, + email VARCHAR(100), + created_at DATETIME, + is_active BOOLEAN, + INDEX age_idx (age) +); \ No newline at end of file diff --git a/go/test/endtoend/preparestmt/sVschema.json b/go/test/endtoend/preparestmt/sVschema.json new file mode 100644 index 00000000000..77801827d42 --- /dev/null +++ b/go/test/endtoend/preparestmt/sVschema.json @@ -0,0 +1,22 @@ +{ + "sharded": true, + "vindexes": { + "xxhash": { + "type": "xxhash" + } + }, + "tables": { + "t1": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ], + "auto_increment":{ + "column" : "id", + "sequence" : "uks.t1_seq" + } + } + } +} diff --git a/go/test/endtoend/preparestmt/stmt_methods_test.go b/go/test/endtoend/preparestmt/stmt_methods_test.go index 5768c6eec7a..e8e001fdca7 100644 --- a/go/test/endtoend/preparestmt/stmt_methods_test.go +++ b/go/test/endtoend/preparestmt/stmt_methods_test.go @@ -48,7 +48,7 @@ func TestSelectDatabase(t *testing.T) { require.True(t, rows.Next(), "no rows found") err = rows.Scan(&resultBytes) require.NoError(t, err) - assert.Equal(t, string(resultBytes), "test_keyspace") + assert.Equal(t, string(resultBytes), "uks") } // TestInsertUpdateDelete validates all insert, update and @@ -57,7 +57,7 @@ func TestInsertUpdateDelete(t *testing.T) { dbo := Connect(t) defer dbo.Close() // prepare insert statement - insertStmt := `insert into ` + tableName + ` values( ?, ?, ?, ?, ?, ?, ?, ?, + insertStmt := `insert into vt_prepare_stmt_test values( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);` @@ -129,7 +129,7 @@ func testReplica(t *testing.T) { // testcount validates inserted rows count with expected count. func testcount(t *testing.T, dbo *sql.DB, except int) { - r, err := dbo.Query("SELECT count(1) FROM " + tableName) + r, err := dbo.Query("SELECT count(1) FROM vt_prepare_stmt_test") require.Nil(t, err) r.Next() @@ -145,7 +145,7 @@ func TestAutoIncColumns(t *testing.T) { dbo := Connect(t) defer dbo.Close() // insert a row without id - insertStmt := "INSERT INTO " + tableName + ` ( + insertStmt := "INSERT INTO vt_prepare_stmt_test" + ` ( msg,keyspace_id,tinyint_unsigned,bool_signed,smallint_unsigned, mediumint_unsigned,int_unsigned,float_unsigned,double_unsigned, decimal_unsigned,t_date,t_datetime,t_datetime_micros,t_time,t_timestamp,c8,c16,c24, @@ -180,7 +180,7 @@ func TestAutoIncColumns(t *testing.T) { // deleteRecord test deletion operation corresponds to the testingID. func deleteRecord(t *testing.T, dbo *sql.DB) { // delete the record with id 1 - exec(t, dbo, "DELETE FROM "+tableName+" WHERE id = ?;", testingID) + exec(t, dbo, "DELETE FROM vt_prepare_stmt_test WHERE id = ?;", testingID) data := selectWhere(t, dbo, "id = ?", testingID) assert.Equal(t, 0, len(data)) @@ -192,7 +192,7 @@ func updateRecord(t *testing.T, dbo *sql.DB) { // update the record with id 1 updateData := "new data value" updateTextCol := "new text col value" - updateQuery := "update " + tableName + " set data = ? , text_col = ? where id = ?;" + updateQuery := "update vt_prepare_stmt_test set data = ? , text_col = ? where id = ?;" exec(t, dbo, updateQuery, updateData, updateTextCol, testingID) @@ -226,7 +226,7 @@ func TestColumnParameter(t *testing.T) { id := 1000 parameter1 := "param1" message := "TestColumnParameter" - insertStmt := "INSERT INTO " + tableName + " (id, msg, keyspace_id) VALUES (?, ?, ?);" + insertStmt := "INSERT INTO vt_prepare_stmt_test (id, msg, keyspace_id) VALUES (?, ?, ?);" values := []any{ id, message, @@ -237,7 +237,7 @@ func TestColumnParameter(t *testing.T) { var param, msg string var recID int - selectStmt := "SELECT COALESCE(?, id), msg FROM " + tableName + " WHERE msg = ? LIMIT ?" + selectStmt := "SELECT COALESCE(?, id), msg FROM vt_prepare_stmt_test WHERE msg = ? LIMIT ?" results1, err := dbo.Query(selectStmt, parameter1, message, 1) require.Nil(t, err) @@ -313,10 +313,7 @@ func TestSelectDBA(t *testing.T) { dbo := Connect(t) defer dbo.Close() - _, err := dbo.Exec("use uks") - require.NoError(t, err) - - _, err = dbo.Exec("CREATE TABLE `a` (`one` int NOT NULL,`two` int NOT NULL,PRIMARY KEY(`one`, `two`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4") + _, err := dbo.Exec("CREATE TABLE `a` (`one` int NOT NULL,`two` int NOT NULL,PRIMARY KEY(`one`, `two`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4") require.NoError(t, err) prepare, err := dbo.Prepare(`SELECT @@ -332,10 +329,10 @@ func TestSelectDBA(t *testing.T) { extra extra, table_name table_name FROM information_schema.columns - WHERE table_schema = ? + WHERE table_schema = ? and table_name = ? ORDER BY ordinal_position`) require.NoError(t, err) - rows, err := prepare.Query("uks") + rows, err := prepare.Query("uks", "a") require.NoError(t, err) defer rows.Close() var rec columns @@ -441,6 +438,6 @@ func TestBinaryColumn(t *testing.T) { AND column_info.table_schema = ? -- Exclude views. AND table_info.table_type = 'BASE TABLE' - ORDER BY BINARY table_info.table_name`, keyspaceName, keyspaceName) + ORDER BY BINARY table_info.table_name`, uks, uks) require.NoError(t, err) } diff --git a/go/test/endtoend/preparestmt/uSchema.sql b/go/test/endtoend/preparestmt/uSchema.sql new file mode 100644 index 00000000000..5284cacded6 --- /dev/null +++ b/go/test/endtoend/preparestmt/uSchema.sql @@ -0,0 +1,56 @@ +create table vt_prepare_stmt_test +( + id bigint auto_increment, + msg varchar(64), + keyspace_id bigint(20) unsigned NOT NULL, + tinyint_unsigned TINYINT, + bool_signed BOOL, + smallint_unsigned SMALLINT, + mediumint_unsigned MEDIUMINT, + int_unsigned INT, + float_unsigned FLOAT(10, 2), + double_unsigned DOUBLE(16, 2), + decimal_unsigned DECIMAL, + t_date DATE, + t_datetime DATETIME, + t_datetime_micros DATETIME(6), + t_time TIME, + t_timestamp TIMESTAMP, + c8 bit(8) DEFAULT NULL, + c16 bit(16) DEFAULT NULL, + c24 bit(24) DEFAULT NULL, + c32 bit(32) DEFAULT NULL, + c40 bit(40) DEFAULT NULL, + c48 bit(48) DEFAULT NULL, + c56 bit(56) DEFAULT NULL, + c63 bit(63) DEFAULT NULL, + c64 bit(64) DEFAULT NULL, + json_col JSON, + text_col TEXT, + data longblob, + tinyint_min TINYINT, + tinyint_max TINYINT, + tinyint_pos TINYINT, + tinyint_neg TINYINT, + smallint_min SMALLINT, + smallint_max SMALLINT, + smallint_pos SMALLINT, + smallint_neg SMALLINT, + medint_min MEDIUMINT, + medint_max MEDIUMINT, + medint_pos MEDIUMINT, + medint_neg MEDIUMINT, + int_min INT, + int_max INT, + int_pos INT, + int_neg INT, + bigint_min BIGINT, + bigint_max BIGINT, + bigint_pos BIGINT, + bigint_neg BIGINT, + primary key (id) +) Engine = InnoDB; + +CREATE TABLE t1_seq ( id INT, next_id BIGINT, cache BIGINT, PRIMARY KEY(id)) comment 'vitess_sequence'; + +INSERT INTO t1_seq (id, next_id, cache) values (0, 1, 500000); \ No newline at end of file diff --git a/go/test/endtoend/preparestmt/uVschema.json b/go/test/endtoend/preparestmt/uVschema.json new file mode 100644 index 00000000000..1f4de22e018 --- /dev/null +++ b/go/test/endtoend/preparestmt/uVschema.json @@ -0,0 +1,8 @@ +{ + "sharded": false, + "tables": { + "sequence_test_seq": { + "type": "sequence" + } + } +} From 555f1d7bb49098f1411303cf34942e06e78ae9e1 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:23:18 +0100 Subject: [PATCH 18/66] Fix flaky vreplication tests: correct logic that checks for workflow state in test helper (#17498) Signed-off-by: Rohit Nayak --- go/test/endtoend/vreplication/helper_test.go | 42 +++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/go/test/endtoend/vreplication/helper_test.go b/go/test/endtoend/vreplication/helper_test.go index 0102b9b5e2d..6bfce05119a 100644 --- a/go/test/endtoend/vreplication/helper_test.go +++ b/go/test/endtoend/vreplication/helper_test.go @@ -368,29 +368,33 @@ func waitForWorkflowState(t *testing.T, vc *VitessCluster, ksWorkflow string, wa require.NoError(t, err, output) done = true state := "" - streams := gjson.Get(output, "workflows.0.shard_streams.*.streams") - streams.ForEach(func(streamId, stream gjson.Result) bool { // For each stream - info := stream.Map() - // We need to wait for all streams to have the desired state. - state = info["state"].String() - if state == wantState { - for i := 0; i < len(fieldEqualityChecks); i++ { - if kvparts := strings.Split(fieldEqualityChecks[i], "=="); len(kvparts) == 2 { - key := kvparts[0] - val := kvparts[1] - res := info[key].String() - if !strings.EqualFold(res, val) { - done = false + shardStreams := gjson.Get(output, "workflows.0.shard_streams") + // We need to wait for all streams in all shard streams to have the desired state. + shardStreams.ForEach(func(shardStreamId, shardStream gjson.Result) bool { + streams := shardStream.Get("*") + streams.ForEach(func(streamId, stream gjson.Result) bool { + info := stream.Map() + state = info["state"].String() + if state == wantState { + for i := 0; i < len(fieldEqualityChecks); i++ { + if kvparts := strings.Split(fieldEqualityChecks[i], "=="); len(kvparts) == 2 { + key := kvparts[0] + val := kvparts[1] + res := info[key].String() + if !strings.EqualFold(res, val) { + done = false + } } } - } - if wantState == binlogdatapb.VReplicationWorkflowState_Running.String() && - (info["position"].Exists() && info["position"].String() == "") { + if wantState == binlogdatapb.VReplicationWorkflowState_Running.String() && + (info["position"].Exists() && info["position"].String() == "") { + done = false + } + } else { done = false } - } else { - done = false - } + return true + }) return true }) if done { From 13550182b86b33e0c1304cf93fb10a5814c1b738 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Fri, 10 Jan 2025 19:43:29 +0100 Subject: [PATCH 19/66] Avoid flaky topo concurrency test (#17407) Signed-off-by: Tim Vaillancourt --- go/vt/topo/stats_conn_test.go | 192 ++++++++++++++++------------------ 1 file changed, 90 insertions(+), 102 deletions(-) diff --git a/go/vt/topo/stats_conn_test.go b/go/vt/topo/stats_conn_test.go index 9bc1d51d9ed..9e48ec58407 100644 --- a/go/vt/topo/stats_conn_test.go +++ b/go/vt/topo/stats_conn_test.go @@ -29,8 +29,18 @@ import ( "vitess.io/vitess/go/vt/vterrors" ) +// testStatsConnReadSem is a semaphore for unit tests. +// It intentionally has a concurrency limit of '1' to +// allow semaphore contention in tests. var testStatsConnReadSem = semaphore.NewWeighted(1) +// testStatsConnStatsReset resets StatsConn-based stats. +func testStatsConnStatsReset() { + topoStatsConnErrors.ResetAll() + topoStatsConnReadWaitTimings.Reset() + topoStatsConnTimings.Reset() +} + // The fakeConn is a wrapper for a Conn that emits stats for every operation type fakeConn struct { v Version @@ -185,238 +195,216 @@ func (st *fakeConn) IsReadOnly() bool { } // createTestReadSemaphoreContention simulates semaphore contention on the test read semaphore. -func createTestReadSemaphoreContention(ctx context.Context, duration time.Duration) { +func createTestReadSemaphoreContention(ctx context.Context, duration time.Duration, semAcquiredChan chan struct{}) { if err := testStatsConnReadSem.Acquire(ctx, 1); err != nil { panic(err) } defer testStatsConnReadSem.Release(1) + semAcquiredChan <- struct{}{} time.Sleep(duration) } // TestStatsConnTopoListDir emits stats on ListDir func TestStatsConnTopoListDir(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() - go createTestReadSemaphoreContention(ctx, 100*time.Millisecond) + semAcquiredChan := make(chan struct{}) + go createTestReadSemaphoreContention(ctx, 100*time.Millisecond, semAcquiredChan) + <-semAcquiredChan statsConn.ListDir(ctx, "", true) - timingCounts := topoStatsConnTimings.Counts()["ListDir.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["ListDir.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) - waitTimingsCounts := topoStatsConnReadWaitTimings.Counts()["ListDir.global"] - if got := waitTimingsCounts; got != 1 { - t.Errorf("stats were not properly recorded: got = %d, want = 1", got) - } + require.Equal(t, int64(1), topoStatsConnReadWaitTimings.Counts()["ListDir.global"]) + require.NotZero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["ListDir.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["ListDir.global"]) statsConn.ListDir(ctx, "error", true) // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["ListDir.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["ListDir.global"]) } // TestStatsConnTopoCreate emits stats on Create func TestStatsConnTopoCreate(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() statsConn.Create(ctx, "", []byte{}) - timingCounts := topoStatsConnTimings.Counts()["Create.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Create.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["Create.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["Create.global"]) statsConn.Create(ctx, "error", []byte{}) // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["Create.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["Create.global"]) } // TestStatsConnTopoUpdate emits stats on Update func TestStatsConnTopoUpdate(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() statsConn.Update(ctx, "", []byte{}, conn.v) - timingCounts := topoStatsConnTimings.Counts()["Update.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Update.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["Update.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["Update.global"]) statsConn.Update(ctx, "error", []byte{}, conn.v) // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["Update.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["Update.global"]) } // TestStatsConnTopoGet emits stats on Get func TestStatsConnTopoGet(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() - go createTestReadSemaphoreContention(ctx, time.Millisecond*100) + semAcquiredChan := make(chan struct{}) + go createTestReadSemaphoreContention(ctx, time.Millisecond*100, semAcquiredChan) + <-semAcquiredChan statsConn.Get(ctx, "") - timingCounts := topoStatsConnTimings.Counts()["Get.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Get.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) - waitTimingsCounts := topoStatsConnReadWaitTimings.Counts()["Get.global"] - if got := waitTimingsCounts; got != 1 { - t.Errorf("stats were not properly recorded: got = %d, want = 1", got) - } + require.Equal(t, int64(1), topoStatsConnReadWaitTimings.Counts()["Get.global"]) + require.NotZero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["Get.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["Get.global"]) statsConn.Get(ctx, "error") // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["Get.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["Get.global"]) } // TestStatsConnTopoDelete emits stats on Delete func TestStatsConnTopoDelete(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() statsConn.Delete(ctx, "", conn.v) - timingCounts := topoStatsConnTimings.Counts()["Delete.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Delete.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["Delete.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["Delete.global"]) statsConn.Delete(ctx, "error", conn.v) // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["Delete.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["Delete.global"]) } // TestStatsConnTopoLock emits stats on Lock func TestStatsConnTopoLock(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() statsConn.Lock(ctx, "", "") - timingCounts := topoStatsConnTimings.Counts()["Lock.global"] - require.Equal(t, timingCounts, int64(1)) + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Lock.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) statsConn.LockWithTTL(ctx, "", "", time.Second) - timingCounts = topoStatsConnTimings.Counts()["LockWithTTL.global"] - require.Equal(t, timingCounts, int64(1)) + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["LockWithTTL.global"]) statsConn.LockName(ctx, "", "") - timingCounts = topoStatsConnTimings.Counts()["LockName.global"] - require.Equal(t, timingCounts, int64(1)) + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["LockName.global"]) // Error is zero before getting an error. - errorCount := topoStatsConnErrors.Counts()["Lock.global"] - require.Equal(t, errorCount, int64(0)) + require.Zero(t, topoStatsConnErrors.Counts()["Lock.global"]) statsConn.Lock(ctx, "error", "") // Error stats gets emitted. - errorCount = topoStatsConnErrors.Counts()["Lock.global"] - require.Equal(t, errorCount, int64(1)) + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["Lock.global"]) } // TestStatsConnTopoWatch emits stats on Watch func TestStatsConnTopoWatch(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) ctx := context.Background() statsConn.Watch(ctx, "") - timingCounts := topoStatsConnTimings.Counts()["Watch.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } - + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Watch.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) } // TestStatsConnTopoNewLeaderParticipation emits stats on NewLeaderParticipation func TestStatsConnTopoNewLeaderParticipation(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) _, _ = statsConn.NewLeaderParticipation("", "") - timingCounts := topoStatsConnTimings.Counts()["NewLeaderParticipation.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["NewLeaderParticipation.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) // error is zero before getting an error - errorCount := topoStatsConnErrors.Counts()["NewLeaderParticipation.global"] - if got, want := errorCount, int64(0); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Zero(t, topoStatsConnErrors.Counts()["NewLeaderParticipation.global"]) _, _ = statsConn.NewLeaderParticipation("error", "") // error stats gets emitted - errorCount = topoStatsConnErrors.Counts()["NewLeaderParticipation.global"] - if got, want := errorCount, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnErrors.Counts()["NewLeaderParticipation.global"]) } // TestStatsConnTopoClose emits stats on Close func TestStatsConnTopoClose(t *testing.T) { + testStatsConnStatsReset() + defer testStatsConnStatsReset() + conn := &fakeConn{} statsConn := NewStatsConn("global", conn, testStatsConnReadSem) statsConn.Close() - timingCounts := topoStatsConnTimings.Counts()["Close.global"] - if got, want := timingCounts, int64(1); got != want { - t.Errorf("stats were not properly recorded: got = %d, want = %d", got, want) - } + require.Equal(t, int64(1), topoStatsConnTimings.Counts()["Close.global"]) + require.NotZero(t, topoStatsConnTimings.Time()) + require.Zero(t, topoStatsConnReadWaitTimings.Time()) } From 9b0bbadd8bf61a43e7a104f23b4d8089af5e738c Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Fri, 10 Jan 2025 14:13:13 -0500 Subject: [PATCH 20/66] Use uint64 for binary log file position (#17472) Signed-off-by: Matt Lord --- go/mysql/binlog_event.go | 2 +- go/mysql/binlog_event_common.go | 7 ++++--- go/mysql/binlog_event_filepos.go | 9 +++++---- go/mysql/replication.go | 12 +++++++++--- go/mysql/replication/filepos_gtid.go | 6 +++--- go/mysql/replication/filepos_gtid_test.go | 9 +++++++-- go/mysql/replication_test.go | 5 +++++ go/test/endtoend/migration/migration_test.go | 16 ++++++---------- .../vtorc/readtopologyinstance/main_test.go | 10 +++++----- go/vt/vtorc/inst/analysis_dao.go | 2 +- go/vt/vtorc/inst/binlog.go | 11 ++++++----- go/vt/vtorc/inst/binlog_test.go | 4 ++-- go/vt/vtorc/inst/instance_dao.go | 8 ++++---- .../testlib/emergency_reparent_shard_test.go | 5 +++-- 14 files changed, 61 insertions(+), 45 deletions(-) diff --git a/go/mysql/binlog_event.go b/go/mysql/binlog_event.go index 72c228b594e..90c2d7b9668 100644 --- a/go/mysql/binlog_event.go +++ b/go/mysql/binlog_event.go @@ -48,7 +48,7 @@ type BinlogEvent interface { IsValid() bool // General protocol events. - NextPosition() uint32 + NextPosition() uint64 // IsFormatDescription returns true if this is a // FORMAT_DESCRIPTION_EVENT. Do not call StripChecksum before diff --git a/go/mysql/binlog_event_common.go b/go/mysql/binlog_event_common.go index 548875c44f7..0bd9d401eaa 100644 --- a/go/mysql/binlog_event_common.go +++ b/go/mysql/binlog_event_common.go @@ -47,7 +47,7 @@ import ( // +----------------------------+ // | extra_headers 19 : x-19 | // +============================+ -// http://dev.mysql.com/doc/internals/en/event-header-fields.html +// https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_replication_binlog_event.html#sect_protocol_replication_binlog_event_header type binlogEvent []byte const ( @@ -119,8 +119,9 @@ func (ev binlogEvent) Length() uint32 { } // NextPosition returns the nextPosition field from the header -func (ev binlogEvent) NextPosition() uint32 { - return binary.LittleEndian.Uint32(ev.Bytes()[13 : 13+4]) +func (ev binlogEvent) NextPosition() uint64 { + // Only 4 bytes are used for the next_position field in the header. + return uint64(binary.LittleEndian.Uint32(ev.Bytes()[13:17])) } // IsFormatDescription implements BinlogEvent.IsFormatDescription(). diff --git a/go/mysql/binlog_event_filepos.go b/go/mysql/binlog_event_filepos.go index b7e6ed9e0f2..8c60956faf1 100644 --- a/go/mysql/binlog_event_filepos.go +++ b/go/mysql/binlog_event_filepos.go @@ -75,12 +75,13 @@ func (ev *filePosBinlogEvent) StripChecksum(f BinlogFormat) (BinlogEvent, []byte // nextPosition returns the next file position of the binlog. // If no information is available, it returns 0. -func (ev *filePosBinlogEvent) nextPosition(f BinlogFormat) uint32 { +func (ev *filePosBinlogEvent) nextPosition(f BinlogFormat) uint64 { if f.HeaderLength <= 13 { // Dead code. This is just a failsafe. return 0 } - return binary.LittleEndian.Uint32(ev.Bytes()[13:17]) + // The header only uses 4 bytes for the next_position. + return uint64(binary.LittleEndian.Uint32(ev.Bytes()[13:17])) } // rotate implements BinlogEvent.Rotate(). @@ -139,7 +140,7 @@ type filePosFakeEvent struct { timestamp uint32 } -func (ev filePosFakeEvent) NextPosition() uint32 { +func (ev filePosFakeEvent) NextPosition() uint64 { return 0 } @@ -283,7 +284,7 @@ type filePosGTIDEvent struct { gtid replication.FilePosGTID } -func newFilePosGTIDEvent(file string, pos uint32, timestamp uint32) filePosGTIDEvent { +func newFilePosGTIDEvent(file string, pos uint64, timestamp uint32) filePosGTIDEvent { return filePosGTIDEvent{ filePosFakeEvent: filePosFakeEvent{ timestamp: timestamp, diff --git a/go/mysql/replication.go b/go/mysql/replication.go index 84c65842c7e..4c5a0c9523e 100644 --- a/go/mysql/replication.go +++ b/go/mysql/replication.go @@ -18,6 +18,7 @@ package mysql import ( "fmt" + "math" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/vt/proto/vtrpc" @@ -32,9 +33,14 @@ const ( // This file contains the methods related to replication. // WriteComBinlogDump writes a ComBinlogDump command. -// See http://dev.mysql.com/doc/internals/en/com-binlog-dump.html for syntax. // Returns a SQLError. -func (c *Conn) WriteComBinlogDump(serverID uint32, binlogFilename string, binlogPos uint32, flags uint16) error { +// See: https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_binlog_dump.html +func (c *Conn) WriteComBinlogDump(serverID uint32, binlogFilename string, binlogPos uint64, flags uint16) error { + // The binary log file position is a uint64, but the protocol command + // only uses 4 bytes for the file position. + if binlogPos > math.MaxUint32 { + return vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "binlog position %d is too large, it must fit into 32 bits", binlogPos) + } c.sequence = 0 length := 1 + // ComBinlogDump 4 + // binlog-pos @@ -43,7 +49,7 @@ func (c *Conn) WriteComBinlogDump(serverID uint32, binlogFilename string, binlog len(binlogFilename) // binlog-filename data, pos := c.startEphemeralPacketWithHeader(length) pos = writeByte(data, pos, ComBinlogDump) - pos = writeUint32(data, pos, binlogPos) + pos = writeUint32(data, pos, uint32(binlogPos)) pos = writeUint16(data, pos, flags) pos = writeUint32(data, pos, serverID) _ = writeEOFString(data, pos, binlogFilename) diff --git a/go/mysql/replication/filepos_gtid.go b/go/mysql/replication/filepos_gtid.go index 850fb421915..95c7efcd3b1 100644 --- a/go/mysql/replication/filepos_gtid.go +++ b/go/mysql/replication/filepos_gtid.go @@ -33,14 +33,14 @@ func parseFilePosGTID(s string) (GTID, error) { return nil, fmt.Errorf("invalid FilePos GTID (%v): expecting file:pos", s) } - pos, err := strconv.ParseUint(parts[1], 0, 32) + pos, err := strconv.ParseUint(parts[1], 0, 64) if err != nil { return nil, fmt.Errorf("invalid FilePos GTID (%v): expecting pos to be an integer", s) } return FilePosGTID{ File: parts[0], - Pos: uint32(pos), + Pos: pos, }, nil } @@ -56,7 +56,7 @@ func ParseFilePosGTIDSet(s string) (GTIDSet, error) { // FilePosGTID implements GTID. type FilePosGTID struct { File string - Pos uint32 + Pos uint64 } // String implements GTID.String(). diff --git a/go/mysql/replication/filepos_gtid_test.go b/go/mysql/replication/filepos_gtid_test.go index 174aed6ccf9..6cef4756af2 100644 --- a/go/mysql/replication/filepos_gtid_test.go +++ b/go/mysql/replication/filepos_gtid_test.go @@ -23,7 +23,7 @@ import ( func Test_filePosGTID_String(t *testing.T) { type fields struct { file string - pos uint32 + pos uint64 } tests := []struct { name string @@ -35,6 +35,11 @@ func Test_filePosGTID_String(t *testing.T) { fields{file: "mysql-bin.166031", pos: 192394}, "mysql-bin.166031:192394", }, + { + "handles large position correctly", + fields{file: "vt-1448040107-bin.003222", pos: 4663881395}, + "vt-1448040107-bin.003222:4663881395", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -52,7 +57,7 @@ func Test_filePosGTID_String(t *testing.T) { func Test_filePosGTID_ContainsGTID(t *testing.T) { type fields struct { file string - pos uint32 + pos uint64 } type args struct { other GTID diff --git a/go/mysql/replication_test.go b/go/mysql/replication_test.go index c9a54485497..680cb9e68dc 100644 --- a/go/mysql/replication_test.go +++ b/go/mysql/replication_test.go @@ -17,6 +17,7 @@ limitations under the License. package mysql import ( + "math" "reflect" "testing" @@ -37,6 +38,10 @@ func TestComBinlogDump(t *testing.T) { cConn.Close() }() + // Try to write a ComBinlogDump packet with a position greater than 4 bytes. + err := cConn.WriteComBinlogDump(1, "moofarm", math.MaxInt64, 0x0d0e) + require.Error(t, err) + // Write ComBinlogDump packet, read it, compare. if err := cConn.WriteComBinlogDump(0x01020304, "moofarm", 0x05060708, 0x090a); err != nil { t.Fatalf("WriteComBinlogDump failed: %v", err) diff --git a/go/test/endtoend/migration/migration_test.go b/go/test/endtoend/migration/migration_test.go index eca112e388d..54afd2cb3ee 100644 --- a/go/test/endtoend/migration/migration_test.go +++ b/go/test/endtoend/migration/migration_test.go @@ -132,10 +132,6 @@ three streams although only two are required. This is to show that there can exi streams from the same source. The main difference between an external source vs a vitess source is that the source proto contains an "external_mysql" field instead of keyspace and shard. That field is the key into the externalConnections section of the input yaml. - -VReplicationExec: insert into _vt.vreplication (workflow, db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state) values('product', 'vt_commerce', 'filter: > external_mysql:\"product\" ', ”, 9999, 9999, 'primary', 0, 0, 'Running') -VReplicationExec: insert into _vt.vreplication (workflow, db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state) values('customer', 'vt_commerce', 'filter: > external_mysql:\"customer\" ', ”, 9999, 9999, 'primary', 0, 0, 'Running') -VReplicationExec: insert into _vt.vreplication (workflow, db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state) values('orders', 'vt_commerce', 'filter: > external_mysql:\"customer\" ', ”, 9999, 9999, 'primary', 0, 0, 'Running') */ func TestMigration(t *testing.T) { yamlFile := startCluster(t) @@ -155,7 +151,7 @@ func TestMigration(t *testing.T) { migrate(t, "customer", "commerce", []string{"customer"}) migrate(t, "customer", "commerce", []string{"orders"}) vttablet := keyspaces["commerce"].Shards[0].Vttablets[0].VttabletProcess - waitForVReplicationToCatchup(t, vttablet, 1*time.Second) + waitForVReplicationToCatchup(t, vttablet, 30*time.Second) testcases := []struct { query string @@ -217,11 +213,11 @@ func migrate(t *testing.T, fromdb, toks string, tables []string) { var sqlEscaped bytes.Buffer val.EncodeSQL(&sqlEscaped) query := fmt.Sprintf("insert into _vt.vreplication "+ - "(workflow, db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state) values"+ - "('%s', '%s', %s, '', 9999, 9999, 'primary', 0, 0, 'Running')", tables[0], "vt_"+toks, sqlEscaped.String()) - fmt.Printf("VReplicationExec: %s\n", query) - vttablet := keyspaces[toks].Shards[0].Vttablets[0].VttabletProcess - err := clusterInstance.VtctldClientProcess.ExecuteCommand("VReplicationExec", vttablet.TabletPath, query) + "(workflow, db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state, options) values"+ + "('%s', '%s', %s, '', 9999, 9999, 'primary', 0, 0, 'Running', '{}')", tables[0], "vt_"+toks, sqlEscaped.String()) + fmt.Printf("VReplication insert: %s\n", query) + vttablet := keyspaces[toks].Shards[0].Vttablets[0].Alias + err := clusterInstance.VtctldClientProcess.ExecuteCommand("ExecuteFetchAsDBA", vttablet, query) require.NoError(t, err) } diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index 419a2e843c3..c58e8e9bb45 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -86,7 +86,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.Equal(t, "ON", primaryInstance.GTIDMode) assert.Equal(t, "FULL", primaryInstance.BinlogRowImage) assert.Contains(t, primaryInstance.SelfBinlogCoordinates.LogFile, fmt.Sprintf("vt-0000000%d-bin", primary.TabletUID)) - assert.Greater(t, primaryInstance.SelfBinlogCoordinates.LogPos, uint32(0)) + assert.Greater(t, primaryInstance.SelfBinlogCoordinates.LogPos, uint64(0)) assert.True(t, primaryInstance.SemiSyncPrimaryEnabled) assert.True(t, primaryInstance.SemiSyncReplicaEnabled) assert.True(t, primaryInstance.SemiSyncPrimaryStatus) @@ -138,7 +138,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.Equal(t, utils.Hostname, replicaInstance.SourceHost) assert.Equal(t, primary.MySQLPort, replicaInstance.SourcePort) assert.Contains(t, replicaInstance.SelfBinlogCoordinates.LogFile, fmt.Sprintf("vt-0000000%d-bin", replica.TabletUID)) - assert.Greater(t, replicaInstance.SelfBinlogCoordinates.LogPos, uint32(0)) + assert.Greater(t, replicaInstance.SelfBinlogCoordinates.LogPos, uint64(0)) assert.False(t, replicaInstance.SemiSyncPrimaryEnabled) assert.True(t, replicaInstance.SemiSyncReplicaEnabled) assert.False(t, replicaInstance.SemiSyncPrimaryStatus) @@ -156,11 +156,11 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.True(t, replicaInstance.ReplicationIOThreadRuning) assert.True(t, replicaInstance.ReplicationSQLThreadRuning) assert.Equal(t, replicaInstance.ReadBinlogCoordinates.LogFile, primaryInstance.SelfBinlogCoordinates.LogFile) - assert.Greater(t, replicaInstance.ReadBinlogCoordinates.LogPos, uint32(0)) + assert.Greater(t, replicaInstance.ReadBinlogCoordinates.LogPos, uint64(0)) assert.Equal(t, replicaInstance.ExecBinlogCoordinates.LogFile, primaryInstance.SelfBinlogCoordinates.LogFile) - assert.Greater(t, replicaInstance.ExecBinlogCoordinates.LogPos, uint32(0)) + assert.Greater(t, replicaInstance.ExecBinlogCoordinates.LogPos, uint64(0)) assert.Contains(t, replicaInstance.RelaylogCoordinates.LogFile, fmt.Sprintf("vt-0000000%d-relay", replica.TabletUID)) - assert.Greater(t, replicaInstance.RelaylogCoordinates.LogPos, uint32(0)) + assert.Greater(t, replicaInstance.RelaylogCoordinates.LogPos, uint64(0)) assert.Empty(t, replicaInstance.LastIOError) assert.Empty(t, replicaInstance.LastSQLError) assert.EqualValues(t, 0, replicaInstance.SQLDelay) diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index fc91c28b021..7837955c541 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -311,7 +311,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna a.AnalyzedInstancePrimaryAlias = topoproto.TabletAliasString(primaryTablet.Alias) a.AnalyzedInstanceBinlogCoordinates = BinlogCoordinates{ LogFile: m.GetString("binary_log_file"), - LogPos: m.GetUint32("binary_log_pos"), + LogPos: m.GetUint64("binary_log_pos"), Type: BinaryLog, } isStaleBinlogCoordinates := m.GetBool("is_stale_binlog_coordinates") diff --git a/go/vt/vtorc/inst/binlog.go b/go/vt/vtorc/inst/binlog.go index 9c115e4e457..b4abf34ac7e 100644 --- a/go/vt/vtorc/inst/binlog.go +++ b/go/vt/vtorc/inst/binlog.go @@ -40,22 +40,23 @@ const ( // BinlogCoordinates described binary log coordinates in the form of log file & log position. type BinlogCoordinates struct { LogFile string - LogPos uint32 + LogPos uint64 Type BinlogType } -// ParseInstanceKey will parse an InstanceKey from a string representation such as 127.0.0.1:3306 +// ParseBinlogCoordinates will parse a string representation such as "mysql-bin.000001:12345" +// into a BinlogCoordinates struct. func ParseBinlogCoordinates(logFileLogPos string) (*BinlogCoordinates, error) { tokens := strings.SplitN(logFileLogPos, ":", 2) if len(tokens) != 2 { return nil, fmt.Errorf("ParseBinlogCoordinates: Cannot parse BinlogCoordinates from %s. Expected format is file:pos", logFileLogPos) } - logPos, err := strconv.ParseUint(tokens[1], 10, 32) + logPos, err := strconv.ParseUint(tokens[1], 10, 64) if err != nil { return nil, fmt.Errorf("ParseBinlogCoordinates: invalid pos: %s", tokens[1]) } - return &BinlogCoordinates{LogFile: tokens[0], LogPos: uint32(logPos)}, nil + return &BinlogCoordinates{LogFile: tokens[0], LogPos: logPos}, nil } // DisplayString returns a user-friendly string representation of these coordinates @@ -177,6 +178,6 @@ func (binlogCoordinates *BinlogCoordinates) ExtractDetachedCoordinates() (isDeta } detachedCoordinates.LogFile = detachedCoordinatesSubmatch[1] logPos, _ := strconv.ParseUint(detachedCoordinatesSubmatch[2], 10, 32) - detachedCoordinates.LogPos = uint32(logPos) + detachedCoordinates.LogPos = logPos return true, detachedCoordinates } diff --git a/go/vt/vtorc/inst/binlog_test.go b/go/vt/vtorc/inst/binlog_test.go index bc0110e981c..1f73f3c0029 100644 --- a/go/vt/vtorc/inst/binlog_test.go +++ b/go/vt/vtorc/inst/binlog_test.go @@ -41,7 +41,7 @@ func TestPreviousFileCoordinates(t *testing.T) { require.NoError(t, err) require.Equal(t, previous.LogFile, "mysql-bin.000009") - require.Equal(t, previous.LogPos, uint32(0)) + require.Equal(t, previous.LogPos, uint64(0)) } func TestNextFileCoordinates(t *testing.T) { @@ -49,7 +49,7 @@ func TestNextFileCoordinates(t *testing.T) { require.NoError(t, err) require.Equal(t, next.LogFile, "mysql-bin.000011") - require.Equal(t, next.LogPos, uint32(0)) + require.Equal(t, next.LogPos, uint64(0)) } func TestBinlogCoordinates(t *testing.T) { diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index 66aef7c8a78..9198514d6ed 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -548,14 +548,14 @@ func readInstanceRow(m sqlutils.RowMap) *Instance { instance.GtidPurged = m.GetString("gtid_purged") instance.GtidErrant = m.GetString("gtid_errant") instance.SelfBinlogCoordinates.LogFile = m.GetString("binary_log_file") - instance.SelfBinlogCoordinates.LogPos = m.GetUint32("binary_log_pos") + instance.SelfBinlogCoordinates.LogPos = m.GetUint64("binary_log_pos") instance.ReadBinlogCoordinates.LogFile = m.GetString("source_log_file") - instance.ReadBinlogCoordinates.LogPos = m.GetUint32("read_source_log_pos") + instance.ReadBinlogCoordinates.LogPos = m.GetUint64("read_source_log_pos") instance.ExecBinlogCoordinates.LogFile = m.GetString("relay_source_log_file") - instance.ExecBinlogCoordinates.LogPos = m.GetUint32("exec_source_log_pos") + instance.ExecBinlogCoordinates.LogPos = m.GetUint64("exec_source_log_pos") instance.IsDetached, _ = instance.ExecBinlogCoordinates.ExtractDetachedCoordinates() instance.RelaylogCoordinates.LogFile = m.GetString("relay_log_file") - instance.RelaylogCoordinates.LogPos = m.GetUint32("relay_log_pos") + instance.RelaylogCoordinates.LogPos = m.GetUint64("relay_log_pos") instance.RelaylogCoordinates.Type = RelayLog instance.LastSQLError = m.GetString("last_sql_error") instance.LastIOError = m.GetString("last_io_error") diff --git a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go index 984ff93095e..3251c7c8e3d 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -133,7 +133,8 @@ func TestEmergencyReparentShard(t *testing.T) { }, }, }) - goodReplica1RelayLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:455") + goodReplica1RelayLogPos, err := replication.ParseFilePosGTIDSet("relay-bin.003222:18321744073709551612") // Requires all 64 bits or uint64 + require.NoError(t, err) goodReplica1.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: goodReplica1RelayLogPos, } @@ -182,7 +183,7 @@ func TestEmergencyReparentShard(t *testing.T) { // run EmergencyReparentShard waitReplicaTimeout := time.Second * 2 - err := vp.Run([]string{"EmergencyReparentShard", "--wait_replicas_timeout", waitReplicaTimeout.String(), newPrimary.Tablet.Keyspace + "/" + newPrimary.Tablet.Shard, + err = vp.Run([]string{"EmergencyReparentShard", "--wait_replicas_timeout", waitReplicaTimeout.String(), newPrimary.Tablet.Keyspace + "/" + newPrimary.Tablet.Shard, topoproto.TabletAliasString(newPrimary.Tablet.Alias)}) require.NoError(t, err) // check what was run From 54dfd6005bcdd599604d42a6771cdf5a1025d7d9 Mon Sep 17 00:00:00 2001 From: Noble Mittal <62551163+beingnoble03@users.noreply.github.com> Date: Sat, 11 Jan 2025 02:01:48 +0530 Subject: [PATCH 21/66] Move VDiff related workflow server APIs to `vdiff.go` and add unit tests (#17466) Signed-off-by: Noble Mittal --- go/vt/vtctl/workflow/server.go | 284 ---------------------- go/vt/vtctl/workflow/server_test.go | 253 -------------------- go/vt/vtctl/workflow/vdiff.go | 291 +++++++++++++++++++++++ go/vt/vtctl/workflow/vdiff_test.go | 355 ++++++++++++++++++++++++++++ 4 files changed, 646 insertions(+), 537 deletions(-) diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index 8123416eb41..f27851275b6 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -20,7 +20,6 @@ import ( "context" "errors" "fmt" - "math" "slices" "sort" "strings" @@ -28,7 +27,6 @@ import ( "text/template" "time" - "github.com/google/uuid" "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" "google.golang.org/grpc/codes" @@ -41,7 +39,6 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/concurrency" - "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logutil" @@ -1249,287 +1246,6 @@ func (s *Server) ReshardCreate(ctx context.Context, req *vtctldatapb.ReshardCrea }) } -// VDiffCreate is part of the vtctlservicepb.VtctldServer interface. -// It passes on the request to the target primary tablets that are -// participating in the given workflow and VDiff. -func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRequest) (*vtctldatapb.VDiffCreateResponse, error) { - span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffCreate") - defer span.Finish() - - span.Annotate("keyspace", req.TargetKeyspace) - span.Annotate("workflow", req.Workflow) - span.Annotate("uuid", req.Uuid) - span.Annotate("source_cells", req.SourceCells) - span.Annotate("target_cells", req.TargetCells) - span.Annotate("tablet_types", req.TabletTypes) - span.Annotate("tables", req.Tables) - span.Annotate("auto_retry", req.AutoRetry) - span.Annotate("max_diff_duration", req.MaxDiffDuration) - if req.AutoStart != nil { - span.Annotate("auto_start", req.GetAutoStart()) - } - - var err error - req.Uuid = strings.TrimSpace(req.Uuid) - if req.Uuid == "" { // Generate a UUID - req.Uuid = uuid.New().String() - } else { // Validate UUID if provided - if err = uuid.Validate(req.Uuid); err != nil { - return nil, vterrors.Wrapf(err, "invalid UUID provided: %s", req.Uuid) - } - } - - tabletTypesStr := discovery.BuildTabletTypesString(req.TabletTypes, req.TabletSelectionPreference) - - if req.Limit == 0 { // This would produce no useful results - req.Limit = math.MaxInt64 - } - // This is a pointer so there's no ZeroValue in the message - // and an older v18 client will not provide it. - if req.MaxDiffDuration == nil { - req.MaxDiffDuration = &vttimepb.Duration{} - } - // The other vttime.Duration vars should not be nil as the - // client should always provide them, but we check anyway to - // be safe. - if req.FilteredReplicationWaitTime == nil { - // A value of 0 is not valid as the vdiff will never succeed. - req.FilteredReplicationWaitTime = &vttimepb.Duration{ - Seconds: int64(DefaultTimeout.Seconds()), - } - } - if req.WaitUpdateInterval == nil { - req.WaitUpdateInterval = &vttimepb.Duration{} - } - - autoStart := true - if req.AutoStart != nil { - autoStart = req.GetAutoStart() - } - - options := &tabletmanagerdatapb.VDiffOptions{ - PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ - TabletTypes: tabletTypesStr, - SourceCell: strings.Join(req.SourceCells, ","), - TargetCell: strings.Join(req.TargetCells, ","), - }, - CoreOptions: &tabletmanagerdatapb.VDiffCoreOptions{ - Tables: strings.Join(req.Tables, ","), - AutoRetry: req.AutoRetry, - MaxRows: req.Limit, - TimeoutSeconds: req.FilteredReplicationWaitTime.Seconds, - MaxExtraRowsToCompare: req.MaxExtraRowsToCompare, - UpdateTableStats: req.UpdateTableStats, - MaxDiffSeconds: req.MaxDiffDuration.Seconds, - AutoStart: &autoStart, - }, - ReportOptions: &tabletmanagerdatapb.VDiffReportOptions{ - OnlyPks: req.OnlyPKs, - DebugQuery: req.DebugQuery, - MaxSampleRows: req.MaxReportSampleRows, - RowDiffColumnTruncateAt: req.RowDiffColumnTruncateAt, - }, - } - - tabletreq := &tabletmanagerdatapb.VDiffRequest{ - Keyspace: req.TargetKeyspace, - Workflow: req.Workflow, - Action: string(vdiff.CreateAction), - Options: options, - VdiffUuid: req.Uuid, - } - - ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - if ts.frozen { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "invalid VDiff run: writes have been already been switched for workflow %s.%s", - req.TargetKeyspace, req.Workflow) - } - - workflowStatus, err := s.getWorkflowStatus(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - if workflowStatus != binlogdatapb.VReplicationWorkflowState_Running { - s.Logger().Infof("Workflow %s.%s is not running, cannot start VDiff in state %s", req.TargetKeyspace, req.Workflow, workflowStatus) - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, - "not all streams are running in workflow %s.%s", req.TargetKeyspace, req.Workflow) - } - - err = ts.ForAllTargets(func(target *MigrationTarget) error { - _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) - return err - }) - if err != nil { - s.Logger().Errorf("Error executing vdiff create action: %v", err) - return nil, err - } - - return &vtctldatapb.VDiffCreateResponse{ - UUID: req.Uuid, - }, nil -} - -// VDiffDelete is part of the vtctlservicepb.VtctldServer interface. -func (s *Server) VDiffDelete(ctx context.Context, req *vtctldatapb.VDiffDeleteRequest) (*vtctldatapb.VDiffDeleteResponse, error) { - span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffDelete") - defer span.Finish() - - span.Annotate("keyspace", req.TargetKeyspace) - span.Annotate("workflow", req.Workflow) - span.Annotate("argument", req.Arg) - - tabletreq := &tabletmanagerdatapb.VDiffRequest{ - Keyspace: req.TargetKeyspace, - Workflow: req.Workflow, - Action: string(vdiff.DeleteAction), - ActionArg: req.Arg, - } - - ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - - err = ts.ForAllTargets(func(target *MigrationTarget) error { - _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) - return err - }) - if err != nil { - s.Logger().Errorf("Error executing vdiff delete action: %v", err) - return nil, err - } - - return &vtctldatapb.VDiffDeleteResponse{}, nil -} - -// VDiffResume is part of the vtctlservicepb.VtctldServer interface. -func (s *Server) VDiffResume(ctx context.Context, req *vtctldatapb.VDiffResumeRequest) (*vtctldatapb.VDiffResumeResponse, error) { - span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffResume") - defer span.Finish() - - targetShards := req.GetTargetShards() - - span.Annotate("keyspace", req.TargetKeyspace) - span.Annotate("workflow", req.Workflow) - span.Annotate("uuid", req.Uuid) - span.Annotate("target_shards", targetShards) - - tabletreq := &tabletmanagerdatapb.VDiffRequest{ - Keyspace: req.TargetKeyspace, - Workflow: req.Workflow, - Action: string(vdiff.ResumeAction), - VdiffUuid: req.Uuid, - } - - ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - - if len(targetShards) > 0 { - if err := applyTargetShards(ts, targetShards); err != nil { - return nil, err - } - } - - err = ts.ForAllTargets(func(target *MigrationTarget) error { - _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) - return err - }) - if err != nil { - s.Logger().Errorf("Error executing vdiff resume action: %v", err) - return nil, err - } - - return &vtctldatapb.VDiffResumeResponse{}, nil -} - -// VDiffShow is part of the vtctlservicepb.VtctldServer interface. -func (s *Server) VDiffShow(ctx context.Context, req *vtctldatapb.VDiffShowRequest) (*vtctldatapb.VDiffShowResponse, error) { - span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffShow") - defer span.Finish() - - span.Annotate("keyspace", req.TargetKeyspace) - span.Annotate("workflow", req.Workflow) - span.Annotate("argument", req.Arg) - - tabletreq := &tabletmanagerdatapb.VDiffRequest{ - Keyspace: req.TargetKeyspace, - Workflow: req.Workflow, - Action: string(vdiff.ShowAction), - ActionArg: req.Arg, - } - - ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - - output := &vdiffOutput{ - responses: make(map[string]*tabletmanagerdatapb.VDiffResponse, len(ts.targets)), - err: nil, - } - output.err = ts.ForAllTargets(func(target *MigrationTarget) error { - resp, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) - output.mu.Lock() - defer output.mu.Unlock() - output.responses[target.GetShard().ShardName()] = resp - return err - }) - if output.err != nil { - s.Logger().Errorf("Error executing vdiff show action: %v", output.err) - return nil, output.err - } - return &vtctldatapb.VDiffShowResponse{ - TabletResponses: output.responses, - }, nil -} - -// VDiffStop is part of the vtctlservicepb.VtctldServer interface. -func (s *Server) VDiffStop(ctx context.Context, req *vtctldatapb.VDiffStopRequest) (*vtctldatapb.VDiffStopResponse, error) { - span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffStop") - defer span.Finish() - - targetShards := req.GetTargetShards() - - span.Annotate("keyspace", req.TargetKeyspace) - span.Annotate("workflow", req.Workflow) - span.Annotate("uuid", req.Uuid) - span.Annotate("target_shards", targetShards) - - tabletreq := &tabletmanagerdatapb.VDiffRequest{ - Keyspace: req.TargetKeyspace, - Workflow: req.Workflow, - Action: string(vdiff.StopAction), - VdiffUuid: req.Uuid, - } - - ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) - if err != nil { - return nil, err - } - - if len(targetShards) > 0 { - if err := applyTargetShards(ts, targetShards); err != nil { - return nil, err - } - } - - err = ts.ForAllTargets(func(target *MigrationTarget) error { - _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) - return err - }) - if err != nil { - s.Logger().Errorf("Error executing vdiff stop action: %v", err) - return nil, err - } - - return &vtctldatapb.VDiffStopResponse{}, nil -} - // WorkflowDelete is part of the vtctlservicepb.VtctldServer interface. // It passes on the request to the target primary tablets that are // participating in the given workflow. diff --git a/go/vt/vtctl/workflow/server_test.go b/go/vt/vtctl/workflow/server_test.go index 26d722f1de0..8bb4a06f23a 100644 --- a/go/vt/vtctl/workflow/server_test.go +++ b/go/vt/vtctl/workflow/server_test.go @@ -27,7 +27,6 @@ import ( "testing" "time" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/prototext" @@ -39,7 +38,6 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtenv" - "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" "vitess.io/vitess/go/vt/vttablet/tmclient" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -191,257 +189,6 @@ func TestCheckReshardingJournalExistsOnTablet(t *testing.T) { } } -// TestVDiffCreate performs some basic tests of the VDiffCreate function -// to ensure that it behaves as expected given a specific request. -func TestVDiffCreate(t *testing.T) { - ctx := context.Background() - workflowName := "wf1" - sourceKeyspace := &testKeyspace{ - KeyspaceName: "source", - ShardNames: []string{"0"}, - } - targetKeyspace := &testKeyspace{ - KeyspaceName: "target", - ShardNames: []string{"-80", "80-"}, - } - env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) - defer env.close() - - tests := []struct { - name string - req *vtctldatapb.VDiffCreateRequest - wantErr string - }{ - { - name: "no values", - req: &vtctldatapb.VDiffCreateRequest{}, - // We did not provide any keyspace or shard. - wantErr: "FindAllShardsInKeyspace() invalid keyspace name: UnescapeID err: invalid input identifier ''", - }, - { - name: "generated UUID", - req: &vtctldatapb.VDiffCreateRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - Workflow: workflowName, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if tt.wantErr == "" { - env.tmc.expectVRQueryResultOnKeyspaceTablets(targetKeyspace.KeyspaceName, &queryResult{ - query: "select vrepl_id, table_name, lastpk from _vt.copy_state where vrepl_id in (1) and id in (select max(id) from _vt.copy_state where vrepl_id in (1) group by vrepl_id, table_name)", - result: &querypb.QueryResult{}, - }) - } - got, err := env.ws.VDiffCreate(ctx, tt.req) - if tt.wantErr != "" { - require.EqualError(t, err, tt.wantErr) - return - } - require.NoError(t, err) - require.NotNil(t, got) - // Ensure that we always use a valid UUID. - err = uuid.Validate(got.UUID) - require.NoError(t, err) - }) - } -} - -func TestVDiffResume(t *testing.T) { - ctx := context.Background() - sourceKeyspace := &testKeyspace{ - KeyspaceName: "sourceks", - ShardNames: []string{"0"}, - } - targetKeyspace := &testKeyspace{ - KeyspaceName: "targetks", - ShardNames: []string{"-80", "80-"}, - } - workflow := "testwf" - uuid := uuid.New().String() - env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) - defer env.close() - - env.tmc.strict = true - action := string(vdiff.ResumeAction) - - tests := []struct { - name string - req *vtctldatapb.VDiffResumeRequest // vtctld requests - expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests - wantErr string - }{ - { - name: "basic resume", // Both target shards - req: &vtctldatapb.VDiffResumeRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Uuid: uuid, - }, - expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - }, - }, - { - name: "resume on first shard", - req: &vtctldatapb.VDiffResumeRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - TargetShards: targetKeyspace.ShardNames[:1], - Workflow: workflow, - Uuid: uuid, - }, - expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - }, - }, - { - name: "resume on invalid shard", - req: &vtctldatapb.VDiffResumeRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - TargetShards: []string{"0"}, - Workflow: workflow, - Uuid: uuid, - }, - wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - for tab, vdr := range tt.expectedVDiffRequests { - env.tmc.expectVDiffRequest(tab, vdr) - } - got, err := env.ws.VDiffResume(ctx, tt.req) - if tt.wantErr != "" { - require.EqualError(t, err, tt.wantErr) - } else { - require.NoError(t, err) - require.NotNil(t, got) - } - env.tmc.confirmVDiffRequests(t) - }) - } -} - -func TestVDiffStop(t *testing.T) { - ctx := context.Background() - sourceKeyspace := &testKeyspace{ - KeyspaceName: "sourceks", - ShardNames: []string{"0"}, - } - targetKeyspace := &testKeyspace{ - KeyspaceName: "targetks", - ShardNames: []string{"-80", "80-"}, - } - workflow := "testwf" - uuid := uuid.New().String() - env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) - defer env.close() - - env.tmc.strict = true - action := string(vdiff.StopAction) - - tests := []struct { - name string - req *vtctldatapb.VDiffStopRequest // vtctld requests - expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests - wantErr string - }{ - { - name: "basic stop", // Both target shards - req: &vtctldatapb.VDiffStopRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Uuid: uuid, - }, - expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - }, - }, - { - name: "stop on first shard", - req: &vtctldatapb.VDiffStopRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - TargetShards: targetKeyspace.ShardNames[:1], - Workflow: workflow, - Uuid: uuid, - }, - expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ - env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { - req: &tabletmanagerdatapb.VDiffRequest{ - Keyspace: targetKeyspace.KeyspaceName, - Workflow: workflow, - Action: action, - VdiffUuid: uuid, - }, - }, - }, - }, - { - name: "stop on invalid shard", - req: &vtctldatapb.VDiffStopRequest{ - TargetKeyspace: targetKeyspace.KeyspaceName, - TargetShards: []string{"0"}, - Workflow: workflow, - Uuid: uuid, - }, - wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - for tab, vdr := range tt.expectedVDiffRequests { - env.tmc.expectVDiffRequest(tab, vdr) - } - got, err := env.ws.VDiffStop(ctx, tt.req) - if tt.wantErr != "" { - require.EqualError(t, err, tt.wantErr) - } else { - require.NoError(t, err) - require.NotNil(t, got) - } - env.tmc.confirmVDiffRequests(t) - }) - } -} - func TestMoveTablesComplete(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() diff --git a/go/vt/vtctl/workflow/vdiff.go b/go/vt/vtctl/workflow/vdiff.go index 6be5fe3c3b5..30953868b0b 100644 --- a/go/vt/vtctl/workflow/vdiff.go +++ b/go/vt/vtctl/workflow/vdiff.go @@ -17,16 +17,26 @@ limitations under the License. package workflow import ( + "context" "encoding/json" "math" "sort" "strings" "time" + "github.com/google/uuid" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/trace" + "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + vttimepb "vitess.io/vitess/go/vt/proto/vttime" ) // TableSummary aggregates the current state of the table diff from all shards. @@ -278,3 +288,284 @@ func BuildProgressReport(rowsCompared int64, rowsToCompare int64, startedAt stri } return report } + +// VDiffCreate is part of the vtctlservicepb.VtctldServer interface. +// It passes on the request to the target primary tablets that are +// participating in the given workflow and VDiff. +func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRequest) (*vtctldatapb.VDiffCreateResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffCreate") + defer span.Finish() + + span.Annotate("keyspace", req.TargetKeyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("uuid", req.Uuid) + span.Annotate("source_cells", req.SourceCells) + span.Annotate("target_cells", req.TargetCells) + span.Annotate("tablet_types", req.TabletTypes) + span.Annotate("tables", req.Tables) + span.Annotate("auto_retry", req.AutoRetry) + span.Annotate("max_diff_duration", req.MaxDiffDuration) + if req.AutoStart != nil { + span.Annotate("auto_start", req.GetAutoStart()) + } + + var err error + req.Uuid = strings.TrimSpace(req.Uuid) + if req.Uuid == "" { // Generate a UUID + req.Uuid = uuid.New().String() + } else { // Validate UUID if provided + if err = uuid.Validate(req.Uuid); err != nil { + return nil, vterrors.Wrapf(err, "invalid UUID provided: %s", req.Uuid) + } + } + + tabletTypesStr := discovery.BuildTabletTypesString(req.TabletTypes, req.TabletSelectionPreference) + + if req.Limit == 0 { // This would produce no useful results + req.Limit = math.MaxInt64 + } + // This is a pointer so there's no ZeroValue in the message + // and an older v18 client will not provide it. + if req.MaxDiffDuration == nil { + req.MaxDiffDuration = &vttimepb.Duration{} + } + // The other vttime.Duration vars should not be nil as the + // client should always provide them, but we check anyway to + // be safe. + if req.FilteredReplicationWaitTime == nil { + // A value of 0 is not valid as the vdiff will never succeed. + req.FilteredReplicationWaitTime = &vttimepb.Duration{ + Seconds: int64(DefaultTimeout.Seconds()), + } + } + if req.WaitUpdateInterval == nil { + req.WaitUpdateInterval = &vttimepb.Duration{} + } + + autoStart := true + if req.AutoStart != nil { + autoStart = req.GetAutoStart() + } + + options := &tabletmanagerdatapb.VDiffOptions{ + PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ + TabletTypes: tabletTypesStr, + SourceCell: strings.Join(req.SourceCells, ","), + TargetCell: strings.Join(req.TargetCells, ","), + }, + CoreOptions: &tabletmanagerdatapb.VDiffCoreOptions{ + Tables: strings.Join(req.Tables, ","), + AutoRetry: req.AutoRetry, + MaxRows: req.Limit, + TimeoutSeconds: req.FilteredReplicationWaitTime.Seconds, + MaxExtraRowsToCompare: req.MaxExtraRowsToCompare, + UpdateTableStats: req.UpdateTableStats, + MaxDiffSeconds: req.MaxDiffDuration.Seconds, + AutoStart: &autoStart, + }, + ReportOptions: &tabletmanagerdatapb.VDiffReportOptions{ + OnlyPks: req.OnlyPKs, + DebugQuery: req.DebugQuery, + MaxSampleRows: req.MaxReportSampleRows, + RowDiffColumnTruncateAt: req.RowDiffColumnTruncateAt, + }, + } + + tabletreq := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: req.TargetKeyspace, + Workflow: req.Workflow, + Action: string(vdiff.CreateAction), + Options: options, + VdiffUuid: req.Uuid, + } + + ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + if ts.frozen { + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "invalid VDiff run: writes have been already been switched for workflow %s.%s", + req.TargetKeyspace, req.Workflow) + } + + workflowStatus, err := s.getWorkflowStatus(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + if workflowStatus != binlogdatapb.VReplicationWorkflowState_Running { + s.Logger().Infof("Workflow %s.%s is not running, cannot start VDiff in state %s", req.TargetKeyspace, req.Workflow, workflowStatus) + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, + "not all streams are running in workflow %s.%s", req.TargetKeyspace, req.Workflow) + } + + err = ts.ForAllTargets(func(target *MigrationTarget) error { + _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) + return err + }) + if err != nil { + s.Logger().Errorf("Error executing vdiff create action: %v", err) + return nil, err + } + + return &vtctldatapb.VDiffCreateResponse{ + UUID: req.Uuid, + }, nil +} + +// VDiffDelete is part of the vtctlservicepb.VtctldServer interface. +func (s *Server) VDiffDelete(ctx context.Context, req *vtctldatapb.VDiffDeleteRequest) (*vtctldatapb.VDiffDeleteResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffDelete") + defer span.Finish() + + span.Annotate("keyspace", req.TargetKeyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("argument", req.Arg) + + tabletreq := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: req.TargetKeyspace, + Workflow: req.Workflow, + Action: string(vdiff.DeleteAction), + ActionArg: req.Arg, + } + + ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + + err = ts.ForAllTargets(func(target *MigrationTarget) error { + _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) + return err + }) + if err != nil { + s.Logger().Errorf("Error executing vdiff delete action: %v", err) + return nil, err + } + + return &vtctldatapb.VDiffDeleteResponse{}, nil +} + +// VDiffResume is part of the vtctlservicepb.VtctldServer interface. +func (s *Server) VDiffResume(ctx context.Context, req *vtctldatapb.VDiffResumeRequest) (*vtctldatapb.VDiffResumeResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffResume") + defer span.Finish() + + targetShards := req.GetTargetShards() + + span.Annotate("keyspace", req.TargetKeyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("uuid", req.Uuid) + span.Annotate("target_shards", targetShards) + + tabletreq := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: req.TargetKeyspace, + Workflow: req.Workflow, + Action: string(vdiff.ResumeAction), + VdiffUuid: req.Uuid, + } + + ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + + if len(targetShards) > 0 { + if err := applyTargetShards(ts, targetShards); err != nil { + return nil, err + } + } + + err = ts.ForAllTargets(func(target *MigrationTarget) error { + _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) + return err + }) + if err != nil { + s.Logger().Errorf("Error executing vdiff resume action: %v", err) + return nil, err + } + + return &vtctldatapb.VDiffResumeResponse{}, nil +} + +// VDiffShow is part of the vtctlservicepb.VtctldServer interface. +func (s *Server) VDiffShow(ctx context.Context, req *vtctldatapb.VDiffShowRequest) (*vtctldatapb.VDiffShowResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffShow") + defer span.Finish() + + span.Annotate("keyspace", req.TargetKeyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("argument", req.Arg) + + tabletreq := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: req.TargetKeyspace, + Workflow: req.Workflow, + Action: string(vdiff.ShowAction), + ActionArg: req.Arg, + } + + ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + + output := &vdiffOutput{ + responses: make(map[string]*tabletmanagerdatapb.VDiffResponse, len(ts.targets)), + err: nil, + } + output.err = ts.ForAllTargets(func(target *MigrationTarget) error { + resp, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) + output.mu.Lock() + defer output.mu.Unlock() + output.responses[target.GetShard().ShardName()] = resp + return err + }) + if output.err != nil { + s.Logger().Errorf("Error executing vdiff show action: %v", output.err) + return nil, output.err + } + return &vtctldatapb.VDiffShowResponse{ + TabletResponses: output.responses, + }, nil +} + +// VDiffStop is part of the vtctlservicepb.VtctldServer interface. +func (s *Server) VDiffStop(ctx context.Context, req *vtctldatapb.VDiffStopRequest) (*vtctldatapb.VDiffStopResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffStop") + defer span.Finish() + + targetShards := req.GetTargetShards() + + span.Annotate("keyspace", req.TargetKeyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("uuid", req.Uuid) + span.Annotate("target_shards", targetShards) + + tabletreq := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: req.TargetKeyspace, + Workflow: req.Workflow, + Action: string(vdiff.StopAction), + VdiffUuid: req.Uuid, + } + + ts, err := s.buildTrafficSwitcher(ctx, req.TargetKeyspace, req.Workflow) + if err != nil { + return nil, err + } + + if len(targetShards) > 0 { + if err := applyTargetShards(ts, targetShards); err != nil { + return nil, err + } + } + + err = ts.ForAllTargets(func(target *MigrationTarget) error { + _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) + return err + }) + if err != nil { + s.Logger().Errorf("Error executing vdiff stop action: %v", err) + return nil, err + } + + return &vtctldatapb.VDiffStopResponse{}, nil +} diff --git a/go/vt/vtctl/workflow/vdiff_test.go b/go/vt/vtctl/workflow/vdiff_test.go index e5578afc170..0da4a3ef480 100644 --- a/go/vt/vtctl/workflow/vdiff_test.go +++ b/go/vt/vtctl/workflow/vdiff_test.go @@ -17,13 +17,21 @@ limitations under the License. package workflow import ( + "context" + "fmt" "math" "testing" "time" + "github.com/google/uuid" "github.com/stretchr/testify/require" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" + + querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) func TestBuildProgressReport(t *testing.T) { @@ -134,3 +142,350 @@ func TestBuildProgressReport(t *testing.T) { }) } } + +// TestVDiffCreate performs some basic tests of the VDiffCreate function +// to ensure that it behaves as expected given a specific request. +func TestVDiffCreate(t *testing.T) { + ctx := context.Background() + workflowName := "wf1" + sourceKeyspace := &testKeyspace{ + KeyspaceName: "source", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "target", + ShardNames: []string{"-80", "80-"}, + } + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + tests := []struct { + name string + req *vtctldatapb.VDiffCreateRequest + wantErr string + }{ + { + name: "no values", + req: &vtctldatapb.VDiffCreateRequest{}, + // We did not provide any keyspace or shard. + wantErr: "FindAllShardsInKeyspace() invalid keyspace name: UnescapeID err: invalid input identifier ''", + }, + { + name: "generated UUID", + req: &vtctldatapb.VDiffCreateRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflowName, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.wantErr == "" { + env.tmc.expectVRQueryResultOnKeyspaceTablets(targetKeyspace.KeyspaceName, &queryResult{ + query: "select vrepl_id, table_name, lastpk from _vt.copy_state where vrepl_id in (1) and id in (select max(id) from _vt.copy_state where vrepl_id in (1) group by vrepl_id, table_name)", + result: &querypb.QueryResult{}, + }) + } + got, err := env.ws.VDiffCreate(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + return + } + require.NoError(t, err) + require.NotNil(t, got) + // Ensure that we always use a valid UUID. + err = uuid.Validate(got.UUID) + require.NoError(t, err) + }) + } +} + +func TestVDiffResume(t *testing.T) { + ctx := context.Background() + sourceKeyspace := &testKeyspace{ + KeyspaceName: "sourceks", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "targetks", + ShardNames: []string{"-80", "80-"}, + } + workflow := "testwf" + uuid := uuid.New().String() + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + env.tmc.strict = true + action := string(vdiff.ResumeAction) + + tests := []struct { + name string + req *vtctldatapb.VDiffResumeRequest // vtctld requests + expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests + wantErr string + }{ + { + name: "basic resume", // Both target shards + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "resume on first shard", + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: targetKeyspace.ShardNames[:1], + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "resume on invalid shard", + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: []string{"0"}, + Workflow: workflow, + Uuid: uuid, + }, + wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tab, vdr := range tt.expectedVDiffRequests { + env.tmc.expectVDiffRequest(tab, vdr) + } + got, err := env.ws.VDiffResume(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.NotNil(t, got) + } + env.tmc.confirmVDiffRequests(t) + }) + } +} + +func TestVDiffStop(t *testing.T) { + ctx := context.Background() + sourceKeyspace := &testKeyspace{ + KeyspaceName: "sourceks", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "targetks", + ShardNames: []string{"-80", "80-"}, + } + workflow := "testwf" + uuid := uuid.New().String() + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + env.tmc.strict = true + action := string(vdiff.StopAction) + + tests := []struct { + name string + req *vtctldatapb.VDiffStopRequest // vtctld requests + expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests + wantErr string + }{ + { + name: "basic stop", // Both target shards + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "stop on first shard", + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: targetKeyspace.ShardNames[:1], + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "stop on invalid shard", + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: []string{"0"}, + Workflow: workflow, + Uuid: uuid, + }, + wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tab, vdr := range tt.expectedVDiffRequests { + env.tmc.expectVDiffRequest(tab, vdr) + } + got, err := env.ws.VDiffStop(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.NotNil(t, got) + } + env.tmc.confirmVDiffRequests(t) + }) + } +} + +func TestVDiffDelete(t *testing.T) { + ctx := context.Background() + sourceKeyspace := &testKeyspace{ + KeyspaceName: "sourceks", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "targetks", + ShardNames: []string{"-80", "80-"}, + } + workflow := "testwf" + uuid := uuid.New().String() + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + env.tmc.strict = true + action := string(vdiff.DeleteAction) + + tests := []struct { + name string + req *vtctldatapb.VDiffDeleteRequest + expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse + wantErr string + }{ + { + name: "basic delete", + req: &vtctldatapb.VDiffDeleteRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Arg: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + ActionArg: uuid, + }, + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + ActionArg: uuid, + }, + }, + }, + }, + { + name: "invalid delete", + req: &vtctldatapb.VDiffDeleteRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Arg: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + ActionArg: uuid, + }, + err: fmt.Errorf("error on invalid delete"), + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + ActionArg: uuid, + }, + }, + }, + wantErr: "error on invalid delete", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tab, vdr := range tt.expectedVDiffRequests { + env.tmc.expectVDiffRequest(tab, vdr) + } + got, err := env.ws.VDiffDelete(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.NotNil(t, got) + } + env.tmc.confirmVDiffRequests(t) + }) + } +} From 8fff0ea379154d8a9d512077b264f4f60a390248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Mon, 13 Jan 2025 07:08:34 +0100 Subject: [PATCH 22/66] test: make it easier to run tests without a main keyspace (#17501) Signed-off-by: Andres Taylor --- go/test/vschemawrapper/vschema_wrapper.go | 40 ++++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/go/test/vschemawrapper/vschema_wrapper.go b/go/test/vschemawrapper/vschema_wrapper.go index 3f9f072afc6..27219c6a255 100644 --- a/go/test/vschemawrapper/vschema_wrapper.go +++ b/go/test/vschemawrapper/vschema_wrapper.go @@ -18,7 +18,9 @@ package vschemawrapper import ( "context" + "errors" "fmt" + "sort" "strings" "vitess.io/vitess/go/mysql/collations" @@ -275,17 +277,6 @@ func (vw *VSchemaWrapper) FindTableOrVindex(tab sqlparser.TableName) (*vindexes. return vw.Vcursor.FindTableOrVindex(tab) } -func (vw *VSchemaWrapper) getfirstKeyspace() (ks *vindexes.Keyspace) { - var f string - for name, schema := range vw.V.Keyspaces { - if f == "" || f > name { - f = name - ks = schema.Keyspace - } - } - return -} - func (vw *VSchemaWrapper) getActualKeyspace() string { if vw.Keyspace == nil { return "" @@ -301,15 +292,32 @@ func (vw *VSchemaWrapper) getActualKeyspace() string { } func (vw *VSchemaWrapper) SelectedKeyspace() (*vindexes.Keyspace, error) { - return vw.V.Keyspaces["main"].Keyspace, nil + return vw.AnyKeyspace() } func (vw *VSchemaWrapper) AnyKeyspace() (*vindexes.Keyspace, error) { - return vw.SelectedKeyspace() + ks, found := vw.V.Keyspaces["main"] + if found { + return ks.Keyspace, nil + } + + size := len(vw.V.Keyspaces) + if size == 0 { + return nil, errors.New("no keyspace found in vschema") + } + + // Find the first keyspace in the map alphabetically to get deterministic results + keys := make([]string, size) + for key := range vw.V.Keyspaces { + keys = append(keys, key) + } + sort.Strings(keys) + + return vw.V.Keyspaces[keys[0]].Keyspace, nil } func (vw *VSchemaWrapper) FirstSortedKeyspace() (*vindexes.Keyspace, error) { - return vw.V.Keyspaces["main"].Keyspace, nil + return vw.AnyKeyspace() } func (vw *VSchemaWrapper) TargetString() string { @@ -344,12 +352,12 @@ func (vw *VSchemaWrapper) IsViewsEnabled() bool { // FindMirrorRule finds the mirror rule for the requested keyspace, table // name, and the tablet type in the VSchema. -func (vs *VSchemaWrapper) FindMirrorRule(tab sqlparser.TableName) (*vindexes.MirrorRule, error) { +func (vw *VSchemaWrapper) FindMirrorRule(tab sqlparser.TableName) (*vindexes.MirrorRule, error) { destKeyspace, destTabletType, _, err := topoproto.ParseDestination(tab.Qualifier.String(), topodatapb.TabletType_PRIMARY) if err != nil { return nil, err } - mirrorRule, err := vs.V.FindMirrorRule(destKeyspace, tab.Name.String(), destTabletType) + mirrorRule, err := vw.V.FindMirrorRule(destKeyspace, tab.Name.String(), destTabletType) if err != nil { return nil, err } From f3cafe81a24ed994e0488048411b1ec7209c250c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 13 Jan 2025 08:49:13 +0200 Subject: [PATCH 23/66] Online DDL `--analyze-table`: use non-local `ANALYZE TABLE` (#17462) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/vttablet/onlineddl/executor.go | 4 +++- go/vt/vttablet/onlineddl/schema.go | 3 ++- go/vt/vttablet/onlineddl/vrepl.go | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index f8b5cfd9b8d..ce81a2dd516 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -968,7 +968,9 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh defer preparationConnRestoreLockWaitTimeout() if needsShadowTableAnalysis { - // Run `ANALYZE TABLE` on the vreplication table so that it has up-to-date statistics at cut-over + // Run `ANALYZE TABLE` on the vreplication table so that it has up-to-date statistics at cut-over. + // The statement will be replicated, so that in case there's a PRS/ERS shortly after cut-over, the + // promoted replica will have good statistics. parsed := sqlparser.BuildParsedQuery(sqlAnalyzeTable, vreplTable) if _, err := preparationsConn.Conn.Exec(ctx, parsed.Query, -1, false); err != nil { // Best effort only. Do not fail the mgiration if this fails. diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 943a3b1df07..6ba0217519c 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -499,7 +499,8 @@ const ( sqlDropTable = "DROP TABLE `%a`" sqlDropTableIfExists = "DROP TABLE IF EXISTS `%a`" sqlShowTableStatus = "SHOW TABLE STATUS LIKE '%a'" - sqlAnalyzeTable = "ANALYZE NO_WRITE_TO_BINLOG TABLE `%a`" + sqlAnalyzeTableLocal = "ANALYZE NO_WRITE_TO_BINLOG TABLE `%a`" + sqlAnalyzeTable = "ANALYZE TABLE `%a`" sqlShowCreateTable = "SHOW CREATE TABLE `%a`" sqlShowVariablesLikePreserveForeignKey = "show global variables like 'rename_table_preserve_foreign_key'" sqlShowVariablesLikeFastAnalyzeTable = "show global variables like 'fast_analyze_table'" diff --git a/go/vt/vttablet/onlineddl/vrepl.go b/go/vt/vttablet/onlineddl/vrepl.go index 2761c27c801..b00bcc40894 100644 --- a/go/vt/vttablet/onlineddl/vrepl.go +++ b/go/vt/vttablet/onlineddl/vrepl.go @@ -208,7 +208,7 @@ func (v *VRepl) executeAnalyzeTable(ctx context.Context, conn *dbconnpool.DBConn defer conn.ExecuteFetch(sqlDisableFastAnalyzeTable, 1, false) } - parsed := sqlparser.BuildParsedQuery(sqlAnalyzeTable, tableName) + parsed := sqlparser.BuildParsedQuery(sqlAnalyzeTableLocal, tableName) if _, err := conn.ExecuteFetch(parsed.Query, 1, false); err != nil { return err } From ac8bbc6586ba462dc3a48e8064ec219bee7aac2c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 13 Jan 2025 08:50:01 +0200 Subject: [PATCH 24/66] `schemadiff`: more index expression validations (tests only) (#17483) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../onlineddl/revert/onlineddl_revert_test.go | 5 +++++ go/vt/schemadiff/onlineddl_test.go | 5 +++++ go/vt/schemadiff/table_test.go | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go index a13077ef87b..e052762cd13 100644 --- a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go +++ b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go @@ -259,6 +259,11 @@ func testRevertible(t *testing.T) { toSchema: `id int primary key, i2 int default null`, removedUniqueKeyNames: `i1_uidx`, }, + { + name: "removed expression unique key, skipped", + fromSchema: `id int primary key, i1 int default null, unique key idx1 ((id + 1))`, + toSchema: `id int primary key, i2 int default null`, + }, { name: "expanding unique key removes unique constraint", fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, diff --git a/go/vt/schemadiff/onlineddl_test.go b/go/vt/schemadiff/onlineddl_test.go index f5309b4f943..fb8710f8498 100644 --- a/go/vt/schemadiff/onlineddl_test.go +++ b/go/vt/schemadiff/onlineddl_test.go @@ -937,6 +937,11 @@ func TestRevertible(t *testing.T) { fromSchema: "id int, primary key (id), key idx1 ((id + 1))", toSchema: "id int, primary key (id), key idx2 ((id + 2))", }, + { + name: "remove unique index with expression, add another, skip both", + fromSchema: "id int, i int, primary key (id), unique key idx1 ((id + 1))", + toSchema: "id int, i int, primary key (id), unique key idx2 ((i + 2))", + }, } var ( diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index ac871dbd4af..c1d8d8c241e 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -2582,6 +2582,24 @@ func TestValidate(t *testing.T) { alter: "alter table t add key idx2 ((id + 2))", to: "create table t (id int, primary key (id), key idx1 ((id + 1)), key idx2 ((id + 2)))", }, + { + name: "key with multicolumn expression", + from: "create table t (id int, i int, primary key (id), key idx1 ((id + 1), (i + 2)))", + alter: "alter table t add key idx2 ((id + 2))", + to: "create table t (id int, i int, primary key (id), key idx1 ((id + 1), (i + 2)), key idx2 ((id + 2)))", + }, + { + name: "key with expression and unknown columns", + from: "create table t (id int, i int, primary key (id), key idx1 ((id + 1), (i + 2)))", + alter: "alter table t add key idx2 ((i2 + 2))", + expectErr: &InvalidColumnInKeyError{Table: "t", Column: "i2", Key: "idx2"}, + }, + { + name: "drop column used in expression", + from: "create table t (id int, i int, primary key (id), key idx1 ((id + 1), (i + 2)))", + alter: "alter table t drop column i", + expectErr: &InvalidColumnInKeyError{Table: "t", Column: "i", Key: "idx1"}, + }, // partitions { name: "drop column used by partitions", From ec29bdbebb4ba17ff2e385960d0f6f75fd569f2e Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:35:25 +0100 Subject: [PATCH 25/66] Flaky TestTickSkip: Remove inherently flaky test (#17504) Signed-off-by: Rohit Nayak --- go/timer/randticker_test.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/go/timer/randticker_test.go b/go/timer/randticker_test.go index 59bcd1d89ea..7acdbf3156a 100644 --- a/go/timer/randticker_test.go +++ b/go/timer/randticker_test.go @@ -43,21 +43,3 @@ func TestTick(t *testing.T) { t.Error("Channel was not closed") } } - -func TestTickSkip(t *testing.T) { - tkr := NewRandTicker(10*time.Millisecond, 1*time.Millisecond) - time.Sleep(35 * time.Millisecond) - end := <-tkr.C - diff := time.Since(end) - if diff < 20*time.Millisecond { - t.Errorf("diff: %v, want >20ms", diff) - } - - // This tick should be up-to-date - end = <-tkr.C - diff = time.Since(end) - if diff > 1*time.Millisecond { - t.Errorf("diff: %v, want <1ms", diff) - } - tkr.Stop() -} From a9d6969b3035f7df0578a476eba230d09408dbb4 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Mon, 13 Jan 2025 18:45:34 +0100 Subject: [PATCH 26/66] `vtorc`: fetch all tablets from cells once + filter during refresh (#17388) Signed-off-by: Tim Vaillancourt --- go/vt/vtorc/logic/tablet_discovery.go | 179 +++++++++++++-------- go/vt/vtorc/logic/tablet_discovery_test.go | 71 ++++++++ go/vt/vtorc/logic/vtorc.go | 6 + 3 files changed, 185 insertions(+), 71 deletions(-) diff --git a/go/vt/vtorc/logic/tablet_discovery.go b/go/vt/vtorc/logic/tablet_discovery.go index 7066229ab06..eb10bb2a667 100644 --- a/go/vt/vtorc/logic/tablet_discovery.go +++ b/go/vt/vtorc/logic/tablet_discovery.go @@ -27,19 +27,19 @@ import ( "time" "github.com/spf13/pflag" + "golang.org/x/sync/errgroup" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" "vitess.io/vitess/go/vt/external/golib/sqlutils" "vitess.io/vitess/go/vt/log" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtorc/config" "vitess.io/vitess/go/vt/vtorc/db" "vitess.io/vitess/go/vt/vtorc/inst" "vitess.io/vitess/go/vt/vttablet/tmclient" - - topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) var ( @@ -48,6 +48,9 @@ var ( clustersToWatch []string shutdownWaitTime = 30 * time.Second shardsLockCounter int32 + shardsToWatch map[string][]string + shardsToWatchMu sync.Mutex + // ErrNoPrimaryTablet is a fixed error message. ErrNoPrimaryTablet = errors.New("no primary tablet found") ) @@ -58,6 +61,52 @@ func RegisterFlags(fs *pflag.FlagSet) { fs.DurationVar(&shutdownWaitTime, "shutdown_wait_time", shutdownWaitTime, "Maximum time to wait for VTOrc to release all the locks that it is holding before shutting down on SIGTERM") } +// updateShardsToWatch parses the --clusters_to_watch flag-value +// into a map of keyspace/shards. +func updateShardsToWatch() { + if len(clustersToWatch) == 0 { + return + } + + newShardsToWatch := make(map[string][]string, 0) + for _, ks := range clustersToWatch { + if strings.Contains(ks, "/") && !strings.HasSuffix(ks, "/") { + // Validate keyspace/shard parses. + k, s, err := topoproto.ParseKeyspaceShard(ks) + if err != nil { + log.Errorf("Could not parse keyspace/shard %q: %+v", ks, err) + continue + } + newShardsToWatch[k] = append(newShardsToWatch[k], s) + } else { + ctx, cancel := context.WithTimeout(context.Background(), topo.RemoteOperationTimeout) + defer cancel() + // Assume this is a keyspace and find all shards in keyspace. + // Remove trailing slash if exists. + ks = strings.TrimSuffix(ks, "/") + shards, err := ts.GetShardNames(ctx, ks) + if err != nil { + // Log the err and continue. + log.Errorf("Error fetching shards for keyspace: %v", ks) + continue + } + if len(shards) == 0 { + log.Errorf("Topo has no shards for ks: %v", ks) + continue + } + newShardsToWatch[ks] = shards + } + } + if len(newShardsToWatch) == 0 { + log.Error("No keyspace/shards to watch") + return + } + + shardsToWatchMu.Lock() + defer shardsToWatchMu.Unlock() + shardsToWatch = newShardsToWatch +} + // OpenTabletDiscovery opens the vitess topo if enables and returns a ticker // channel for polling. func OpenTabletDiscovery() <-chan time.Time { @@ -67,6 +116,8 @@ func OpenTabletDiscovery() <-chan time.Time { if _, err := db.ExecVTOrc("DELETE FROM vitess_tablet"); err != nil { log.Error(err) } + // Parse --clusters_to_watch into a filter. + updateShardsToWatch() // We refresh all information from the topo once before we start the ticks to do // it on a timer. ctx, cancel := context.WithTimeout(context.Background(), topo.RemoteOperationTimeout) @@ -77,6 +128,28 @@ func OpenTabletDiscovery() <-chan time.Time { return time.Tick(config.GetTopoInformationRefreshDuration()) //nolint SA1015: using time.Tick leaks the underlying ticker } +// getAllTablets gets all tablets from all cells using a goroutine per cell. +func getAllTablets(ctx context.Context, cells []string) []*topo.TabletInfo { + var tabletsMu sync.Mutex + tablets := make([]*topo.TabletInfo, 0) + eg, ctx := errgroup.WithContext(ctx) + for _, cell := range cells { + eg.Go(func() error { + t, err := ts.GetTabletsByCell(ctx, cell, nil) + if err != nil { + log.Errorf("Failed to load tablets from cell %s: %+v", cell, err) + return nil + } + tabletsMu.Lock() + defer tabletsMu.Unlock() + tablets = append(tablets, t...) + return nil + }) + } + _ = eg.Wait() // always nil + return tablets +} + // refreshAllTablets reloads the tablets from topo and discovers the ones which haven't been refreshed in a while func refreshAllTablets(ctx context.Context) error { return refreshTabletsUsing(ctx, func(tabletAlias string) { @@ -84,81 +157,45 @@ func refreshAllTablets(ctx context.Context) error { }, false /* forceRefresh */) } +// refreshTabletsUsing refreshes tablets using a provided loader. func refreshTabletsUsing(ctx context.Context, loader func(tabletAlias string), forceRefresh bool) error { - if len(clustersToWatch) == 0 { // all known clusters - ctx, cancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer cancel() - cells, err := ts.GetKnownCells(ctx) - if err != nil { - return err - } + // Get all cells. + ctx, cancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) + defer cancel() + cells, err := ts.GetKnownCells(ctx) + if err != nil { + return err + } - refreshCtx, refreshCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer refreshCancel() - var wg sync.WaitGroup - for _, cell := range cells { - wg.Add(1) - go func(cell string) { - defer wg.Done() - refreshTabletsInCell(refreshCtx, cell, loader, forceRefresh) - }(cell) - } - wg.Wait() - } else { - // Parse input and build list of keyspaces / shards - var keyspaceShards []*topo.KeyspaceShard - for _, ks := range clustersToWatch { - if strings.Contains(ks, "/") { - // This is a keyspace/shard specification - input := strings.Split(ks, "/") - keyspaceShards = append(keyspaceShards, &topo.KeyspaceShard{Keyspace: input[0], Shard: input[1]}) - } else { - // Assume this is a keyspace and find all shards in keyspace - ctx, cancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer cancel() - shards, err := ts.GetShardNames(ctx, ks) - if err != nil { - // Log the errr and continue - log.Errorf("Error fetching shards for keyspace: %v", ks) - continue - } - if len(shards) == 0 { - log.Errorf("Topo has no shards for ks: %v", ks) - continue - } - for _, s := range shards { - keyspaceShards = append(keyspaceShards, &topo.KeyspaceShard{Keyspace: ks, Shard: s}) + // Get all tablets from all cells. + getTabletsCtx, getTabletsCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) + defer getTabletsCancel() + tablets := getAllTablets(getTabletsCtx, cells) + if len(tablets) == 0 { + log.Error("Found no tablets") + return nil + } + + // Filter tablets that should not be watched using shardsToWatch map. + matchedTablets := make([]*topo.TabletInfo, 0, len(tablets)) + func() { + shardsToWatchMu.Lock() + defer shardsToWatchMu.Unlock() + for _, t := range tablets { + if len(shardsToWatch) > 0 { + _, ok := shardsToWatch[t.Tablet.Keyspace] + if !ok || !slices.Contains(shardsToWatch[t.Tablet.Keyspace], t.Tablet.Shard) { + continue // filter } } + matchedTablets = append(matchedTablets, t) } - if len(keyspaceShards) == 0 { - log.Errorf("Found no keyspaceShards for input: %+v", clustersToWatch) - return nil - } - refreshCtx, refreshCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer refreshCancel() - var wg sync.WaitGroup - for _, ks := range keyspaceShards { - wg.Add(1) - go func(ks *topo.KeyspaceShard) { - defer wg.Done() - refreshTabletsInKeyspaceShard(refreshCtx, ks.Keyspace, ks.Shard, loader, forceRefresh, nil) - }(ks) - } - wg.Wait() - } - return nil -} + }() -func refreshTabletsInCell(ctx context.Context, cell string, loader func(tabletAlias string), forceRefresh bool) { - tablets, err := ts.GetTabletsByCell(ctx, cell, nil) - if err != nil { - log.Errorf("Error fetching topo info for cell %v: %v", cell, err) - return - } - query := "select alias from vitess_tablet where cell = ?" - args := sqlutils.Args(cell) - refreshTablets(tablets, query, args, loader, forceRefresh, nil) + // Refresh the filtered tablets. + query := "select alias from vitess_tablet" + refreshTablets(matchedTablets, query, nil, loader, forceRefresh, nil) + return nil } // forceRefreshAllTabletsInShard is used to refresh all the tablet's information (both MySQL information and topo records) diff --git a/go/vt/vtorc/logic/tablet_discovery_test.go b/go/vt/vtorc/logic/tablet_discovery_test.go index f6a7af38382..54284e8a017 100644 --- a/go/vt/vtorc/logic/tablet_discovery_test.go +++ b/go/vt/vtorc/logic/tablet_discovery_test.go @@ -19,6 +19,7 @@ package logic import ( "context" "fmt" + "strings" "sync/atomic" "testing" "time" @@ -101,6 +102,76 @@ var ( } ) +func TestUpdateShardsToWatch(t *testing.T) { + oldClustersToWatch := clustersToWatch + oldTs := ts + defer func() { + clustersToWatch = oldClustersToWatch + shardsToWatch = nil + ts = oldTs + }() + + // Create a memory topo-server and create the keyspace and shard records + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ts = memorytopo.NewServer(ctx, cell1) + _, err := ts.GetOrCreateShard(context.Background(), keyspace, shard) + require.NoError(t, err) + + testCases := []struct { + in []string + expected map[string][]string + }{ + { + in: []string{}, + expected: nil, + }, + { + in: []string{""}, + expected: map[string][]string{}, + }, + { + in: []string{"test/-"}, + expected: map[string][]string{ + "test": {"-"}, + }, + }, + { + in: []string{"test/-", "test2/-80", "test2/80-"}, + expected: map[string][]string{ + "test": {"-"}, + "test2": {"-80", "80-"}, + }, + }, + { + // confirm shards fetch from topo + in: []string{keyspace}, + expected: map[string][]string{ + keyspace: {shard}, + }, + }, + { + // confirm shards fetch from topo when keyspace has trailing-slash + in: []string{keyspace + "/"}, + expected: map[string][]string{ + keyspace: {shard}, + }, + }, + } + + for _, testCase := range testCases { + t.Run(strings.Join(testCase.in, ","), func(t *testing.T) { + defer func() { + shardsToWatch = make(map[string][]string, 0) + }() + clustersToWatch = testCase.in + updateShardsToWatch() + require.Equal(t, testCase.expected, shardsToWatch) + }) + } +} + func TestRefreshTabletsInKeyspaceShard(t *testing.T) { // Store the old flags and restore on test completion oldTs := ts diff --git a/go/vt/vtorc/logic/vtorc.go b/go/vt/vtorc/logic/vtorc.go index 39326525ce2..c6a4a4ee46d 100644 --- a/go/vt/vtorc/logic/vtorc.go +++ b/go/vt/vtorc/logic/vtorc.go @@ -326,6 +326,12 @@ func refreshAllInformation(ctx context.Context) error { return RefreshAllKeyspacesAndShards(ctx) }) + // Refresh shards to watch. + eg.Go(func() error { + updateShardsToWatch() + return nil + }) + // Refresh all tablets. eg.Go(func() error { return refreshAllTablets(ctx) From fd0ffeb17b01d740a5a5116806300ae15ea15b04 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:19:31 +0530 Subject: [PATCH 27/66] Remove unused code in discovery queue creation (#17515) Signed-off-by: Manan Gupta --- go/vt/vtorc/discovery/queue.go | 63 ++-------------------------------- go/vt/vtorc/logic/vtorc.go | 2 +- 2 files changed, 4 insertions(+), 61 deletions(-) diff --git a/go/vt/vtorc/discovery/queue.go b/go/vt/vtorc/discovery/queue.go index 4b18303959b..bf279b781f2 100644 --- a/go/vt/vtorc/discovery/queue.go +++ b/go/vt/vtorc/discovery/queue.go @@ -33,12 +33,6 @@ import ( "vitess.io/vitess/go/vt/vtorc/config" ) -// QueueMetric contains the queue's active and queued sizes -type QueueMetric struct { - Active int - Queued int -} - // Queue contains information for managing discovery requests type Queue struct { sync.Mutex @@ -48,67 +42,16 @@ type Queue struct { queue chan string queuedKeys map[string]time.Time consumedKeys map[string]time.Time - metrics []QueueMetric -} - -// DiscoveryQueue contains the discovery queue which can then be accessed via an API call for monitoring. -// Currently this is accessed by ContinuousDiscovery() but also from http api calls. -// I may need to protect this better? -var discoveryQueue map[string](*Queue) -var dcLock sync.Mutex - -func init() { - discoveryQueue = make(map[string](*Queue)) } -// CreateOrReturnQueue allows for creation of a new discovery queue or -// returning a pointer to an existing one given the name. -func CreateOrReturnQueue(name string) *Queue { - dcLock.Lock() - defer dcLock.Unlock() - if q, found := discoveryQueue[name]; found { - return q - } - - q := &Queue{ +// CreateQueue allows for creation of a new discovery queue +func CreateQueue(name string) *Queue { + return &Queue{ name: name, queuedKeys: make(map[string]time.Time), consumedKeys: make(map[string]time.Time), queue: make(chan string, config.DiscoveryQueueCapacity), } - go q.startMonitoring() - - discoveryQueue[name] = q - - return q -} - -// monitoring queue sizes until we are told to stop -func (q *Queue) startMonitoring() { - log.Infof("Queue.startMonitoring(%s)", q.name) - ticker := time.NewTicker(time.Second) // hard-coded at every second - - for { - select { - case <-ticker.C: // do the periodic expiry - q.collectStatistics() - case <-q.done: - return - } - } -} - -// do a check of the entries in the queue, both those active and queued -func (q *Queue) collectStatistics() { - q.Lock() - defer q.Unlock() - - q.metrics = append(q.metrics, QueueMetric{Queued: len(q.queuedKeys), Active: len(q.consumedKeys)}) - - // remove old entries if we get too big - if len(q.metrics) > config.DiscoveryQueueMaxStatisticsSize { - q.metrics = q.metrics[len(q.metrics)-config.DiscoveryQueueMaxStatisticsSize:] - } } // QueueLen returns the length of the queue (channel size + queued size) diff --git a/go/vt/vtorc/logic/vtorc.go b/go/vt/vtorc/logic/vtorc.go index c6a4a4ee46d..1fde6e31c0d 100644 --- a/go/vt/vtorc/logic/vtorc.go +++ b/go/vt/vtorc/logic/vtorc.go @@ -108,7 +108,7 @@ func waitForLocksRelease() { // handleDiscoveryRequests iterates the discoveryQueue channel and calls upon // instance discovery per entry. func handleDiscoveryRequests() { - discoveryQueue = discovery.CreateOrReturnQueue("DEFAULT") + discoveryQueue = discovery.CreateQueue("DEFAULT") // create a pool of discovery workers for i := uint(0); i < config.DiscoveryMaxConcurrency; i++ { go func() { From 9d8f3d5c21757dd81872437d23113c806c7f5546 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Jan 2025 17:24:21 +0530 Subject: [PATCH 28/66] VALUES statement AST and parsing (#17500) Signed-off-by: Harshit Gangal Signed-off-by: Florent Poinsard Signed-off-by: Andres Taylor Signed-off-by: Manan Gupta Co-authored-by: Andres Taylor Co-authored-by: Manan Gupta Co-authored-by: Florent Poinsard --- .../vtgate/queries/random/query_gen.go | 2 +- .../vtgate/queries/random/simplifier_test.go | 4 +- go/test/vschemawrapper/vschema_wrapper.go | 2 +- go/vt/proto/query/query.pb.go | 11 +- go/vt/schemadiff/view.go | 2 +- go/vt/sqlparser/ast.go | 183 +- go/vt/sqlparser/ast_clone.go | 52 +- go/vt/sqlparser/ast_copy_on_rewrite.go | 82 +- go/vt/sqlparser/ast_equals.go | 81 +- go/vt/sqlparser/ast_format.go | 20 + go/vt/sqlparser/ast_format_fast.go | 24 + go/vt/sqlparser/ast_funcs.go | 121 +- go/vt/sqlparser/ast_rewrite.go | 102 +- go/vt/sqlparser/ast_rewriting.go | 4 +- go/vt/sqlparser/ast_rewriting_test.go | 4 +- go/vt/sqlparser/ast_visit.go | 63 +- go/vt/sqlparser/cached_size.go | 53 +- go/vt/sqlparser/parse_test.go | 29 +- go/vt/sqlparser/parsed_query.go | 12 +- go/vt/sqlparser/parsed_query_test.go | 16 + go/vt/sqlparser/parser.go | 2 +- go/vt/sqlparser/sql.go | 20826 ++++++++-------- go/vt/sqlparser/sql.y | 112 +- go/vt/vtexplain/vtexplain_vttablet.go | 5 +- go/vt/vtgate/executorcontext/vcursor_impl.go | 2 +- go/vt/vtgate/planbuilder/ddl.go | 2 +- .../planbuilder/operators/SQL_builder.go | 26 +- .../operators/aggregation_pushing.go | 2 +- .../vtgate/planbuilder/operators/ast_to_op.go | 2 +- .../planbuilder/operators/expressions.go | 8 + go/vt/vtgate/planbuilder/operators/horizon.go | 10 +- go/vt/vtgate/planbuilder/operators/insert.go | 8 +- .../planbuilder/operators/query_planning.go | 13 +- .../planbuilder/operators/queryprojection.go | 4 +- .../planbuilder/operators/subquery_builder.go | 2 +- .../operators/subquery_planning.go | 6 +- go/vt/vtgate/planbuilder/operators/union.go | 2 +- .../plancontext/planning_context_test.go | 2 +- .../vtgate/planbuilder/plancontext/vschema.go | 2 +- go/vt/vtgate/planbuilder/simplifier_test.go | 18 +- go/vt/vtgate/schema/tracker.go | 12 +- go/vt/vtgate/semantics/analyzer.go | 12 +- go/vt/vtgate/semantics/analyzer_test.go | 6 +- go/vt/vtgate/semantics/cte_table.go | 2 +- go/vt/vtgate/semantics/early_rewriter.go | 16 +- go/vt/vtgate/semantics/scoper.go | 4 +- go/vt/vtgate/semantics/semantic_table.go | 2 +- go/vt/vtgate/semantics/table_collector.go | 28 +- go/vt/vtgate/simplifier/simplifier.go | 24 +- go/vt/vtgate/simplifier/simplifier_test.go | 4 +- go/vt/vtgate/vindexes/vschema.go | 8 +- go/vt/vtgate/vschema_manager.go | 4 +- go/vt/vtgate/vschema_manager_test.go | 2 +- .../io/vitess/jdbc/FieldWithMetadataTest.java | 3 +- proto/query.proto | 4 + web/vtadmin/src/proto/vtadmin.d.ts | 3 +- web/vtadmin/src/proto/vtadmin.js | 32 + 57 files changed, 11364 insertions(+), 10723 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/random/query_gen.go b/go/test/endtoend/vtgate/queries/random/query_gen.go index ba7c83aaa91..69bf66903f3 100644 --- a/go/test/endtoend/vtgate/queries/random/query_gen.go +++ b/go/test/endtoend/vtgate/queries/random/query_gen.go @@ -46,7 +46,7 @@ type ( // queryGenerator generates queries, which can either be unions or select statements queryGenerator struct { - stmt sqlparser.SelectStatement + stmt sqlparser.TableStatement selGen *selectGenerator } diff --git a/go/test/endtoend/vtgate/queries/random/simplifier_test.go b/go/test/endtoend/vtgate/queries/random/simplifier_test.go index c93c0e679c1..4305124e23c 100644 --- a/go/test/endtoend/vtgate/queries/random/simplifier_test.go +++ b/go/test/endtoend/vtgate/queries/random/simplifier_test.go @@ -100,10 +100,10 @@ func simplifyResultsMismatchedQuery(t *testing.T, query string) string { require.NoError(t, err) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vSchemaWrapper.CurrentDb(), vSchemaWrapper, - func(statement sqlparser.SelectStatement) bool { + func(statement sqlparser.TableStatement) bool { q := sqlparser.String(statement) _, newErr := mcmp.ExecAllowAndCompareError(q, utils.CompareOptions{}) if newErr == nil { diff --git a/go/test/vschemawrapper/vschema_wrapper.go b/go/test/vschemawrapper/vschema_wrapper.go index 27219c6a255..f4f2e6ce25a 100644 --- a/go/test/vschemawrapper/vschema_wrapper.go +++ b/go/test/vschemawrapper/vschema_wrapper.go @@ -265,7 +265,7 @@ func (vw *VSchemaWrapper) FindTable(tab sqlparser.TableName) (*vindexes.Table, s return table, destKeyspace, destTabletType, destTarget, nil } -func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.SelectStatement { +func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.TableStatement { destKeyspace, _, _, err := topoproto.ParseDestination(tab.Qualifier.String(), topodatapb.TabletType_PRIMARY) if err != nil { return nil diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index a03e5fa9025..a168cc2d363 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -319,7 +319,11 @@ const ( // Properties: 35, IsQuoted. Type_VECTOR Type = 2083 // RAW specifies a type which won't be quoted but the value used as-is while encoding. + // Properties: 36, None. Type_RAW Type = 2084 + // ROW_TUPLE represents multiple rows. + // Properties: 37, None. + Type_ROW_TUPLE Type = 2085 ) // Enum value maps for Type. @@ -362,6 +366,7 @@ var ( 4130: "BITNUM", 2083: "VECTOR", 2084: "RAW", + 2085: "ROW_TUPLE", } Type_value = map[string]int32{ "NULL_TYPE": 0, @@ -401,6 +406,7 @@ var ( "BITNUM": 4130, "VECTOR": 2083, "RAW": 2084, + "ROW_TUPLE": 2085, } ) @@ -6751,7 +6757,7 @@ var file_query_proto_rawDesc = []byte{ 0x41, 0x54, 0x10, 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x44, 0x10, 0x80, 0x10, 0x12, 0x0b, 0x0a, 0x06, 0x49, 0x53, 0x54, 0x45, 0x58, 0x54, 0x10, 0x80, 0x20, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x80, 0x40, - 0x2a, 0xd7, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x55, 0x4c, + 0x2a, 0xe7, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x04, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x81, 0x02, 0x12, 0x0a, 0x0a, 0x05, 0x55, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x82, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x83, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, @@ -6780,7 +6786,8 @@ var file_query_proto_rawDesc = []byte{ 0x48, 0x45, 0x58, 0x4e, 0x55, 0x4d, 0x10, 0xa0, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, 0x58, 0x56, 0x41, 0x4c, 0x10, 0xa1, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x54, 0x4e, 0x55, 0x4d, 0x10, 0xa2, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0xa3, 0x10, - 0x12, 0x08, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, 0xa4, 0x10, 0x2a, 0x36, 0x0a, 0x10, 0x53, 0x74, + 0x12, 0x08, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, 0xa4, 0x10, 0x12, 0x0e, 0x0a, 0x09, 0x52, 0x4f, + 0x57, 0x5f, 0x54, 0x55, 0x50, 0x4c, 0x45, 0x10, 0xa5, 0x10, 0x2a, 0x36, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x61, 0x69, 0x6c, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, diff --git a/go/vt/schemadiff/view.go b/go/vt/schemadiff/view.go index 8783f1803bb..ff34d772dcf 100644 --- a/go/vt/schemadiff/view.go +++ b/go/vt/schemadiff/view.go @@ -427,6 +427,6 @@ func (c *CreateViewEntity) identicalOtherThanName(other *CreateViewEntity) bool c.IsReplace == other.IsReplace && sqlparser.Equals.RefOfDefiner(c.Definer, other.Definer) && sqlparser.Equals.Columns(c.Columns, other.Columns) && - sqlparser.Equals.SelectStatement(c.Select, other.Select) && + sqlparser.Equals.Statement(c.Select, other.Select) && sqlparser.Equals.RefOfParsedComments(c.Comments, other.Comments) } diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 92c67d55999..e673b1ebf74 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -57,6 +57,34 @@ type ( OrderAndLimit interface { AddOrder(*Order) SetLimit(*Limit) + GetOrderBy() OrderBy + SetOrderBy(OrderBy) + GetLimit() *Limit + } + + TableStatement interface { + iTableStatement() + + InsertRows + Statement + OrderAndLimit + Commented + ColumnResults + Withable + } + + ColumnResults interface { + GetColumnCount() int + GetColumns() SelectExprs + } + + Withable interface { + SetWith(with *With) + } + + Distinctable interface { + MakeDistinct() + IsDistinct() bool } // SelectStatement any SELECT statement. @@ -64,19 +92,14 @@ type ( Statement InsertRows OrderAndLimit + Commented + ColumnResults + Withable + Distinctable iSelectStatement() GetLock() Lock SetLock(lock Lock) SetInto(into *SelectInto) - SetWith(with *With) - MakeDistinct() - GetColumnCount() int - GetColumns() SelectExprs - Commented - IsDistinct() bool - GetOrderBy() OrderBy - SetOrderBy(OrderBy) - GetLimit() *Limit } // DDLStatement represents any DDL Statement @@ -161,7 +184,7 @@ type ( CommonTableExpr struct { ID IdentifierCS Columns Columns - Subquery SelectStatement + Subquery TableStatement } // ChangeColumn is used to change the column definition, can also rename the column in alter table command ChangeColumn struct { @@ -303,8 +326,8 @@ type ( // Union represents a UNION statement. Union struct { With *With - Left SelectStatement - Right SelectStatement + Left TableStatement + Right TableStatement Distinct bool OrderBy OrderBy Limit *Limit @@ -543,7 +566,7 @@ type ( Definer *Definer Security string Columns Columns - Select SelectStatement + Select TableStatement CheckOption string IsReplace bool Comments *ParsedComments @@ -556,7 +579,7 @@ type ( Definer *Definer Security string Columns Columns - Select SelectStatement + Select TableStatement CheckOption string Comments *ParsedComments } @@ -727,58 +750,63 @@ type ( var _ OrderAndLimit = (*Select)(nil) var _ OrderAndLimit = (*Update)(nil) var _ OrderAndLimit = (*Delete)(nil) - -func (*Union) iStatement() {} -func (*Select) iStatement() {} -func (*Stream) iStatement() {} -func (*VStream) iStatement() {} -func (*Insert) iStatement() {} -func (*Update) iStatement() {} -func (*Delete) iStatement() {} -func (*Set) iStatement() {} -func (*DropDatabase) iStatement() {} -func (*Flush) iStatement() {} -func (*Show) iStatement() {} -func (*Use) iStatement() {} -func (*Begin) iStatement() {} -func (*Commit) iStatement() {} -func (*Rollback) iStatement() {} -func (*SRollback) iStatement() {} -func (*Savepoint) iStatement() {} -func (*Release) iStatement() {} -func (*Analyze) iStatement() {} -func (*OtherAdmin) iStatement() {} -func (*CommentOnly) iStatement() {} -func (*Select) iSelectStatement() {} -func (*Union) iSelectStatement() {} -func (*Load) iStatement() {} -func (*CreateDatabase) iStatement() {} -func (*AlterDatabase) iStatement() {} -func (*CreateTable) iStatement() {} -func (*CreateView) iStatement() {} -func (*AlterView) iStatement() {} -func (*LockTables) iStatement() {} -func (*UnlockTables) iStatement() {} -func (*AlterTable) iStatement() {} -func (*AlterVschema) iStatement() {} -func (*AlterMigration) iStatement() {} -func (*RevertMigration) iStatement() {} -func (*ShowMigrationLogs) iStatement() {} -func (*ShowThrottledApps) iStatement() {} -func (*ShowThrottlerStatus) iStatement() {} -func (*DropTable) iStatement() {} -func (*DropView) iStatement() {} -func (*TruncateTable) iStatement() {} -func (*RenameTable) iStatement() {} -func (*CallProc) iStatement() {} -func (*ExplainStmt) iStatement() {} -func (*VExplainStmt) iStatement() {} -func (*ExplainTab) iStatement() {} -func (*PrepareStmt) iStatement() {} -func (*ExecuteStmt) iStatement() {} -func (*DeallocateStmt) iStatement() {} -func (*PurgeBinaryLogs) iStatement() {} -func (*Kill) iStatement() {} +var _ OrderAndLimit = (*ValuesStatement)(nil) + +func (*Union) iStatement() {} +func (*Select) iStatement() {} +func (*ValuesStatement) iStatement() {} +func (*Stream) iStatement() {} +func (*VStream) iStatement() {} +func (*Insert) iStatement() {} +func (*Update) iStatement() {} +func (*Delete) iStatement() {} +func (*Set) iStatement() {} +func (*DropDatabase) iStatement() {} +func (*Flush) iStatement() {} +func (*Show) iStatement() {} +func (*Use) iStatement() {} +func (*Begin) iStatement() {} +func (*Commit) iStatement() {} +func (*Rollback) iStatement() {} +func (*SRollback) iStatement() {} +func (*Savepoint) iStatement() {} +func (*Release) iStatement() {} +func (*Analyze) iStatement() {} +func (*OtherAdmin) iStatement() {} +func (*CommentOnly) iStatement() {} +func (*Select) iSelectStatement() {} +func (*Select) iTableStatement() {} +func (*ValuesStatement) iSelectStatement() {} +func (*Union) iSelectStatement() {} +func (*Union) iTableStatement() {} +func (*Load) iStatement() {} +func (*CreateDatabase) iStatement() {} +func (*AlterDatabase) iStatement() {} +func (*CreateTable) iStatement() {} +func (*CreateView) iStatement() {} +func (*AlterView) iStatement() {} +func (*LockTables) iStatement() {} +func (*UnlockTables) iStatement() {} +func (*AlterTable) iStatement() {} +func (*AlterVschema) iStatement() {} +func (*AlterMigration) iStatement() {} +func (*RevertMigration) iStatement() {} +func (*ShowMigrationLogs) iStatement() {} +func (*ShowThrottledApps) iStatement() {} +func (*ShowThrottlerStatus) iStatement() {} +func (*DropTable) iStatement() {} +func (*DropView) iStatement() {} +func (*TruncateTable) iStatement() {} +func (*RenameTable) iStatement() {} +func (*CallProc) iStatement() {} +func (*ExplainStmt) iStatement() {} +func (*VExplainStmt) iStatement() {} +func (*ExplainTab) iStatement() {} +func (*PrepareStmt) iStatement() {} +func (*ExecuteStmt) iStatement() {} +func (*DeallocateStmt) iStatement() {} +func (*PurgeBinaryLogs) iStatement() {} +func (*Kill) iStatement() {} func (*CreateView) iDDLStatement() {} func (*AlterView) iDDLStatement() {} @@ -1702,9 +1730,10 @@ type InsertRows interface { SQLNode } -func (*Select) iInsertRows() {} -func (*Union) iInsertRows() {} -func (Values) iInsertRows() {} +func (*Select) iInsertRows() {} +func (*Union) iInsertRows() {} +func (Values) iInsertRows() {} +func (*ValuesStatement) iInsertRows() {} // OptLike works for create table xxx like xxx type OptLike struct { @@ -2108,13 +2137,13 @@ type ( // Subquery represents a subquery used as an value expression. Subquery struct { - Select SelectStatement + Select TableStatement } // DerivedTable represents a subquery used as a table expression. DerivedTable struct { Lateral bool - Select SelectStatement + Select TableStatement } ) @@ -3575,6 +3604,18 @@ type Limit struct { // Values represents a VALUES clause. type Values []ValTuple +// ValuesStatement represents a VALUES statement, as in VALUES ROW(1, 2), ROW(3, 4) +type ValuesStatement struct { + With *With + // One but not both of these fields can be set. + Rows Values + ListArg ListArg + + Comments *ParsedComments + Order OrderBy + Limit *Limit +} + // UpdateExprs represents a list of update expressions. type UpdateExprs []*UpdateExpr diff --git a/go/vt/sqlparser/ast_clone.go b/go/vt/sqlparser/ast_clone.go index 03a5fabe552..3c7f4fe5e6a 100644 --- a/go/vt/sqlparser/ast_clone.go +++ b/go/vt/sqlparser/ast_clone.go @@ -535,6 +535,8 @@ func CloneSQLNode(in SQLNode) SQLNode { return CloneValues(in) case *ValuesFuncExpr: return CloneRefOfValuesFuncExpr(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) case *VarPop: return CloneRefOfVarPop(in) case *VarSamp: @@ -711,7 +713,7 @@ func CloneRefOfAlterView(n *AlterView) *AlterView { out.ViewName = CloneTableName(n.ViewName) out.Definer = CloneRefOfDefiner(n.Definer) out.Columns = CloneColumns(n.Columns) - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) out.Comments = CloneRefOfParsedComments(n.Comments) return &out } @@ -1023,7 +1025,7 @@ func CloneRefOfCommonTableExpr(n *CommonTableExpr) *CommonTableExpr { out := *n out.ID = CloneIdentifierCS(n.ID) out.Columns = CloneColumns(n.Columns) - out.Subquery = CloneSelectStatement(n.Subquery) + out.Subquery = CloneTableStatement(n.Subquery) return &out } @@ -1138,7 +1140,7 @@ func CloneRefOfCreateView(n *CreateView) *CreateView { out.ViewName = CloneTableName(n.ViewName) out.Definer = CloneRefOfDefiner(n.Definer) out.Columns = CloneColumns(n.Columns) - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) out.Comments = CloneRefOfParsedComments(n.Comments) return &out } @@ -1205,7 +1207,7 @@ func CloneRefOfDerivedTable(n *DerivedTable) *DerivedTable { return nil } out := *n - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) return &out } @@ -3042,7 +3044,7 @@ func CloneRefOfSubquery(n *Subquery) *Subquery { return nil } out := *n - out.Select = CloneSelectStatement(n.Select) + out.Select = CloneTableStatement(n.Select) return &out } @@ -3182,8 +3184,8 @@ func CloneRefOfUnion(n *Union) *Union { } out := *n out.With = CloneRefOfWith(n.With) - out.Left = CloneSelectStatement(n.Left) - out.Right = CloneSelectStatement(n.Right) + out.Left = CloneTableStatement(n.Left) + out.Right = CloneTableStatement(n.Right) out.OrderBy = CloneOrderBy(n.OrderBy) out.Limit = CloneRefOfLimit(n.Limit) out.Into = CloneRefOfSelectInto(n.Into) @@ -3328,6 +3330,20 @@ func CloneRefOfValuesFuncExpr(n *ValuesFuncExpr) *ValuesFuncExpr { return &out } +// CloneRefOfValuesStatement creates a deep clone of the input. +func CloneRefOfValuesStatement(n *ValuesStatement) *ValuesStatement { + if n == nil { + return nil + } + out := *n + out.With = CloneRefOfWith(n.With) + out.Rows = CloneValues(n.Rows) + out.Comments = CloneRefOfParsedComments(n.Comments) + out.Order = CloneOrderBy(n.Order) + out.Limit = CloneRefOfLimit(n.Limit) + return &out +} + // CloneRefOfVarPop creates a deep clone of the input. func CloneRefOfVarPop(n *VarPop) *VarPop { if n == nil { @@ -4107,6 +4123,8 @@ func CloneInsertRows(in InsertRows) InsertRows { return CloneRefOfUnion(in) case Values: return CloneValues(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) default: // this should never happen return nil @@ -4287,6 +4305,8 @@ func CloneStatement(in Statement) Statement { return CloneRefOfVExplainStmt(in) case *VStream: return CloneRefOfVStream(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) default: // this should never happen return nil @@ -4313,6 +4333,24 @@ func CloneTableExpr(in TableExpr) TableExpr { } } +// CloneTableStatement creates a deep clone of the input. +func CloneTableStatement(in TableStatement) TableStatement { + if in == nil { + return nil + } + switch in := in.(type) { + case *Select: + return CloneRefOfSelect(in) + case *Union: + return CloneRefOfUnion(in) + case *ValuesStatement: + return CloneRefOfValuesStatement(in) + default: + // this should never happen + return nil + } +} + // CloneSliceOfRefOfColumnDefinition creates a deep clone of the input. func CloneSliceOfRefOfColumnDefinition(n []*ColumnDefinition) []*ColumnDefinition { if n == nil { diff --git a/go/vt/sqlparser/ast_copy_on_rewrite.go b/go/vt/sqlparser/ast_copy_on_rewrite.go index 9b952b36dc7..f725dfc6803 100644 --- a/go/vt/sqlparser/ast_copy_on_rewrite.go +++ b/go/vt/sqlparser/ast_copy_on_rewrite.go @@ -534,6 +534,8 @@ func (c *cow) copyOnRewriteSQLNode(n SQLNode, parent SQLNode) (out SQLNode, chan return c.copyOnRewriteValues(n, parent) case *ValuesFuncExpr: return c.copyOnRewriteRefOfValuesFuncExpr(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) case *VarPop: return c.copyOnRewriteRefOfVarPop(n, parent) case *VarSamp: @@ -870,14 +872,14 @@ func (c *cow) copyOnRewriteRefOfAlterView(n *AlterView, parent SQLNode) (out SQL _ViewName, changedViewName := c.copyOnRewriteTableName(n.ViewName, n) _Definer, changedDefiner := c.copyOnRewriteRefOfDefiner(n.Definer, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) if changedViewName || changedDefiner || changedColumns || changedSelect || changedComments { res := *n res.ViewName, _ = _ViewName.(TableName) res.Definer, _ = _Definer.(*Definer) res.Columns, _ = _Columns.(Columns) - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) res.Comments, _ = _Comments.(*ParsedComments) out = &res if c.cloned != nil { @@ -1524,12 +1526,12 @@ func (c *cow) copyOnRewriteRefOfCommonTableExpr(n *CommonTableExpr, parent SQLNo if c.pre == nil || c.pre(n, parent) { _ID, changedID := c.copyOnRewriteIdentifierCS(n.ID, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Subquery, changedSubquery := c.copyOnRewriteSelectStatement(n.Subquery, n) + _Subquery, changedSubquery := c.copyOnRewriteTableStatement(n.Subquery, n) if changedID || changedColumns || changedSubquery { res := *n res.ID, _ = _ID.(IdentifierCS) res.Columns, _ = _Columns.(Columns) - res.Subquery, _ = _Subquery.(SelectStatement) + res.Subquery, _ = _Subquery.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -1757,14 +1759,14 @@ func (c *cow) copyOnRewriteRefOfCreateView(n *CreateView, parent SQLNode) (out S _ViewName, changedViewName := c.copyOnRewriteTableName(n.ViewName, n) _Definer, changedDefiner := c.copyOnRewriteRefOfDefiner(n.Definer, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) if changedViewName || changedDefiner || changedColumns || changedSelect || changedComments { res := *n res.ViewName, _ = _ViewName.(TableName) res.Definer, _ = _Definer.(*Definer) res.Columns, _ = _Columns.(Columns) - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) res.Comments, _ = _Comments.(*ParsedComments) out = &res if c.cloned != nil { @@ -1898,10 +1900,10 @@ func (c *cow) copyOnRewriteRefOfDerivedTable(n *DerivedTable, parent SQLNode) (o } out = n if c.pre == nil || c.pre(n, parent) { - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) if changedSelect { res := *n - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -5790,10 +5792,10 @@ func (c *cow) copyOnRewriteRefOfSubquery(n *Subquery, parent SQLNode) (out SQLNo } out = n if c.pre == nil || c.pre(n, parent) { - _Select, changedSelect := c.copyOnRewriteSelectStatement(n.Select, n) + _Select, changedSelect := c.copyOnRewriteTableStatement(n.Select, n) if changedSelect { res := *n - res.Select, _ = _Select.(SelectStatement) + res.Select, _ = _Select.(TableStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -6101,16 +6103,16 @@ func (c *cow) copyOnRewriteRefOfUnion(n *Union, parent SQLNode) (out SQLNode, ch out = n if c.pre == nil || c.pre(n, parent) { _With, changedWith := c.copyOnRewriteRefOfWith(n.With, n) - _Left, changedLeft := c.copyOnRewriteSelectStatement(n.Left, n) - _Right, changedRight := c.copyOnRewriteSelectStatement(n.Right, n) + _Left, changedLeft := c.copyOnRewriteTableStatement(n.Left, n) + _Right, changedRight := c.copyOnRewriteTableStatement(n.Right, n) _OrderBy, changedOrderBy := c.copyOnRewriteOrderBy(n.OrderBy, n) _Limit, changedLimit := c.copyOnRewriteRefOfLimit(n.Limit, n) _Into, changedInto := c.copyOnRewriteRefOfSelectInto(n.Into, n) if changedWith || changedLeft || changedRight || changedOrderBy || changedLimit || changedInto { res := *n res.With, _ = _With.(*With) - res.Left, _ = _Left.(SelectStatement) - res.Right, _ = _Right.(SelectStatement) + res.Left, _ = _Left.(TableStatement) + res.Right, _ = _Right.(TableStatement) res.OrderBy, _ = _OrderBy.(OrderBy) res.Limit, _ = _Limit.(*Limit) res.Into, _ = _Into.(*SelectInto) @@ -6409,6 +6411,38 @@ func (c *cow) copyOnRewriteRefOfValuesFuncExpr(n *ValuesFuncExpr, parent SQLNode } return } +func (c *cow) copyOnRewriteRefOfValuesStatement(n *ValuesStatement, parent SQLNode) (out SQLNode, changed bool) { + if n == nil || c.cursor.stop { + return n, false + } + out = n + if c.pre == nil || c.pre(n, parent) { + _With, changedWith := c.copyOnRewriteRefOfWith(n.With, n) + _Rows, changedRows := c.copyOnRewriteValues(n.Rows, n) + _ListArg, changedListArg := c.copyOnRewriteListArg(n.ListArg, n) + _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) + _Order, changedOrder := c.copyOnRewriteOrderBy(n.Order, n) + _Limit, changedLimit := c.copyOnRewriteRefOfLimit(n.Limit, n) + if changedWith || changedRows || changedListArg || changedComments || changedOrder || changedLimit { + res := *n + res.With, _ = _With.(*With) + res.Rows, _ = _Rows.(Values) + res.ListArg, _ = _ListArg.(ListArg) + res.Comments, _ = _Comments.(*ParsedComments) + res.Order, _ = _Order.(OrderBy) + res.Limit, _ = _Limit.(*Limit) + out = &res + if c.cloned != nil { + c.cloned(n, out) + } + changed = true + } + } + if c.post != nil { + out, changed = c.postVisit(out, parent, changed) + } + return +} func (c *cow) copyOnRewriteRefOfVarPop(n *VarPop, parent SQLNode) (out SQLNode, changed bool) { if n == nil || c.cursor.stop { return n, false @@ -7366,6 +7400,8 @@ func (c *cow) copyOnRewriteInsertRows(n InsertRows, parent SQLNode) (out SQLNode return c.copyOnRewriteRefOfUnion(n, parent) case Values: return c.copyOnRewriteValues(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) default: // this should never happen return nil, false @@ -7536,6 +7572,8 @@ func (c *cow) copyOnRewriteStatement(n Statement, parent SQLNode) (out SQLNode, return c.copyOnRewriteRefOfVExplainStmt(n, parent) case *VStream: return c.copyOnRewriteRefOfVStream(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) default: // this should never happen return nil, false @@ -7559,6 +7597,22 @@ func (c *cow) copyOnRewriteTableExpr(n TableExpr, parent SQLNode) (out SQLNode, return nil, false } } +func (c *cow) copyOnRewriteTableStatement(n TableStatement, parent SQLNode) (out SQLNode, changed bool) { + if n == nil || c.cursor.stop { + return n, false + } + switch n := n.(type) { + case *Select: + return c.copyOnRewriteRefOfSelect(n, parent) + case *Union: + return c.copyOnRewriteRefOfUnion(n, parent) + case *ValuesStatement: + return c.copyOnRewriteRefOfValuesStatement(n, parent) + default: + // this should never happen + return nil, false + } +} func (c *cow) copyOnRewriteAlgorithmValue(n AlgorithmValue, parent SQLNode) (out SQLNode, changed bool) { if c.cursor.stop { return n, false diff --git a/go/vt/sqlparser/ast_equals.go b/go/vt/sqlparser/ast_equals.go index c4c0b34c271..93f10376177 100644 --- a/go/vt/sqlparser/ast_equals.go +++ b/go/vt/sqlparser/ast_equals.go @@ -1562,6 +1562,12 @@ func (cmp *Comparator) SQLNode(inA, inB SQLNode) bool { return false } return cmp.RefOfValuesFuncExpr(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) case *VarPop: b, ok := inB.(*VarPop) if !ok { @@ -1826,7 +1832,7 @@ func (cmp *Comparator) RefOfAlterView(a, b *AlterView) bool { cmp.TableName(a.ViewName, b.ViewName) && cmp.RefOfDefiner(a.Definer, b.Definer) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Select, b.Select) && + cmp.TableStatement(a.Select, b.Select) && cmp.RefOfParsedComments(a.Comments, b.Comments) } @@ -2195,7 +2201,7 @@ func (cmp *Comparator) RefOfCommonTableExpr(a, b *CommonTableExpr) bool { } return cmp.IdentifierCS(a.ID, b.ID) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Subquery, b.Subquery) + cmp.TableStatement(a.Subquery, b.Subquery) } // RefOfComparisonExpr does deep equals between the two objects. @@ -2334,7 +2340,7 @@ func (cmp *Comparator) RefOfCreateView(a, b *CreateView) bool { cmp.TableName(a.ViewName, b.ViewName) && cmp.RefOfDefiner(a.Definer, b.Definer) && cmp.Columns(a.Columns, b.Columns) && - cmp.SelectStatement(a.Select, b.Select) && + cmp.TableStatement(a.Select, b.Select) && cmp.RefOfParsedComments(a.Comments, b.Comments) } @@ -2413,7 +2419,7 @@ func (cmp *Comparator) RefOfDerivedTable(a, b *DerivedTable) bool { return false } return a.Lateral == b.Lateral && - cmp.SelectStatement(a.Select, b.Select) + cmp.TableStatement(a.Select, b.Select) } // RefOfDropColumn does deep equals between the two objects. @@ -4525,7 +4531,7 @@ func (cmp *Comparator) RefOfSubquery(a, b *Subquery) bool { if a == nil || b == nil { return false } - return cmp.SelectStatement(a.Select, b.Select) + return cmp.TableStatement(a.Select, b.Select) } // RefOfSubstrExpr does deep equals between the two objects. @@ -4685,8 +4691,8 @@ func (cmp *Comparator) RefOfUnion(a, b *Union) bool { } return a.Distinct == b.Distinct && cmp.RefOfWith(a.With, b.With) && - cmp.SelectStatement(a.Left, b.Left) && - cmp.SelectStatement(a.Right, b.Right) && + cmp.TableStatement(a.Left, b.Left) && + cmp.TableStatement(a.Right, b.Right) && cmp.OrderBy(a.OrderBy, b.OrderBy) && cmp.RefOfLimit(a.Limit, b.Limit) && a.Lock == b.Lock && @@ -4847,6 +4853,22 @@ func (cmp *Comparator) RefOfValuesFuncExpr(a, b *ValuesFuncExpr) bool { return cmp.RefOfColName(a.Name, b.Name) } +// RefOfValuesStatement does deep equals between the two objects. +func (cmp *Comparator) RefOfValuesStatement(a, b *ValuesStatement) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return cmp.RefOfWith(a.With, b.With) && + cmp.Values(a.Rows, b.Rows) && + a.ListArg == b.ListArg && + cmp.RefOfParsedComments(a.Comments, b.Comments) && + cmp.OrderBy(a.Order, b.Order) && + cmp.RefOfLimit(a.Limit, b.Limit) +} + // RefOfVarPop does deep equals between the two objects. func (cmp *Comparator) RefOfVarPop(a, b *VarPop) bool { if a == b { @@ -6705,6 +6727,12 @@ func (cmp *Comparator) InsertRows(inA, inB InsertRows) bool { return false } return cmp.Values(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) default: // this should never happen return false @@ -7140,6 +7168,12 @@ func (cmp *Comparator) Statement(inA, inB Statement) bool { return false } return cmp.RefOfVStream(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) default: // this should never happen return false @@ -7185,6 +7219,39 @@ func (cmp *Comparator) TableExpr(inA, inB TableExpr) bool { } } +// TableStatement does deep equals between the two objects. +func (cmp *Comparator) TableStatement(inA, inB TableStatement) bool { + if inA == nil && inB == nil { + return true + } + if inA == nil || inB == nil { + return false + } + switch a := inA.(type) { + case *Select: + b, ok := inB.(*Select) + if !ok { + return false + } + return cmp.RefOfSelect(a, b) + case *Union: + b, ok := inB.(*Union) + if !ok { + return false + } + return cmp.RefOfUnion(a, b) + case *ValuesStatement: + b, ok := inB.(*ValuesStatement) + if !ok { + return false + } + return cmp.RefOfValuesStatement(a, b) + default: + // this should never happen + return false + } +} + // SliceOfRefOfColumnDefinition does deep equals between the two objects. func (cmp *Comparator) SliceOfRefOfColumnDefinition(a, b []*ColumnDefinition) bool { if len(a) != len(b) { diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index dff17911d8e..37539c450b2 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -120,6 +120,26 @@ func (node *VStream) Format(buf *TrackedBuffer) { node.Comments, node.SelectExpr, node.Table) } +// Format formats the node. +func (node *ValuesStatement) Format(buf *TrackedBuffer) { + if node.With != nil { + buf.astPrintf(node, "%v", node.With) + } + buf.astPrintf(node, "values %v", node.Comments) + if node.ListArg != "" { + buf.astPrintf(node, "%v", node.ListArg) + } else { + for i, row := range node.Rows { + buf.astPrintf(node, "row%v", row) + if i < len(node.Rows)-1 { + buf.WriteString(", ") + } + } + } + buf.astPrintf(node, "%v%v", + node.Order, node.Limit) +} + // Format formats the node. func (node *Stream) Format(buf *TrackedBuffer) { buf.astPrintf(node, "stream %v%v from %v", diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index 9855c70a21d..7a818faf0c0 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -141,6 +141,30 @@ func (node *VStream) FormatFast(buf *TrackedBuffer) { } +// FormatFast formats the node. +func (node *ValuesStatement) FormatFast(buf *TrackedBuffer) { + if node.With != nil { + node.With.FormatFast(buf) + } + buf.WriteString("values ") + node.Comments.FormatFast(buf) + if node.ListArg != "" { + node.ListArg.FormatFast(buf) + } else { + for i, row := range node.Rows { + buf.WriteString("row") + row.FormatFast(buf) + if i < len(node.Rows)-1 { + buf.WriteString(", ") + } + } + } + + node.Order.FormatFast(buf) + node.Limit.FormatFast(buf) + +} + // FormatFast formats the node. func (node *Stream) FormatFast(buf *TrackedBuffer) { buf.WriteString("stream ") diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 2891d532d16..7e493ec5618 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -640,6 +640,26 @@ func parseBindVariable(yylex yyLexer, bvar string) *Argument { return NewArgument(bvar) } +func setIntoIfPossible(lexer yyLexer, tblSubquery TableStatement, into *SelectInto) { + selStmt, ok := tblSubquery.(SelectStatement) + if !ok { + lexer.Error("VALUES does not support INTO") + return + } + + selStmt.SetInto(into) +} + +func setLockIfPossible(lexer yyLexer, tblSubquery TableStatement, lock Lock) { + selStmt, ok := tblSubquery.(SelectStatement) + if !ok { + lexer.Error("VALUES does not support LOCK") + return + } + + selStmt.SetLock(lock) +} + func NewTypedArgument(in string, t sqltypes.Type) *Argument { return &Argument{Name: in, Type: t} } @@ -755,12 +775,12 @@ func NewTableNameWithQualifier(name, qualifier string) TableName { } // NewSubquery makes a new Subquery -func NewSubquery(selectStatement SelectStatement) *Subquery { +func NewSubquery(selectStatement TableStatement) *Subquery { return &Subquery{Select: selectStatement} } // NewDerivedTable makes a new DerivedTable -func NewDerivedTable(lateral bool, selectStatement SelectStatement) *DerivedTable { +func NewDerivedTable(lateral bool, selectStatement TableStatement) *DerivedTable { return &DerivedTable{ Lateral: lateral, Select: selectStatement, @@ -1391,7 +1411,7 @@ func (node *Union) GetParsedComments() *ParsedComments { return node.Left.GetParsedComments() } -func requiresParen(stmt SelectStatement) bool { +func requiresParen(stmt TableStatement) bool { switch node := stmt.(type) { case *Union: return len(node.OrderBy) != 0 || node.Lock != 0 || node.Into != nil || node.Limit != nil @@ -1402,10 +1422,6 @@ func requiresParen(stmt SelectStatement) bool { return false } -func setLockInSelect(stmt SelectStatement, lock Lock) { - stmt.SetLock(lock) -} - // ToString returns the string associated with the DDLAction Enum func (action DDLAction) ToString() string { switch action { @@ -2345,26 +2361,30 @@ func setFuncArgs(aggr AggrFunc, exprs Exprs, name string) error { } // GetFirstSelect gets the first select statement -func GetFirstSelect(selStmt SelectStatement) *Select { +func GetFirstSelect(selStmt TableStatement) (*Select, error) { if selStmt == nil { - return nil + return nil, nil } switch node := selStmt.(type) { case *Select: - return node + return node, nil + case *ValuesStatement: + return nil, vterrors.VT12001("first table_reference as VALUES") case *Union: return GetFirstSelect(node.Left) } - panic("[BUG]: unknown type for SelectStatement") + return nil, vterrors.VT13001(fmt.Sprintf("unknown type for SelectStatement: %T", selStmt)) } // GetAllSelects gets all the select statement s -func GetAllSelects(selStmt SelectStatement) []*Select { +func GetAllSelects(selStmt TableStatement) []TableStatement { switch node := selStmt.(type) { case *Select: - return []*Select{node} + return []TableStatement{node} case *Union: return append(GetAllSelects(node.Left), GetAllSelects(node.Right)...) + case *ValuesStatement: + return []TableStatement{node} } panic("[BUG]: unknown type for SelectStatement") } @@ -2772,7 +2792,7 @@ func MakeColumns(colNames ...string) Columns { return cols } -func VisitAllSelects(in SelectStatement, f func(p *Select, idx int) error) error { +func VisitAllSelects(in TableStatement, f func(p *Select, idx int) error) error { v := visitor{} return v.visitAllSelects(in, f) } @@ -2781,7 +2801,7 @@ type visitor struct { idx int } -func (v *visitor) visitAllSelects(in SelectStatement, f func(p *Select, idx int) error) error { +func (v *visitor) visitAllSelects(in TableStatement, f func(p *Select, idx int) error) error { switch sel := in.(type) { case *Select: err := f(sel, v.idx) @@ -2875,6 +2895,30 @@ func (node *Update) SetLimit(limit *Limit) { node.Limit = limit } +func (node *Update) GetOrderBy() OrderBy { + return node.OrderBy +} + +func (node *Update) SetOrderBy(by OrderBy) { + node.OrderBy = by +} + +func (node *Update) GetLimit() *Limit { + return node.Limit +} + +func (node *Delete) GetOrderBy() OrderBy { + return node.OrderBy +} + +func (node *Delete) SetOrderBy(by OrderBy) { + node.OrderBy = by +} + +func (node *Delete) GetLimit() *Limit { + return node.Limit +} + func (node *Delete) AddOrder(order *Order) { node.OrderBy = append(node.OrderBy, order) } @@ -2981,3 +3025,50 @@ func ExtractAllTables(stmt Statement) []string { }, stmt) return tables } + +var _ TableStatement = (*ValuesStatement)(nil) + +func (node *ValuesStatement) iTableStatement() {} + +func (node *ValuesStatement) SetWith(with *With) { + node.With = with +} + +func (node *ValuesStatement) GetOrderBy() OrderBy { + return node.Order +} + +func (node *ValuesStatement) SetOrderBy(by OrderBy) { + node.Order = by +} + +func (node *ValuesStatement) GetLimit() *Limit { + return node.Limit +} + +func (node *ValuesStatement) AddOrder(order *Order) { + node.Order = append(node.Order, order) +} + +func (node *ValuesStatement) SetLimit(limit *Limit) { + node.Limit = limit +} + +func (node *ValuesStatement) GetColumnCount() int { + if len(node.Rows) > 0 { + return len(node.Rows[0]) + } + panic("no columns available") // TODO: we need a better solution than a panic +} + +func (node *ValuesStatement) GetColumns() (result SelectExprs) { + columnCount := node.GetColumnCount() + for i := range columnCount { + result = append(result, &AliasedExpr{Expr: NewColName(fmt.Sprintf("column_%d", i))}) + } + panic("no columns available") // TODO: we need a better solution than a panic +} + +func (node *ValuesStatement) SetComments(comments Comments) {} + +func (node *ValuesStatement) GetParsedComments() *ParsedComments { return nil } diff --git a/go/vt/sqlparser/ast_rewrite.go b/go/vt/sqlparser/ast_rewrite.go index e65b243d7e1..690b381b082 100644 --- a/go/vt/sqlparser/ast_rewrite.go +++ b/go/vt/sqlparser/ast_rewrite.go @@ -534,6 +534,8 @@ func (a *application) rewriteSQLNode(parent SQLNode, node SQLNode, replacer repl return a.rewriteValues(parent, node, replacer) case *ValuesFuncExpr: return a.rewriteRefOfValuesFuncExpr(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) case *VarPop: return a.rewriteRefOfVarPop(parent, node, replacer) case *VarSamp: @@ -983,8 +985,8 @@ func (a *application) rewriteRefOfAlterView(parent SQLNode, node *AlterView, rep }) { return false } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*AlterView).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*AlterView).Select = newNode.(TableStatement) }) { return false } @@ -1969,8 +1971,8 @@ func (a *application) rewriteRefOfCommonTableExpr(parent SQLNode, node *CommonTa }) { return false } - if !a.rewriteSelectStatement(node, node.Subquery, func(newNode, parent SQLNode) { - parent.(*CommonTableExpr).Subquery = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Subquery, func(newNode, parent SQLNode) { + parent.(*CommonTableExpr).Subquery = newNode.(TableStatement) }) { return false } @@ -2321,8 +2323,8 @@ func (a *application) rewriteRefOfCreateView(parent SQLNode, node *CreateView, r }) { return false } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*CreateView).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*CreateView).Select = newNode.(TableStatement) }) { return false } @@ -2536,8 +2538,8 @@ func (a *application) rewriteRefOfDerivedTable(parent SQLNode, node *DerivedTabl return true } } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*DerivedTable).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*DerivedTable).Select = newNode.(TableStatement) }) { return false } @@ -8337,8 +8339,8 @@ func (a *application) rewriteRefOfSubquery(parent SQLNode, node *Subquery, repla return true } } - if !a.rewriteSelectStatement(node, node.Select, func(newNode, parent SQLNode) { - parent.(*Subquery).Select = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Select, func(newNode, parent SQLNode) { + parent.(*Subquery).Select = newNode.(TableStatement) }) { return false } @@ -8797,13 +8799,13 @@ func (a *application) rewriteRefOfUnion(parent SQLNode, node *Union, replacer re }) { return false } - if !a.rewriteSelectStatement(node, node.Left, func(newNode, parent SQLNode) { - parent.(*Union).Left = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Left, func(newNode, parent SQLNode) { + parent.(*Union).Left = newNode.(TableStatement) }) { return false } - if !a.rewriteSelectStatement(node, node.Right, func(newNode, parent SQLNode) { - parent.(*Union).Right = newNode.(SelectStatement) + if !a.rewriteTableStatement(node, node.Right, func(newNode, parent SQLNode) { + parent.(*Union).Right = newNode.(TableStatement) }) { return false } @@ -9264,6 +9266,58 @@ func (a *application) rewriteRefOfValuesFuncExpr(parent SQLNode, node *ValuesFun } return true } +func (a *application) rewriteRefOfValuesStatement(parent SQLNode, node *ValuesStatement, replacer replacerFunc) bool { + if node == nil { + return true + } + if a.pre != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.pre(&a.cur) { + return true + } + } + if !a.rewriteRefOfWith(node, node.With, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).With = newNode.(*With) + }) { + return false + } + if !a.rewriteValues(node, node.Rows, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Rows = newNode.(Values) + }) { + return false + } + if !a.rewriteListArg(node, node.ListArg, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).ListArg = newNode.(ListArg) + }) { + return false + } + if !a.rewriteRefOfParsedComments(node, node.Comments, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Comments = newNode.(*ParsedComments) + }) { + return false + } + if !a.rewriteOrderBy(node, node.Order, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Order = newNode.(OrderBy) + }) { + return false + } + if !a.rewriteRefOfLimit(node, node.Limit, func(newNode, parent SQLNode) { + parent.(*ValuesStatement).Limit = newNode.(*Limit) + }) { + return false + } + if a.post != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.post(&a.cur) { + return false + } + } + return true +} func (a *application) rewriteRefOfVarPop(parent SQLNode, node *VarPop, replacer replacerFunc) bool { if node == nil { return true @@ -10358,6 +10412,8 @@ func (a *application) rewriteInsertRows(parent SQLNode, node InsertRows, replace return a.rewriteRefOfUnion(parent, node, replacer) case Values: return a.rewriteValues(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) default: // this should never happen return true @@ -10528,6 +10584,8 @@ func (a *application) rewriteStatement(parent SQLNode, node Statement, replacer return a.rewriteRefOfVExplainStmt(parent, node, replacer) case *VStream: return a.rewriteRefOfVStream(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) default: // this should never happen return true @@ -10551,6 +10609,22 @@ func (a *application) rewriteTableExpr(parent SQLNode, node TableExpr, replacer return true } } +func (a *application) rewriteTableStatement(parent SQLNode, node TableStatement, replacer replacerFunc) bool { + if node == nil { + return true + } + switch node := node.(type) { + case *Select: + return a.rewriteRefOfSelect(parent, node, replacer) + case *Union: + return a.rewriteRefOfUnion(parent, node, replacer) + case *ValuesStatement: + return a.rewriteRefOfValuesStatement(parent, node, replacer) + default: + // this should never happen + return true + } +} func (a *application) rewriteAlgorithmValue(parent SQLNode, node AlgorithmValue, replacer replacerFunc) bool { if a.pre != nil { a.cur.replacer = replacer diff --git a/go/vt/sqlparser/ast_rewriting.go b/go/vt/sqlparser/ast_rewriting.go index ef46b124875..05e7e290fc1 100644 --- a/go/vt/sqlparser/ast_rewriting.go +++ b/go/vt/sqlparser/ast_rewriting.go @@ -38,7 +38,7 @@ type RewriteASTResult struct { } type VSchemaViews interface { - FindView(name TableName) SelectStatement + FindView(name TableName) TableStatement } // PrepareAST will normalize the query @@ -257,7 +257,7 @@ func (er *astRewriter) rewriteAliasedTable(cursor *Cursor, node *AliasedTableExp } // Aha! It's a view. Let's replace it with a derived table - node.Expr = &DerivedTable{Select: CloneSelectStatement(view)} + node.Expr = &DerivedTable{Select: Clone(view)} // TODO: this is a bit hacky. We want to update the schema def so it contains new types if node.As.IsEmpty() { node.As = NewIdentifierCS(tblName) } diff --git a/go/vt/sqlparser/ast_rewriting_test.go b/go/vt/sqlparser/ast_rewriting_test.go index 3ad9a5298c4..8b3e3d44c54 100644 --- a/go/vt/sqlparser/ast_rewriting_test.go +++ b/go/vt/sqlparser/ast_rewriting_test.go @@ -388,7 +388,7 @@ func TestRewrites(in *testing.T) { type fakeViews struct{} -func (*fakeViews) FindView(name TableName) SelectStatement { +func (*fakeViews) FindView(name TableName) TableStatement { if name.Name.String() != "user_details" { return nil } @@ -397,7 +397,7 @@ func (*fakeViews) FindView(name TableName) SelectStatement { if err != nil { return nil } - return statement.(SelectStatement) + return statement.(TableStatement) } func TestRewritesWithSetVarComment(in *testing.T) { diff --git a/go/vt/sqlparser/ast_visit.go b/go/vt/sqlparser/ast_visit.go index 439d0bffeec..a7fbbe02118 100644 --- a/go/vt/sqlparser/ast_visit.go +++ b/go/vt/sqlparser/ast_visit.go @@ -534,6 +534,8 @@ func VisitSQLNode(in SQLNode, f Visit) error { return VisitValues(in, f) case *ValuesFuncExpr: return VisitRefOfValuesFuncExpr(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) case *VarPop: return VisitRefOfVarPop(in, f) case *VarSamp: @@ -764,7 +766,7 @@ func VisitRefOfAlterView(in *AlterView, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } if err := VisitRefOfParsedComments(in.Comments, f); err != nil { @@ -1175,7 +1177,7 @@ func VisitRefOfCommonTableExpr(in *CommonTableExpr, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Subquery, f); err != nil { + if err := VisitTableStatement(in.Subquery, f); err != nil { return err } return nil @@ -1328,7 +1330,7 @@ func VisitRefOfCreateView(in *CreateView, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } if err := VisitRefOfParsedComments(in.Comments, f); err != nil { @@ -1423,7 +1425,7 @@ func VisitRefOfDerivedTable(in *DerivedTable, f Visit) error { if cont, err := f(in); err != nil || !cont { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } return nil @@ -3890,7 +3892,7 @@ func VisitRefOfSubquery(in *Subquery, f Visit) error { if cont, err := f(in); err != nil || !cont { return err } - if err := VisitSelectStatement(in.Select, f); err != nil { + if err := VisitTableStatement(in.Select, f); err != nil { return err } return nil @@ -4075,10 +4077,10 @@ func VisitRefOfUnion(in *Union, f Visit) error { if err := VisitRefOfWith(in.With, f); err != nil { return err } - if err := VisitSelectStatement(in.Left, f); err != nil { + if err := VisitTableStatement(in.Left, f); err != nil { return err } - if err := VisitSelectStatement(in.Right, f); err != nil { + if err := VisitTableStatement(in.Right, f); err != nil { return err } if err := VisitOrderBy(in.OrderBy, f); err != nil { @@ -4280,6 +4282,33 @@ func VisitRefOfValuesFuncExpr(in *ValuesFuncExpr, f Visit) error { } return nil } +func VisitRefOfValuesStatement(in *ValuesStatement, f Visit) error { + if in == nil { + return nil + } + if cont, err := f(in); err != nil || !cont { + return err + } + if err := VisitRefOfWith(in.With, f); err != nil { + return err + } + if err := VisitValues(in.Rows, f); err != nil { + return err + } + if err := VisitListArg(in.ListArg, f); err != nil { + return err + } + if err := VisitRefOfParsedComments(in.Comments, f); err != nil { + return err + } + if err := VisitOrderBy(in.Order, f); err != nil { + return err + } + if err := VisitRefOfLimit(in.Limit, f); err != nil { + return err + } + return nil +} func VisitRefOfVarPop(in *VarPop, f Visit) error { if in == nil { return nil @@ -5098,6 +5127,8 @@ func VisitInsertRows(in InsertRows, f Visit) error { return VisitRefOfUnion(in, f) case Values: return VisitValues(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) default: // this should never happen return nil @@ -5268,6 +5299,8 @@ func VisitStatement(in Statement, f Visit) error { return VisitRefOfVExplainStmt(in, f) case *VStream: return VisitRefOfVStream(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) default: // this should never happen return nil @@ -5291,6 +5324,22 @@ func VisitTableExpr(in TableExpr, f Visit) error { return nil } } +func VisitTableStatement(in TableStatement, f Visit) error { + if in == nil { + return nil + } + switch in := in.(type) { + case *Select: + return VisitRefOfSelect(in, f) + case *Union: + return VisitRefOfUnion(in, f) + case *ValuesStatement: + return VisitRefOfValuesStatement(in, f) + default: + // this should never happen + return nil + } +} func VisitAlgorithmValue(in AlgorithmValue, f Visit) error { _, err := f(in) return err diff --git a/go/vt/sqlparser/cached_size.go b/go/vt/sqlparser/cached_size.go index 524291a03b4..3aac4ac1edd 100644 --- a/go/vt/sqlparser/cached_size.go +++ b/go/vt/sqlparser/cached_size.go @@ -272,7 +272,7 @@ func (cached *AlterView) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -849,7 +849,7 @@ func (cached *CommonTableExpr) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Subquery vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Subquery vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Subquery.(cachedObject); ok { size += cc.CachedSize(true) } @@ -1038,7 +1038,7 @@ func (cached *CreateView) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -1168,7 +1168,7 @@ func (cached *DerivedTable) CachedSize(alloc bool) int64 { if alloc { size += int64(24) } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4103,7 +4103,7 @@ func (cached *Subquery) CachedSize(alloc bool) int64 { if alloc { size += int64(16) } - // field Select vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Select vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Select.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4320,11 +4320,11 @@ func (cached *Union) CachedSize(alloc bool) int64 { } // field With *vitess.io/vitess/go/vt/sqlparser.With size += cached.With.CachedSize(true) - // field Left vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Left vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Left.(cachedObject); ok { size += cc.CachedSize(true) } - // field Right vitess.io/vitess/go/vt/sqlparser.SelectStatement + // field Right vitess.io/vitess/go/vt/sqlparser.TableStatement if cc, ok := cached.Right.(cachedObject); ok { size += cc.CachedSize(true) } @@ -4492,6 +4492,45 @@ func (cached *ValuesFuncExpr) CachedSize(alloc bool) int64 { size += cached.Name.CachedSize(true) return size } +func (cached *ValuesStatement) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(96) + } + // field With *vitess.io/vitess/go/vt/sqlparser.With + size += cached.With.CachedSize(true) + // field Rows vitess.io/vitess/go/vt/sqlparser.Values + { + size += hack.RuntimeAllocSize(int64(cap(cached.Rows)) * int64(24)) + for _, elem := range cached.Rows { + { + size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(16)) + for _, elem := range elem { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + } + } + } + // field ListArg vitess.io/vitess/go/vt/sqlparser.ListArg + size += hack.RuntimeAllocSize(int64(len(cached.ListArg))) + // field Comments *vitess.io/vitess/go/vt/sqlparser.ParsedComments + size += cached.Comments.CachedSize(true) + // field Order vitess.io/vitess/go/vt/sqlparser.OrderBy + { + size += hack.RuntimeAllocSize(int64(cap(cached.Order)) * int64(8)) + for _, elem := range cached.Order { + size += elem.CachedSize(true) + } + } + // field Limit *vitess.io/vitess/go/vt/sqlparser.Limit + size += cached.Limit.CachedSize(true) + return size +} func (cached *VarPop) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index d3d5fd469e7..5e075d51baa 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -3868,7 +3868,22 @@ var ( }, { input: `select * from tbl where foo > any (select foo from tbl2)`, }, { - input: `select * from tbl where foo > all (select foo from tbl2)`}} + input: `select * from tbl where foo > all (select foo from tbl2)`, + }, { + input: "insert into t1(a1) values row('a'), row('b')", + }, { + input: "insert into t1(a1) values ('a'), ('b')", + }, { + input: "values row('a'), row('b')", + }, { + input: "values /*my comment*/ row('a'), row('b')", + }, { + input: `with x as (select * from t1 limit 1) values ROW('a1', (select x.a1 from x))`, + output: "with x as (select * from t1 limit 1) values row('a1', (select x.a1 from x))", + }, { + input: "SELECT 1,2 UNION SELECT * from (VALUES ROW(10,15)) t", + output: "select 1, 2 from dual union select * from (values row(10, 15)) as t", + }} ) func TestValid(t *testing.T) { @@ -3944,6 +3959,12 @@ func TestInvalid(t *testing.T) { }, { input: "/*!*/", err: "Query was empty", + }, { + input: "values row(1) into outfile s3 'out_file_name'", + err: "VALUES does not support INTO at position 46", + }, { + input: "values row(1) lock in share mode", + err: "VALUES does not support LOCK at position 33", }, { input: "select /* union with limit on lhs */ 1 from t limit 1 union select 1 from t", err: "syntax error at position 60 near 'union'", @@ -6204,6 +6225,12 @@ var ( }, { input: "create database test_db default encryption @a", output: "syntax error at position 46 near 'a'", + }, { + input: "select * from t1 where a1 in row('a')", + output: "syntax error at position 33 near 'row'", + }, { + input: "insert into t1 (a1) values row('a'), ('b')", + output: "syntax error at position 39", }} ) diff --git a/go/vt/sqlparser/parsed_query.go b/go/vt/sqlparser/parsed_query.go index 491e7400988..0e3f9801610 100644 --- a/go/vt/sqlparser/parsed_query.go +++ b/go/vt/sqlparser/parsed_query.go @@ -101,6 +101,14 @@ func EncodeValue(buf *strings.Builder, value *querypb.BindVariable) { sqltypes.ProtoToValue(bv).EncodeSQLStringBuilder(buf) } buf.WriteByte(')') + case querypb.Type_ROW_TUPLE: + for i, bv := range value.Values { + if i != 0 { + buf.WriteString(", ") + } + buf.WriteString("row") + sqltypes.ProtoToValue(bv).EncodeSQLStringBuilder(buf) + } case querypb.Type_RAW: v, _ := sqltypes.BindVariableToValue(value) buf.Write(v.Raw()) @@ -123,7 +131,9 @@ func FetchBindVar(name string, bindVariables map[string]*querypb.BindVariable) ( } if isList { - if supplied.Type != querypb.Type_TUPLE { + switch supplied.Type { + case querypb.Type_TUPLE, querypb.Type_ROW_TUPLE: + default: return nil, false, fmt.Errorf("unexpected list arg type (%v) for key %s", supplied.Type, name) } if len(supplied.Values) == 0 { diff --git a/go/vt/sqlparser/parsed_query_test.go b/go/vt/sqlparser/parsed_query_test.go index 1458a3e6527..26b9855b0f0 100644 --- a/go/vt/sqlparser/parsed_query_test.go +++ b/go/vt/sqlparser/parsed_query_test.go @@ -103,6 +103,13 @@ func TestGenerateQuery(t *testing.T) { "vals": sqltypes.Int64BindVariable(1), }, output: "unexpected list arg type (INT64) for key vals", + }, { + desc: "row tuple", + query: "select 1 from (values ::a) dt", + bindVars: map[string]*querypb.BindVariable{ + "a": createRowTupleBV(), + }, + output: "select 1 from (values row('a', 1), row('b', 2)) as dt", }, { desc: "list bind var for non-list", query: "select * from a where id = :vals", @@ -302,3 +309,12 @@ func TestCastBindVars(t *testing.T) { }) } } + +func createRowTupleBV() *querypb.BindVariable { + v1 := sqltypes.TestTuple(sqltypes.NewVarChar("a"), sqltypes.NewInt64(1)) + v2 := sqltypes.TestTuple(sqltypes.NewVarChar("b"), sqltypes.NewInt64(2)) + return &querypb.BindVariable{ + Type: querypb.Type_ROW_TUPLE, + Values: append([]*querypb.Value{sqltypes.ValueToProto(v1)}, sqltypes.ValueToProto(v2)), + } +} diff --git a/go/vt/sqlparser/parser.go b/go/vt/sqlparser/parser.go index d4948396ae5..8af0018db2a 100644 --- a/go/vt/sqlparser/parser.go +++ b/go/vt/sqlparser/parser.go @@ -77,7 +77,7 @@ func yyParsePooled(yylex yyLexer) int { // error is ignored and the DDL is returned anyway. func (p *Parser) Parse2(sql string) (Statement, BindVars, error) { tokenizer := p.NewStringTokenizer(sql) - if yyParsePooled(tokenizer) != 0 { + if yyParsePooled(tokenizer) != 0 || tokenizer.LastError != nil { if tokenizer.partialDDL != nil { if typ, val := tokenizer.Scan(); typ != 0 { return nil, nil, fmt.Errorf("extra characters encountered after end of DDL: '%s'", val) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index befd9b44c3b..0b63bdae731 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1538,249 +1538,548 @@ var yyExca = [...]int{ 17, 49, -2, 40, -1, 52, - 1, 157, - 752, 157, - -2, 165, + 1, 160, + 752, 160, + -2, 168, -1, 53, - 149, 165, - 191, 165, - 364, 165, - -2, 523, + 149, 168, + 191, 168, + 364, 168, + -2, 526, -1, 61, - 38, 784, - 254, 784, - 265, 784, - 300, 798, - 301, 798, - -2, 786, + 38, 787, + 254, 787, + 265, 787, + 300, 801, + 301, 801, + -2, 789, -1, 66, - 256, 822, - -2, 820, - -1, 122, - 253, 1621, - -2, 131, + 256, 825, + -2, 823, -1, 124, - 1, 158, - 752, 158, - -2, 165, - -1, 135, - 150, 408, - 259, 408, - -2, 512, - -1, 154, - 149, 165, - 191, 165, - 364, 165, - -2, 532, - -1, 749, + 253, 1630, + -2, 134, + -1, 126, + 1, 161, + 752, 161, + -2, 168, + -1, 137, + 150, 411, + 259, 411, + -2, 515, + -1, 156, + 149, 168, + 191, 168, + 364, 168, + -2, 535, + -1, 751, 177, 41, -2, 43, - -1, 958, - 95, 1638, - -2, 1482, - -1, 959, - 95, 1639, - 236, 1643, - -2, 1483, -1, 960, - 236, 1642, + 95, 1647, + -2, 1485, + -1, 961, + 95, 1648, + 236, 1652, + -2, 1486, + -1, 962, + 236, 1651, -2, 42, - -1, 1044, - 65, 896, - -2, 909, - -1, 1132, - 264, 1109, - 269, 1109, - -2, 419, - -1, 1217, - 1, 580, - 752, 580, - -2, 165, - -1, 1528, - 236, 1643, - -2, 1483, - -1, 1740, - 65, 897, - -2, 913, - -1, 1741, - 65, 898, - -2, 914, - -1, 1801, - 149, 165, - 191, 165, - 364, 165, - -2, 458, - -1, 1884, - 150, 408, - 259, 408, - -2, 512, - -1, 1893, - 264, 1110, - 269, 1110, - -2, 420, - -1, 2342, - 236, 1647, - -2, 1641, - -1, 2343, - 236, 1643, - -2, 1639, - -1, 2446, - 149, 165, - 191, 165, - 364, 165, - -2, 459, - -1, 2453, - 28, 186, - -2, 188, - -1, 2917, - 86, 96, - 96, 96, - -2, 976, - -1, 2985, - 727, 702, - -2, 676, - -1, 3210, - 55, 1586, - -2, 1580, - -1, 4047, - 727, 702, - -2, 690, - -1, 4139, - 98, 634, - 104, 634, - 114, 634, - 193, 634, - 194, 634, - 195, 634, - 196, 634, - 197, 634, - 198, 634, - 199, 634, - 200, 634, - 201, 634, - 202, 634, - 203, 634, - 204, 634, - 205, 634, - 206, 634, - 207, 634, - 208, 634, - 209, 634, - 210, 634, - 211, 634, - 212, 634, - 213, 634, - 214, 634, - 215, 634, - 216, 634, - 217, 634, - 218, 634, - 219, 634, - 220, 634, - 221, 634, - 222, 634, - 223, 634, - 224, 634, - 225, 634, - 226, 634, - 227, 634, - 228, 634, - 229, 634, - 230, 634, - 231, 634, - 232, 634, - 233, 634, - 234, 634, - -2, 2019, + -1, 1048, + 65, 899, + -2, 912, + -1, 1137, + 264, 1112, + 269, 1112, + -2, 422, + -1, 1222, + 1, 583, + 752, 583, + -2, 168, + -1, 1533, + 236, 1652, + -2, 1486, + -1, 1746, + 65, 900, + -2, 916, + -1, 1747, + 65, 901, + -2, 917, + -1, 1812, + 149, 168, + 191, 168, + 364, 168, + -2, 461, + -1, 1895, + 150, 411, + 259, 411, + -2, 515, + -1, 1904, + 264, 1113, + 269, 1113, + -2, 423, + -1, 2353, + 236, 1656, + -2, 1650, + -1, 2354, + 236, 1652, + -2, 1648, + -1, 2459, + 149, 168, + 191, 168, + 364, 168, + -2, 462, + -1, 2466, + 28, 189, + -2, 191, + -1, 2932, + 86, 99, + 96, 99, + -2, 979, + -1, 3000, + 727, 705, + -2, 679, + -1, 3225, + 55, 1589, + -2, 1583, + -1, 4062, + 727, 705, + -2, 693, + -1, 4154, + 98, 637, + 104, 637, + 114, 637, + 193, 637, + 194, 637, + 195, 637, + 196, 637, + 197, 637, + 198, 637, + 199, 637, + 200, 637, + 201, 637, + 202, 637, + 203, 637, + 204, 637, + 205, 637, + 206, 637, + 207, 637, + 208, 637, + 209, 637, + 210, 637, + 211, 637, + 212, 637, + 213, 637, + 214, 637, + 215, 637, + 216, 637, + 217, 637, + 218, 637, + 219, 637, + 220, 637, + 221, 637, + 222, 637, + 223, 637, + 224, 637, + 225, 637, + 226, 637, + 227, 637, + 228, 637, + 229, 637, + 230, 637, + 231, 637, + 232, 637, + 233, 637, + 234, 637, + -2, 2028, } const yyPrivate = 57344 -const yyLast = 57002 +const yyLast = 55832 var yyAct = [...]int{ - 974, 3698, 3699, 87, 3697, 4137, 4214, 4028, 4118, 3361, - 4227, 4181, 4106, 3647, 4182, 969, 1285, 961, 3262, 2135, - 2014, 2443, 2170, 3269, 2371, 1283, 3497, 4010, 2147, 3933, - 3319, 3310, 3324, 3321, 3320, 3318, 3323, 3322, 2073, 3223, - 4008, 5, 3634, 2373, 3161, 3076, 3339, 3277, 2518, 753, - 3338, 3227, 3224, 3543, 962, 3221, 3740, 3050, 3537, 923, - 747, 3211, 2877, 3075, 1804, 2398, 2481, 781, 2414, 1760, - 748, 2951, 4079, 3032, 3368, 1861, 3527, 2417, 2982, 922, - 3341, 2505, 2486, 3565, 2952, 2549, 1042, 1164, 87, 163, - 1094, 927, 2953, 2431, 42, 1062, 1039, 743, 2883, 1069, - 1909, 2902, 2419, 2869, 41, 2418, 2853, 1042, 2327, 2294, - 2169, 2295, 2131, 3023, 2527, 149, 43, 1891, 2504, 2081, - 2406, 2488, 1104, 2944, 1122, 2566, 1127, 1793, 2919, 1773, - 2421, 1721, 2890, 1541, 2175, 100, 2106, 2095, 104, 105, - 1466, 1449, 1898, 2010, 1101, 1098, 3226, 763, 1133, 1870, - 1102, 2477, 1990, 1128, 1130, 1129, 2478, 1792, 1079, 1778, - 1081, 1051, 758, 1140, 750, 2399, 1743, 2183, 3735, 2202, - 1048, 2851, 1524, 85, 2072, 2022, 1061, 1041, 107, 1045, - 3727, 1500, 99, 1273, 167, 3554, 3498, 1883, 127, 125, - 126, 132, 1046, 1213, 1037, 133, 924, 1049, 1064, 751, - 1074, 84, 1545, 98, 1047, 106, 4215, 1281, 3635, 3307, - 1259, 740, 1073, 93, 2520, 2521, 2522, 4063, 1550, 2520, - 3005, 3004, 2564, 2973, 3627, 1036, 4164, 683, 3040, 3590, - 3041, 4059, 2368, 2369, 4058, 1054, 2088, 128, 2087, 1166, - 2086, 134, 2085, 4064, 1169, 2084, 1095, 3329, 2083, 2053, - 1229, 4158, 1183, 1184, 1185, 2849, 1188, 1189, 1190, 1191, - 3326, 2618, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1088, - 3207, 4185, 1089, 1055, 741, 2, 680, 1040, 681, 1764, - 1038, 1143, 95, 1975, 1119, 2553, 1762, 3702, 3702, 3329, - 1144, 2879, 4220, 725, 3165, 1111, 2392, 3327, 4237, 128, - 1170, 1173, 1174, 1118, 1117, 1116, 95, 4037, 95, 1765, - 1063, 1463, 1177, 1106, 1460, 2975, 1763, 4219, 4180, 1230, - 111, 112, 113, 1186, 116, 4059, 3333, 122, 725, 2552, - 191, 1483, 95, 675, 4205, 3501, 928, 3500, 4168, 4166, - 1035, 2395, 2394, 2995, 2998, 738, 739, 190, 4011, 3327, - 719, 1754, 2109, 2814, 2093, 1030, 1031, 1032, 1033, 1087, - 1091, 926, 1044, 4167, 4165, 3387, 4133, 128, 3929, 3928, - 129, 1168, 190, 1167, 977, 978, 979, 719, 3333, 977, - 978, 979, 3640, 3701, 3701, 3641, 172, 1451, 4195, 3939, - 1076, 1077, 1120, 4147, 86, 129, 1087, 1091, 926, 4162, - 3659, 3648, 4107, 4115, 2546, 86, 86, 3938, 719, 2625, - 2140, 172, 4142, 4145, 3413, 1872, 3012, 2850, 3013, 1462, - 714, 3259, 3260, 4151, 4152, 2551, 2438, 2439, 4119, 2893, - 3258, 1479, 2933, 3279, 3280, 1794, 1115, 1795, 1222, 1223, - 4146, 3330, 2065, 2066, 3039, 719, 169, 3658, 2928, 170, - 2622, 2927, 2437, 3022, 2929, 1278, 3754, 2894, 1254, 1255, - 1249, 1028, 1110, 1027, 1237, 1112, 4029, 2940, 699, 1238, - 1225, 169, 1250, 1243, 170, 189, 2018, 95, 719, 2623, - 1480, 697, 1481, 1482, 2456, 2455, 3365, 1212, 95, 95, - 719, 3395, 1237, 3330, 1113, 2370, 719, 1238, 3363, 4042, - 189, 2886, 2887, 1444, 4123, 1236, 2616, 1235, 3393, 4123, - 2068, 1790, 2064, 733, 737, 731, 3097, 3369, 2528, 3024, - 1187, 694, 1996, 1725, 1461, 4186, 3981, 3356, 3982, 2983, - 709, 3008, 2567, 2402, 2573, 3357, 1965, 86, 4217, 2592, - 88, 2593, 3278, 2594, 1991, 704, 4187, 1266, 1270, 1268, - 1450, 1252, 1253, 2569, 3281, 1443, 1275, 707, 2211, 1218, - 717, 1258, 2497, 3027, 1115, 720, 1107, 1256, 718, 1277, - 3913, 1251, 1244, 1109, 1108, 1276, 2619, 1257, 2620, 1501, - 1966, 3629, 1967, 3366, 3628, 2595, 2491, 1265, 1267, 2574, - 173, 1080, 720, 3625, 1142, 3364, 1142, 1193, 1192, 179, - 1153, 3384, 1151, 1502, 1503, 1504, 1505, 1506, 1507, 1508, - 1510, 1509, 1511, 1512, 2531, 173, 1728, 1123, 2019, 2571, - 95, 1124, 1113, 720, 179, 3281, 3706, 1114, 684, 2415, - 686, 700, 1124, 722, 1162, 721, 690, 1161, 688, 692, - 701, 693, 1160, 687, 4159, 698, 1159, 1158, 689, 702, - 703, 706, 710, 711, 712, 708, 705, 2203, 696, 723, - 720, 2570, 2205, 1157, 1156, 1155, 2210, 2206, 1150, 1876, - 2207, 2208, 2209, 1163, 2572, 2204, 2212, 2213, 2214, 2215, - 2216, 2217, 2218, 2219, 2220, 3098, 3540, 1099, 1090, 1084, - 1082, 1099, 1136, 720, 2976, 1097, 4238, 1141, 1263, 1141, - 4192, 1099, 1264, 1075, 1282, 720, 1282, 1282, 3624, 3164, - 1135, 720, 1269, 2580, 2576, 2578, 2579, 2577, 2581, 2582, - 2583, 2584, 2011, 1871, 3028, 1090, 1084, 1082, 164, 2400, - 2401, 2557, 3173, 2556, 2007, 1452, 1180, 1262, 3192, 2490, - 3190, 3301, 2000, 1791, 1998, 1999, 1997, 2001, 2002, 2003, - 1154, 3007, 1152, 164, 1869, 1114, 1042, 1525, 1530, 1531, - 1868, 1534, 1536, 1537, 1538, 1539, 1540, 1867, 1543, 1544, - 1546, 1546, 3010, 1546, 1546, 1551, 1551, 1551, 1554, 1555, - 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, - 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 976, 3713, 3714, 87, 3712, 4229, 4133, 2456, 4043, 2158, + 964, 2382, 3376, 4242, 4121, 4025, 3662, 4196, 971, 2146, + 4197, 963, 3277, 3284, 1290, 3948, 3334, 4152, 3339, 3336, + 3512, 3335, 1288, 3325, 3238, 4023, 3333, 3338, 3337, 3091, + 3649, 2384, 1815, 2084, 3176, 3354, 5, 2531, 2025, 3292, + 3353, 755, 3242, 3239, 3558, 3552, 3065, 3755, 3226, 3090, + 749, 2892, 1872, 925, 783, 924, 2966, 3356, 750, 2494, + 3047, 1766, 2430, 2967, 3383, 2997, 2499, 2518, 3542, 4094, + 2411, 2968, 2427, 2444, 2562, 165, 1046, 1169, 87, 1067, + 2431, 1043, 2898, 2917, 1074, 2882, 2866, 929, 1099, 2142, + 42, 1145, 2180, 2306, 1920, 3580, 3038, 2432, 1902, 1046, + 2305, 2540, 2338, 41, 2517, 43, 2905, 2092, 151, 2501, + 2959, 3236, 2419, 2579, 1109, 1132, 1127, 1804, 2934, 1784, + 978, 102, 106, 1770, 107, 2434, 1727, 1546, 2186, 2106, + 1471, 2117, 1454, 2021, 1909, 1103, 765, 3241, 1106, 1135, + 1881, 1138, 2001, 1107, 2490, 1133, 1134, 1803, 1084, 1789, + 2491, 1086, 2412, 760, 752, 1055, 1749, 2194, 3750, 2213, + 1052, 1529, 2864, 85, 109, 2033, 2083, 1278, 169, 3513, + 3742, 1505, 1066, 1045, 129, 1049, 127, 128, 3569, 1894, + 134, 101, 135, 1218, 1079, 1041, 1053, 1555, 1550, 753, + 84, 1050, 108, 1051, 100, 4230, 1069, 1286, 926, 1078, + 1264, 3650, 93, 2533, 2534, 2535, 2533, 742, 3322, 4078, + 3020, 3019, 2577, 2988, 685, 4179, 3642, 1040, 1986, 1772, + 3055, 130, 3056, 1059, 4074, 2379, 2380, 1472, 2099, 4073, + 1149, 1171, 1174, 136, 2098, 4079, 3605, 1100, 2097, 2096, + 2095, 2094, 2064, 1234, 1188, 1189, 1190, 2862, 1193, 1194, + 1195, 1196, 1182, 2631, 1199, 1200, 1201, 1202, 1203, 1204, + 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, + 1215, 1094, 1093, 4173, 1057, 2, 1044, 1042, 1148, 682, + 743, 683, 3222, 1124, 1060, 1775, 1773, 2566, 4200, 3344, + 3717, 4252, 4235, 1488, 1116, 130, 2403, 1175, 1178, 1179, + 727, 1123, 2894, 1122, 1121, 4052, 3717, 2990, 1111, 3180, + 4195, 1068, 4183, 4181, 3344, 1776, 1774, 4234, 4220, 113, + 114, 115, 1191, 118, 3516, 1768, 124, 3341, 727, 193, + 4074, 2565, 677, 3515, 977, 1482, 2408, 4182, 4180, 2407, + 1235, 3013, 1039, 4026, 740, 741, 2827, 3010, 1468, 3342, + 2104, 1465, 721, 1760, 1034, 1035, 1036, 1037, 192, 95, + 3402, 1048, 4148, 130, 3944, 3943, 3655, 1173, 1172, 3656, + 4210, 3954, 86, 4177, 3342, 86, 3674, 721, 3348, 86, + 1456, 131, 1092, 1096, 928, 3663, 3716, 4122, 2151, 4130, + 2559, 1081, 1082, 3953, 1125, 2908, 4157, 174, 980, 981, + 982, 3428, 3716, 3348, 1883, 980, 981, 982, 2943, 3274, + 3275, 2942, 2863, 2638, 2944, 2451, 2452, 1805, 3673, 1806, + 716, 2076, 2077, 2909, 3273, 1115, 97, 3054, 1117, 2635, + 3769, 721, 1271, 1120, 1273, 1227, 1228, 2450, 3037, 1254, + 1032, 1031, 1485, 2948, 1486, 1487, 4044, 2991, 1478, 1242, + 2955, 1470, 4134, 2564, 1243, 95, 1467, 171, 95, 1255, + 172, 1484, 95, 1259, 1260, 1248, 3410, 1230, 701, 1242, + 1283, 2029, 1270, 1272, 1243, 721, 4162, 3380, 1472, 2469, + 2468, 699, 1241, 2636, 1240, 3408, 191, 1449, 1217, 721, + 2629, 1118, 3378, 3345, 2901, 2902, 4160, 3112, 2381, 721, + 2075, 735, 2079, 739, 733, 3384, 4166, 4167, 86, 2510, + 1801, 88, 3039, 3996, 3066, 3997, 3294, 3295, 3345, 2998, + 2541, 696, 1506, 4161, 1731, 1976, 3371, 1120, 4138, 1112, + 711, 3023, 2415, 2504, 3372, 4138, 1114, 1113, 2586, 2580, + 4232, 1192, 4201, 1455, 3399, 706, 1507, 1508, 1509, 1510, + 1511, 1512, 1513, 1515, 1514, 1516, 1517, 709, 1256, 97, + 719, 1466, 2584, 4202, 1249, 2002, 1275, 722, 720, 1977, + 1448, 1978, 1261, 2605, 3381, 2606, 1280, 2607, 2632, 1263, + 2633, 3042, 1262, 1268, 1282, 1118, 1482, 1269, 3644, 3379, + 1281, 95, 722, 2587, 1257, 1258, 1223, 1274, 3068, 3643, + 2608, 175, 2582, 3027, 2583, 3028, 3928, 1147, 1198, 1197, + 181, 3640, 1147, 2030, 1085, 1520, 1128, 2585, 2544, 1158, + 1129, 3721, 1267, 2428, 1119, 3293, 1129, 1167, 686, 1140, + 688, 702, 1166, 724, 1165, 723, 692, 3296, 690, 694, + 703, 695, 1164, 689, 1163, 700, 722, 1162, 691, 704, + 705, 708, 712, 713, 714, 710, 707, 1520, 698, 725, + 1161, 1160, 1155, 1734, 1887, 1168, 3113, 3555, 3296, 4253, + 1104, 4207, 3078, 3077, 3076, 1141, 4174, 3070, 1104, 3074, + 1104, 3069, 1102, 3067, 2022, 1177, 2503, 1882, 3072, 1080, + 722, 1140, 1092, 1096, 928, 1176, 3043, 3071, 2570, 1478, + 2569, 3059, 2018, 1457, 722, 1185, 1287, 3316, 1287, 1287, + 1146, 1095, 1089, 1087, 722, 1146, 3073, 3075, 1119, 3022, + 4175, 1880, 1879, 1878, 3179, 3008, 3639, 2019, 2413, 2414, + 2593, 2589, 2591, 2592, 2590, 2594, 2595, 2596, 2597, 166, + 1876, 721, 1802, 2653, 1477, 1474, 1475, 1476, 1481, 1483, + 1480, 3207, 1479, 2992, 1233, 676, 3205, 4039, 1046, 1530, + 1535, 1536, 1473, 1539, 1541, 1542, 1543, 1544, 1545, 1159, + 1548, 1549, 1551, 1551, 3594, 1551, 1551, 1556, 1556, 1556, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, + 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, + 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, + 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, + 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, + 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1527, 4051, 1276, 2989, 1683, 1445, + 1685, 1686, 1687, 1688, 1689, 1446, 1447, 1988, 1987, 1989, + 1990, 1991, 1556, 1556, 1556, 1556, 1556, 1556, 1540, 1126, + 1772, 3672, 4246, 2563, 726, 3603, 3604, 1696, 1697, 1698, + 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, + 1709, 1523, 1524, 1525, 1526, 717, 722, 94, 3012, 3025, + 94, 1537, 4097, 1156, 94, 3400, 3715, 1531, 3346, 3347, + 718, 1552, 1229, 1553, 1554, 1557, 1558, 3556, 167, 3500, + 4136, 3350, 3715, 89, 2637, 179, 1226, 4136, 1088, 2636, + 1239, 1147, 1147, 3346, 3347, 1477, 1474, 1475, 1476, 1481, + 1483, 1480, 3011, 1479, 3046, 1908, 3350, 95, 3188, 2561, + 3576, 4165, 4135, 1473, 3036, 1464, 2939, 3035, 1724, 4135, + 2507, 1095, 1089, 1087, 1730, 2904, 187, 1238, 1759, 1244, + 1245, 1246, 1247, 1046, 1147, 2867, 2869, 1046, 721, 1521, + 1522, 2839, 2154, 1046, 1793, 1147, 1684, 1252, 1232, 3187, + 2899, 126, 684, 1284, 1285, 4164, 1221, 2457, 1520, 3272, + 1517, 2508, 2007, 2664, 1720, 1760, 1063, 2195, 2506, 168, + 173, 170, 176, 177, 178, 180, 182, 183, 184, 185, + 1721, 2415, 2178, 1500, 2196, 186, 188, 189, 190, 1279, + 1265, 2034, 1184, 94, 1146, 1146, 121, 4065, 1170, 3635, + 1150, 1140, 2509, 1237, 1147, 1152, 3568, 2581, 2088, 1153, + 1151, 2015, 2505, 1157, 1907, 1807, 2187, 2523, 3086, 1690, + 1691, 1692, 1693, 1694, 1695, 1740, 2187, 1741, 2673, 106, + 1738, 107, 1486, 1487, 1742, 2006, 4211, 1146, 1487, 3764, + 1045, 3610, 3609, 1140, 1143, 1144, 2548, 1104, 1146, 2664, + 1721, 1137, 1141, 1917, 1140, 1143, 1144, 1728, 1104, 1916, + 3049, 1906, 1137, 1141, 4244, 3048, 2558, 4245, 2556, 4243, + 1158, 109, 1136, 1156, 122, 3049, 1488, 2553, 1771, 4203, + 3048, 2170, 2159, 2160, 2161, 2162, 2172, 2163, 2164, 2165, + 2177, 2173, 2166, 2167, 2174, 2175, 2176, 2168, 2169, 2171, + 4057, 3595, 1884, 1885, 1886, 1058, 3669, 1146, 3670, 2868, + 1488, 2122, 1150, 1140, 1736, 1147, 2560, 1152, 1120, 1216, + 2557, 1153, 1151, 2193, 1900, 2123, 1518, 1519, 2121, 1488, + 1739, 2222, 1762, 1971, 2700, 1910, 1910, 1042, 1725, 4248, + 1893, 1765, 1154, 1044, 1912, 1737, 1222, 2027, 1266, 2035, + 1922, 2181, 1923, 722, 1925, 1927, 1488, 1236, 1931, 1933, + 1935, 1937, 1939, 1251, 4254, 1287, 1798, 1799, 1953, 1961, + 1962, 95, 1867, 3936, 1253, 1967, 1968, 2413, 2414, 1911, + 2660, 2343, 2011, 1220, 2009, 2010, 2008, 2012, 2013, 2014, + 2003, 2120, 2004, 2553, 1875, 2005, 3935, 1488, 1088, 1510, + 1511, 1512, 1513, 1515, 1514, 1516, 1517, 1903, 3926, 4098, + 1890, 1891, 3686, 1889, 2110, 2111, 2108, 2109, 1146, 3685, + 1183, 3958, 1743, 3617, 1180, 1485, 745, 1486, 1487, 1760, + 2214, 980, 981, 982, 3088, 2216, 2555, 2192, 1957, 2221, + 2217, 2107, 3616, 2218, 2219, 2220, 4031, 1914, 2215, 2223, + 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 4099, 1485, + 4255, 1486, 1487, 2023, 1508, 1509, 1510, 1511, 1512, 1513, + 1515, 1514, 1516, 1517, 1949, 3606, 1996, 1952, 1485, 1954, + 1486, 1487, 3280, 1512, 1513, 1515, 1514, 1516, 1517, 4216, + 1760, 130, 3323, 1219, 1488, 4032, 1994, 1123, 1506, 1122, + 1121, 1502, 1983, 1503, 3312, 1485, 2964, 1486, 1487, 1119, + 2110, 2111, 2643, 2644, 2963, 2962, 2040, 1504, 1518, 1519, + 1501, 2513, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, + 1514, 1516, 1517, 3281, 727, 1287, 1287, 1997, 1981, 1488, + 2343, 2036, 2037, 2062, 2340, 192, 1485, 1995, 1486, 1487, + 1980, 87, 1979, 2342, 87, 2041, 2993, 1488, 3283, 1969, + 1963, 1960, 2048, 2049, 2050, 2420, 2421, 1993, 131, 975, + 153, 2669, 2061, 1982, 1959, 1958, 1929, 1735, 3278, 3600, + 3375, 727, 1488, 192, 174, 1494, 1495, 1496, 1497, 1498, + 1499, 1493, 1490, 2946, 2957, 727, 4204, 1451, 3294, 3295, + 2529, 2527, 2528, 2526, 1801, 3279, 131, 1507, 1508, 1509, + 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 164, 2525, + 4060, 2524, 174, 4059, 152, 4035, 2712, 112, 1506, 4034, + 2149, 2149, 2150, 2147, 2147, 1488, 1484, 1760, 111, 3285, + 110, 2888, 4231, 1485, 171, 1486, 1487, 172, 42, 2668, + 2112, 42, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, + 1514, 1516, 1517, 4191, 1760, 1760, 103, 1778, 4033, 1896, + 1897, 163, 162, 191, 4214, 1760, 104, 3931, 2233, 2888, + 1760, 4053, 171, 1484, 1760, 172, 2888, 4129, 1485, 2038, + 1486, 1487, 2888, 4108, 2888, 4104, 2042, 3915, 2044, 2045, + 2046, 2047, 4016, 1760, 3963, 2051, 1485, 3293, 1486, 1487, + 1488, 191, 103, 1760, 95, 3914, 1779, 2063, 105, 3296, + 3763, 85, 104, 1506, 85, 3058, 3761, 4144, 1760, 1720, + 2089, 1485, 3682, 1486, 1487, 1719, 2182, 1760, 2119, 3653, + 4050, 1488, 2069, 2070, 1718, 1721, 1488, 1507, 1508, 1509, + 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 2125, 1717, + 2127, 2128, 2129, 2130, 2131, 2132, 2134, 2136, 2137, 2138, + 2139, 2140, 2141, 3614, 2124, 157, 1898, 160, 3599, 1895, + 3385, 158, 159, 1760, 1485, 3962, 1486, 1487, 175, 1488, + 3382, 2257, 2153, 1488, 2126, 3939, 1760, 181, 3315, 2353, + 2888, 3927, 4142, 1760, 3653, 1760, 3919, 2351, 3314, 1488, + 2888, 3651, 2553, 1760, 1548, 3574, 1760, 1488, 2197, 2198, + 2199, 2200, 3040, 2352, 1506, 2973, 175, 2341, 2960, 1531, + 2339, 1716, 2211, 4140, 1760, 181, 1710, 2232, 4009, 1760, + 3282, 1506, 2626, 2652, 2618, 2249, 2714, 2188, 1507, 1508, + 1509, 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 1485, + 2617, 1486, 1487, 2406, 1488, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1515, 1514, 1516, 1517, 2350, 2794, 1760, 2356, + 2357, 4007, 1760, 3305, 3304, 4004, 1760, 3302, 3303, 2436, + 1485, 2662, 1486, 1487, 112, 1485, 2575, 1486, 1487, 2574, + 106, 2661, 107, 3300, 3301, 111, 2410, 110, 2353, 3986, + 1760, 3300, 3299, 2466, 105, 105, 2351, 1488, 2914, 1760, + 2636, 3021, 106, 2386, 107, 1488, 166, 1871, 3002, 3918, + 2398, 2387, 2425, 2995, 2996, 3661, 2118, 2065, 1485, 2031, + 1486, 1487, 1485, 1488, 1486, 1487, 2888, 2887, 2906, 2885, + 1488, 2152, 1760, 2935, 1992, 1488, 3541, 1760, 1485, 1984, + 1486, 1487, 1109, 105, 166, 1974, 1485, 1970, 1486, 1487, + 1488, 1966, 1965, 2470, 1964, 2471, 2472, 2473, 2474, 1760, + 1760, 1871, 1870, 2935, 1059, 1780, 2438, 1277, 2460, 2480, + 1813, 1812, 2482, 2483, 2484, 2485, 1109, 2475, 2476, 2477, + 2478, 3267, 2461, 2374, 3571, 2399, 111, 2442, 3237, 3534, + 1760, 2636, 2392, 1485, 2393, 1486, 1487, 3531, 1760, 3567, + 2401, 2936, 161, 2999, 2978, 2914, 2496, 2883, 2913, 2464, + 2465, 2938, 1488, 2554, 3567, 3529, 1760, 2542, 2502, 2906, + 2423, 1488, 3492, 1760, 1484, 4092, 4064, 3490, 1760, 2447, + 2448, 2936, 2446, 1094, 1093, 2888, 2914, 3520, 3302, 2463, + 2462, 2636, 3486, 1760, 3210, 1488, 1485, 2449, 1486, 1487, + 1488, 2794, 3570, 2697, 1485, 2696, 1486, 1487, 1488, 2553, + 1484, 2536, 3286, 1488, 1047, 2512, 3290, 2418, 2539, 2914, + 1149, 3618, 1485, 3289, 1486, 1487, 1488, 2553, 2405, 1485, + 1910, 1486, 1487, 2497, 1485, 2547, 1486, 1487, 2550, 2493, + 2551, 2486, 2488, 2489, 1764, 2511, 3567, 2516, 2515, 1485, + 2377, 1486, 1487, 2152, 3483, 1760, 2090, 3291, 2074, 2017, + 1800, 154, 3287, 3589, 155, 97, 1131, 3288, 1148, 2497, + 1945, 2567, 1130, 2549, 2546, 2545, 4170, 2571, 3619, 3620, + 3621, 2572, 2573, 4111, 3950, 2568, 3377, 3481, 1760, 1767, + 3916, 3951, 3479, 1760, 3776, 167, 3634, 95, 3631, 2510, + 3477, 1760, 179, 3612, 3326, 3475, 1760, 3433, 1488, 1761, + 1763, 1485, 3432, 1486, 1487, 1873, 2495, 1488, 3473, 1760, + 1485, 1488, 1486, 1487, 3373, 2641, 1488, 1946, 1947, 1948, + 3328, 2969, 3324, 167, 1046, 1046, 1046, 2578, 3003, 2492, + 179, 2487, 2481, 187, 1485, 1488, 1486, 1487, 2479, 1485, + 1999, 1486, 1487, 1488, 1541, 1905, 1541, 1485, 1901, 1486, + 1487, 1488, 1485, 2390, 1486, 1487, 1716, 3417, 1869, 123, + 1488, 1714, 2656, 2970, 1221, 1485, 1712, 1486, 1487, 1713, + 1711, 187, 1715, 2611, 4226, 2970, 168, 173, 170, 176, + 177, 178, 180, 182, 183, 184, 185, 1488, 2067, 2353, + 3471, 1760, 186, 188, 189, 190, 1488, 2659, 4224, 3469, + 1760, 3581, 3582, 3467, 1760, 1488, 4198, 4072, 3465, 1760, + 3991, 3584, 1488, 2352, 168, 173, 170, 176, 177, 178, + 180, 182, 183, 184, 185, 1488, 3320, 2628, 1760, 1488, + 186, 188, 189, 190, 3319, 3463, 1760, 3318, 3237, 2982, + 1488, 2634, 2612, 3461, 1760, 4068, 3259, 1485, 1722, 1486, + 1487, 3260, 3459, 1760, 3587, 2068, 1485, 2642, 1486, 1487, + 1485, 1782, 1486, 1487, 3257, 1485, 3586, 1486, 1487, 3258, + 2645, 2646, 2647, 2648, 1488, 3622, 1777, 3256, 2119, 3457, + 1760, 3255, 3952, 2409, 1485, 681, 1486, 1487, 3455, 1760, + 1061, 1488, 1485, 2396, 1486, 1487, 1941, 2649, 1760, 2651, + 1485, 3575, 1486, 1487, 3453, 1760, 1488, 3215, 2654, 1485, + 2655, 1486, 1487, 1488, 3741, 3214, 3740, 3439, 1760, 1488, + 2710, 3415, 1760, 1488, 3261, 4030, 2923, 2924, 3623, 3624, + 3625, 3754, 1781, 2650, 2672, 1488, 1485, 3756, 1486, 1487, + 1488, 1062, 2016, 3227, 3229, 1485, 3563, 1486, 1487, 1942, + 1943, 1944, 3230, 1488, 1485, 3224, 1486, 1487, 1030, 744, + 1488, 1485, 2838, 1486, 1487, 3560, 2859, 1760, 3298, 3739, + 2953, 2657, 2974, 3559, 1485, 2604, 1486, 1487, 1485, 2195, + 1486, 1487, 2603, 2857, 1760, 1488, 2826, 1064, 2602, 1485, + 2708, 1486, 1487, 1187, 2870, 1065, 2196, 2620, 2621, 1760, + 1073, 1488, 2623, 2601, 2600, 2832, 1760, 2115, 2113, 2114, + 2599, 2624, 4205, 1046, 1072, 2809, 1760, 2149, 2873, 2598, + 2147, 1488, 1186, 1485, 3393, 1486, 1487, 2801, 1760, 1488, + 2969, 103, 2792, 1760, 1488, 3052, 1450, 2871, 2911, 2912, + 1485, 104, 1486, 1487, 3009, 2790, 1760, 2436, 131, 3565, + 1046, 2931, 2777, 1760, 105, 1485, 4240, 1486, 1487, 2874, + 2986, 2876, 1485, 103, 1486, 1487, 2420, 2421, 1485, 105, + 1486, 1487, 1485, 104, 1486, 1487, 2118, 2775, 1760, 2615, + 4147, 2910, 1488, 4049, 1485, 3946, 1486, 1487, 3297, 1485, + 2927, 1486, 1487, 2773, 1760, 2402, 3543, 2640, 2073, 1488, + 3213, 2891, 1485, 2072, 1486, 1487, 1488, 110, 3212, 1485, + 1488, 1486, 1487, 2771, 1760, 4015, 4014, 2900, 112, 2929, + 1488, 2769, 1760, 1728, 2861, 111, 2767, 1760, 1488, 111, + 3751, 110, 1488, 3994, 1485, 42, 1486, 1487, 3762, 2881, + 3760, 3759, 3752, 1488, 2928, 3632, 1771, 2930, 1488, 2889, + 1485, 2906, 1486, 1487, 3564, 2949, 3562, 3329, 2903, 2886, + 1721, 2537, 2956, 2958, 1888, 3007, 112, 3553, 1071, 2933, + 1485, 3725, 1486, 1487, 2765, 1760, 2885, 111, 1485, 3116, + 1486, 1487, 2937, 1485, 2698, 1486, 1487, 2940, 2502, 3018, + 2388, 2763, 1760, 1488, 1794, 2947, 1786, 2950, 2761, 1760, + 2190, 2972, 2759, 1760, 4227, 2191, 2975, 2976, 4228, 4227, + 116, 117, 2961, 4048, 4228, 1488, 112, 4036, 3598, 2087, + 2757, 1760, 10, 2085, 2755, 1760, 9, 111, 1488, 110, + 2971, 1485, 1488, 1486, 1487, 2753, 1760, 105, 1488, 3, + 2751, 1760, 1488, 2253, 2983, 2984, 2985, 2979, 1485, 2980, + 1486, 1487, 99, 1, 3015, 1485, 1488, 1486, 1487, 1485, + 2086, 1486, 1487, 8, 1038, 1893, 1453, 3004, 3005, 1485, + 1452, 1486, 1487, 3602, 3062, 3063, 1488, 1485, 4159, 1486, + 1487, 1485, 697, 1486, 1487, 2749, 1760, 2378, 1726, 3014, + 4199, 4155, 1485, 1488, 1486, 1487, 4156, 1485, 1985, 1486, + 1487, 1975, 3664, 2304, 1488, 3947, 3332, 2747, 1760, 2543, + 1488, 2919, 2922, 2923, 2924, 2920, 1488, 2921, 2925, 3041, + 2745, 1760, 1488, 2336, 2743, 1760, 1488, 3630, 3079, 2500, + 3536, 3060, 1488, 1139, 2738, 1760, 156, 2458, 1488, 3044, + 2459, 4124, 1485, 1488, 1486, 1487, 120, 1097, 2734, 1760, + 119, 1142, 1250, 2368, 3097, 3098, 3099, 3100, 3101, 3102, + 3103, 3104, 3105, 3106, 1485, 1488, 1486, 1487, 2732, 1760, + 1761, 2375, 3080, 2538, 3114, 3654, 2954, 1485, 2467, 1486, + 1487, 1485, 1819, 1486, 1487, 2725, 1760, 1485, 3016, 1486, + 1487, 1485, 1817, 1486, 1487, 1818, 2723, 1760, 1816, 1821, + 1820, 4096, 3401, 3923, 2699, 1485, 3499, 1486, 1487, 3636, + 2078, 2400, 734, 1722, 3532, 1488, 2926, 728, 3498, 194, + 1808, 1787, 3118, 2071, 3494, 1485, 1488, 1486, 1487, 1181, + 3430, 3064, 687, 3306, 2576, 3429, 693, 1538, 3174, 3081, + 3050, 2066, 1485, 3051, 1486, 1487, 3211, 2941, 1091, 1083, + 2389, 2875, 1090, 1485, 2994, 1486, 1487, 3421, 3924, 1485, + 2247, 1486, 1487, 3061, 3245, 1485, 3557, 1486, 1487, 3223, + 3225, 1485, 2893, 1486, 1487, 1485, 3228, 1486, 1487, 3181, + 3221, 1485, 3192, 1486, 1487, 4029, 3183, 1485, 3753, 1486, + 1487, 4109, 1485, 2951, 1486, 1487, 2436, 1488, 1783, 3519, + 3107, 2341, 1488, 2341, 2339, 2671, 2339, 3419, 3154, 2185, + 1528, 759, 1488, 2435, 1485, 930, 1486, 1487, 1769, 2965, + 3244, 1488, 87, 2514, 3720, 2436, 2436, 2436, 2436, 2436, + 2105, 3164, 3165, 3166, 3167, 3168, 757, 756, 754, 2877, + 2330, 2331, 2332, 2333, 2334, 2436, 2907, 3192, 2436, 1492, + 1491, 3191, 965, 3182, 3266, 3184, 2865, 2355, 3249, 1795, + 2358, 2359, 2918, 1488, 1485, 2916, 1486, 1487, 3219, 2915, + 2613, 2443, 3203, 3583, 2027, 1485, 3579, 1486, 1487, 3204, + 3206, 3208, 1488, 4151, 2437, 3209, 2433, 3216, 3218, 2855, + 2884, 916, 915, 2438, 2854, 766, 2376, 758, 3231, 3232, + 748, 979, 1488, 914, 2850, 913, 3359, 1488, 3360, 3217, + 3024, 3349, 3374, 2849, 3026, 3250, 2952, 3268, 3253, 1049, + 3269, 3357, 2438, 2438, 2438, 2438, 2438, 3248, 106, 3262, + 107, 1488, 3270, 3251, 3252, 1050, 3254, 1051, 1488, 3370, + 1469, 1745, 2438, 1488, 3276, 2438, 1485, 1748, 1486, 1487, + 2397, 1485, 3309, 1486, 1487, 2848, 1488, 1110, 3398, 3308, + 3307, 1485, 4055, 1486, 1487, 2639, 3427, 3310, 3311, 1744, + 1485, 4062, 1486, 1487, 2847, 3340, 1488, 3648, 3321, 3000, + 2530, 69, 46, 1488, 3361, 3358, 3362, 1488, 4024, 3351, + 2502, 4093, 908, 905, 2846, 3722, 1488, 3723, 3234, 2845, + 3368, 3724, 3177, 3178, 3330, 4075, 4076, 904, 4077, 2242, + 1463, 1488, 1485, 1460, 1486, 1487, 4172, 2080, 98, 1488, + 36, 35, 3389, 2836, 34, 3388, 3386, 3240, 1488, 33, + 2835, 1485, 3240, 1486, 1487, 2834, 32, 3396, 26, 3403, + 3404, 25, 3405, 24, 23, 3407, 22, 3409, 2833, 3411, + 3406, 1485, 29, 1486, 1487, 19, 1485, 21, 1486, 1487, + 20, 18, 3422, 3423, 3424, 3425, 3426, 3343, 2830, 4194, + 4239, 125, 55, 52, 50, 2825, 133, 132, 53, 2818, + 1485, 49, 1486, 1487, 1224, 47, 96, 1485, 2817, 1486, + 1487, 31, 1485, 30, 1486, 1487, 1541, 17, 16, 15, + 1541, 14, 2658, 2816, 13, 1485, 2663, 1486, 1487, 12, + 11, 2815, 7, 6, 39, 38, 3544, 3331, 3546, 37, + 2814, 28, 27, 40, 4, 1485, 3514, 1486, 1487, 2666, + 2987, 2667, 1485, 3518, 1486, 1487, 1485, 2675, 1486, 1487, + 2532, 2677, 2678, 0, 0, 1485, 0, 1486, 1487, 0, + 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, + 1485, 2695, 1486, 1487, 3243, 0, 0, 0, 1485, 3397, + 1486, 1487, 0, 0, 0, 0, 0, 1485, 2436, 1486, + 1487, 3549, 0, 0, 2701, 2702, 2703, 2704, 0, 2706, + 2707, 3596, 2709, 3554, 3561, 3545, 2711, 3547, 0, 0, + 2716, 2717, 0, 2718, 0, 1488, 2721, 2722, 2724, 2726, + 2727, 2728, 2729, 2730, 2731, 2733, 2735, 2736, 2737, 2739, + 3352, 2741, 2742, 2744, 2746, 2748, 2750, 2752, 2754, 2756, + 2758, 2760, 2762, 2764, 2766, 2768, 2770, 2772, 2774, 2776, + 2778, 2779, 2780, 3551, 2782, 3588, 2784, 746, 2786, 2787, + 3591, 2789, 2791, 2793, 3361, 3358, 3362, 2796, 3597, 3590, + 3521, 2800, 3523, 3524, 3525, 2805, 2806, 2807, 2808, 3585, + 3566, 1488, 0, 0, 1729, 2438, 3578, 1488, 2819, 2820, + 2821, 2822, 2823, 2824, 3658, 3659, 2828, 2829, 3607, 3608, + 3613, 0, 3615, 0, 2831, 3592, 3593, 2813, 1488, 2837, + 0, 0, 0, 0, 2840, 2841, 2842, 2843, 2844, 0, + 1488, 3391, 3392, 0, 1488, 2851, 2852, 0, 2853, 0, + 1488, 2856, 2858, 2400, 1488, 2860, 0, 0, 0, 0, + 0, 0, 0, 679, 0, 2872, 0, 0, 1488, 0, + 3641, 0, 1488, 0, 3645, 3646, 3647, 1506, 1488, 0, + 0, 3660, 0, 1033, 1485, 2890, 1486, 1487, 1070, 1488, + 0, 1076, 1076, 2812, 0, 0, 2679, 0, 0, 2811, + 0, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, 1514, + 1516, 1517, 0, 2694, 0, 1488, 0, 0, 0, 0, + 2810, 1488, 0, 0, 0, 3676, 0, 1105, 0, 0, + 0, 0, 2804, 1488, 3687, 0, 2803, 0, 0, 0, + 1488, 0, 2802, 0, 1488, 0, 2799, 0, 0, 0, + 1485, 1488, 1486, 1487, 0, 0, 1485, 0, 1486, 1487, + 2798, 0, 0, 1488, 2797, 0, 0, 1488, 0, 0, + 2795, 3728, 0, 3729, 3730, 3731, 1488, 1485, 0, 1486, + 1487, 2788, 1488, 3738, 0, 0, 3745, 0, 3747, 1485, + 0, 1486, 1487, 1485, 1488, 1486, 1487, 3718, 0, 1485, + 3748, 1486, 1487, 1485, 0, 1486, 1487, 2785, 0, 0, + 0, 3244, 0, 2783, 87, 0, 3244, 1485, 0, 1486, + 1487, 1485, 0, 1486, 1487, 2781, 0, 1485, 0, 1486, + 1487, 0, 2740, 0, 0, 0, 2720, 0, 1485, 0, + 1486, 1487, 0, 2719, 0, 0, 0, 3749, 2149, 3778, + 3681, 2147, 3758, 3768, 3757, 2715, 0, 3770, 0, 2713, + 0, 3765, 0, 3767, 1485, 0, 1486, 1487, 2705, 0, + 1485, 0, 1486, 1487, 2676, 3637, 3638, 0, 0, 0, + 0, 3930, 1485, 2178, 1486, 1487, 2670, 0, 0, 1485, + 3782, 1486, 1487, 1485, 0, 1486, 1487, 0, 0, 0, + 1485, 0, 1486, 1487, 0, 0, 0, 0, 2376, 0, + 0, 42, 1485, 0, 1486, 1487, 1485, 0, 1486, 1487, + 3922, 0, 3921, 0, 0, 1485, 0, 1486, 1487, 3937, + 0, 1485, 0, 1486, 1487, 0, 3949, 0, 3920, 3942, + 0, 3941, 0, 1485, 0, 1486, 1487, 3779, 3780, 0, + 0, 0, 0, 0, 3988, 3989, 0, 0, 3092, 3093, + 3094, 3095, 3096, 3772, 0, 0, 0, 3746, 0, 0, + 3932, 3933, 3934, 0, 0, 0, 2149, 3992, 3111, 2147, + 0, 0, 2170, 2159, 2160, 2161, 2162, 2172, 2163, 2164, + 2165, 2177, 2173, 2166, 2167, 2174, 2175, 2176, 2168, 2169, + 2171, 0, 0, 0, 0, 0, 0, 3995, 0, 4037, + 3244, 3998, 0, 0, 3774, 0, 3240, 0, 0, 0, + 0, 0, 0, 0, 1559, 1560, 1561, 1562, 1563, 1564, + 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, + 1575, 1576, 1577, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, @@ -1788,1013 +2087,709 @@ var yyAct = [...]int{ 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, - 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, - 1676, 1677, 1440, 1522, 1271, 2550, 1678, 4036, 1680, 1681, - 1682, 1683, 1684, 1441, 1442, 2974, 3331, 3332, 3588, 3589, - 1551, 1551, 1551, 1551, 1551, 1551, 1535, 1121, 4150, 3335, - 1515, 975, 4082, 975, 724, 1691, 1692, 1693, 1694, 1695, - 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1518, - 1519, 1520, 1521, 1526, 2997, 715, 4121, 975, 1515, 1532, - 3657, 4121, 1467, 3700, 3700, 1083, 1718, 165, 3331, 3332, - 716, 1224, 4149, 1547, 177, 1548, 1549, 1234, 1459, 94, - 2624, 3335, 1977, 1976, 1978, 1979, 1980, 1717, 4120, 1221, - 94, 94, 165, 4120, 1552, 1553, 3541, 1216, 2996, 177, - 2977, 1897, 1083, 2993, 1233, 1142, 1239, 1240, 1241, 1242, - 2008, 1865, 89, 1172, 2623, 185, 3044, 3485, 1228, 1135, - 1724, 674, 3385, 1171, 1753, 4160, 2548, 2854, 2856, 1042, - 1279, 1280, 3021, 1042, 4024, 3020, 1467, 1516, 1517, 1042, - 185, 4231, 3579, 3561, 2640, 2924, 2889, 2826, 2143, 1782, - 3031, 719, 1679, 1179, 1227, 1142, 1715, 3172, 166, 171, - 168, 174, 175, 176, 178, 180, 181, 182, 183, 1716, - 1477, 1247, 2884, 2494, 184, 186, 187, 188, 1142, 682, - 2444, 1515, 124, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 2402, 3257, 1512, 1142, 2184, 184, - 186, 187, 188, 2651, 1260, 1495, 3265, 1058, 1141, 1274, - 1896, 2176, 4050, 1165, 2495, 2185, 119, 3620, 3553, 1754, - 1732, 2493, 94, 1232, 1736, 2023, 2568, 1734, 1735, 2077, - 1041, 104, 105, 2004, 1796, 3071, 2510, 1716, 1685, 1686, - 1687, 1688, 1689, 1690, 1477, 1995, 4196, 3749, 1722, 1507, - 1508, 1510, 1509, 1511, 1512, 2496, 1482, 3266, 1141, 1115, - 1211, 3595, 4188, 1145, 1135, 2492, 1481, 1482, 1147, 3594, - 2535, 107, 1148, 1146, 1906, 1483, 1142, 2176, 1905, 2660, - 1895, 1141, 3268, 1473, 2540, 3034, 1465, 1135, 1138, 1139, - 3033, 1099, 2540, 1149, 120, 1132, 1136, 1873, 1874, 1875, - 1141, 2855, 3263, 2651, 1730, 1142, 1135, 1138, 1139, 2545, - 1099, 1889, 2543, 1153, 1132, 1136, 1131, 1151, 1053, 1756, - 3580, 3034, 3279, 3280, 1215, 1733, 3033, 2544, 1719, 3264, - 1960, 4233, 1882, 2547, 2016, 2542, 1038, 4083, 1759, 4016, - 1040, 1911, 1731, 1912, 1985, 1914, 1916, 3921, 1901, 1920, - 1922, 1924, 1926, 1928, 2182, 1942, 3920, 1473, 3051, 2332, - 1282, 1983, 1261, 3270, 1950, 1951, 720, 1787, 1788, 2167, - 1956, 1957, 1900, 4229, 1856, 1217, 4230, 1231, 4228, 1141, - 2111, 1178, 3654, 2024, 3655, 1175, 4084, 1246, 4017, 1864, - 2400, 2401, 1899, 1899, 2112, 1513, 1514, 2110, 1248, 4239, - 1992, 3911, 1993, 1879, 3671, 1994, 3670, 1880, 1141, 1892, - 3602, 1878, 2332, 1145, 1135, 1984, 2329, 1972, 1147, 1737, - 3601, 1754, 1148, 1146, 1480, 2331, 1481, 1482, 725, 2181, - 1903, 3278, 1982, 3073, 1214, 3591, 1946, 2099, 2100, 2097, - 2098, 973, 3053, 3281, 977, 978, 979, 1483, 3308, 3297, - 1114, 2949, 1483, 2099, 2100, 2630, 2631, 1938, 2012, 1483, - 1941, 2948, 1943, 2947, 2096, 2500, 2697, 1986, 2159, 2148, - 2149, 2150, 2151, 2161, 2152, 2153, 2154, 2166, 2162, 2155, - 2156, 2163, 2164, 2165, 2157, 2158, 2160, 1483, 1971, 1970, - 190, 1969, 128, 1483, 1968, 4240, 1118, 1117, 1116, 1483, - 1958, 2978, 1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, - 1790, 2029, 1952, 129, 1949, 151, 3063, 3062, 3061, 2407, - 2408, 3055, 1948, 3059, 1947, 3054, 1918, 3052, 1729, 172, - 1282, 1282, 3057, 1483, 3360, 1446, 2025, 2026, 1483, 4201, - 1754, 3056, 2875, 4216, 2051, 1754, 87, 4189, 4045, 87, - 2030, 4199, 1754, 3552, 3585, 3402, 725, 2037, 2038, 2039, - 3058, 3060, 4044, 162, 3267, 4020, 2931, 2050, 725, 150, - 1489, 1490, 1491, 1492, 1493, 1494, 1488, 1485, 4019, 1472, - 1469, 1470, 1471, 1476, 1478, 1475, 2516, 1474, 2515, 169, - 4018, 3943, 170, 1754, 1767, 2699, 1480, 1468, 1481, 1482, - 2514, 1480, 2513, 1481, 1482, 1479, 1754, 2942, 1480, 101, - 1481, 1482, 4176, 1754, 1885, 1886, 161, 160, 189, 102, - 3916, 1483, 2138, 2138, 2136, 2136, 1754, 2139, 2875, 1754, - 4129, 1754, 1483, 2512, 3900, 2511, 1480, 42, 1481, 1482, - 42, 3899, 1480, 1768, 1481, 1482, 3748, 2101, 1480, 1717, - 1481, 1482, 1483, 1472, 1469, 1470, 1471, 1476, 1478, 1475, - 3746, 1474, 4038, 2027, 1479, 1754, 2875, 4114, 2875, 4093, - 2031, 1468, 2033, 2034, 2035, 2036, 2687, 3667, 1501, 2040, - 1754, 1497, 1480, 1498, 1481, 1482, 1714, 1480, 1713, 1481, - 1482, 2052, 2222, 1483, 2875, 4089, 2236, 1499, 1513, 1514, - 1496, 1712, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 4127, 1754, 1483, 85, 3599, 1715, 85, - 155, 1887, 158, 2078, 1884, 1754, 156, 157, 4001, 1754, - 3948, 1716, 3584, 173, 2108, 3370, 1483, 2058, 2059, 2171, - 3638, 4035, 179, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 2114, 1483, 2116, 2117, 2118, 2119, 2120, - 2121, 2123, 2125, 2126, 2127, 2128, 2129, 2130, 1483, 2113, - 1480, 3367, 1481, 1482, 3300, 2649, 2319, 2320, 2321, 2322, - 2323, 1480, 2656, 1481, 1482, 2648, 2342, 110, 2142, 2115, - 2341, 3924, 1754, 2344, 2246, 2340, 2347, 2348, 109, 101, - 108, 1480, 3299, 1481, 1482, 103, 3271, 4125, 1754, 102, - 3275, 3025, 1526, 2186, 2187, 2188, 2189, 3274, 2875, 3912, - 3947, 2328, 2330, 3638, 1754, 2875, 3636, 2200, 3994, 1754, - 2177, 2365, 2221, 2540, 1754, 3559, 1754, 2781, 1754, 3904, - 2238, 1483, 1480, 2958, 1481, 1482, 3992, 1754, 3290, 3289, - 3903, 3276, 2945, 2920, 1483, 1711, 3272, 3287, 3288, 103, - 2655, 3273, 3285, 3286, 1480, 2647, 1481, 1482, 3285, 3284, - 1754, 164, 1483, 1754, 2899, 1754, 2623, 3006, 2423, 2339, - 1705, 1711, 2345, 2346, 1483, 1480, 1709, 1481, 1482, 2342, - 2613, 1707, 1483, 2412, 1708, 1706, 2605, 1710, 2340, 1860, - 2987, 104, 105, 1480, 2604, 1481, 1482, 2980, 2981, 3646, - 1501, 2562, 3043, 1771, 2561, 1483, 2453, 1480, 2397, 1481, - 1482, 2921, 104, 105, 1754, 2375, 1483, 2376, 1501, 2387, - 2054, 2923, 2020, 2107, 1502, 1503, 1504, 1505, 1506, 1507, - 1508, 1510, 1509, 1511, 1512, 1981, 3989, 1754, 2875, 2874, - 2701, 1104, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, - 1509, 1511, 1512, 1973, 3971, 1754, 2984, 159, 1963, 2425, - 2963, 2462, 2463, 2464, 2465, 2457, 3574, 2458, 2459, 2460, - 2461, 2447, 1054, 2448, 1770, 1104, 2891, 2872, 1959, 2363, - 1480, 2467, 1481, 1482, 2469, 2470, 2471, 2472, 2429, 2388, - 2381, 103, 2382, 1480, 1955, 1481, 1482, 3526, 1754, 2452, - 2390, 1954, 2483, 2141, 1754, 95, 1953, 1769, 3521, 2451, - 109, 1480, 1272, 1481, 1482, 3556, 1501, 2529, 2639, 2410, - 1483, 2489, 2891, 1480, 1483, 1481, 1482, 1479, 2434, 2435, - 2433, 1480, 1088, 1481, 1482, 1089, 2450, 2920, 2449, 2541, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, - 1512, 1860, 1859, 2899, 1480, 2870, 1481, 1482, 4077, 2526, - 1802, 1801, 2499, 2898, 4049, 1480, 152, 1481, 1482, 153, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, - 1512, 3222, 2484, 3555, 1479, 2480, 2473, 2475, 2476, 2875, - 2899, 2498, 3552, 2534, 1483, 2503, 2537, 2502, 2538, 3552, - 165, 3252, 3505, 2540, 3287, 2921, 3195, 177, 3603, 2436, - 2781, 2623, 2554, 4190, 2684, 2623, 3519, 1754, 2484, 2533, - 2536, 2532, 1143, 2683, 2899, 1501, 2540, 1483, 2523, 2405, - 1758, 1144, 1483, 2366, 2141, 2079, 2063, 2555, 1483, 2558, - 2006, 1899, 1483, 2559, 2560, 1789, 1483, 1126, 185, 1502, - 1503, 1504, 1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, - 1483, 1755, 1757, 1125, 1483, 3604, 3605, 3606, 1483, 1480, - 4155, 1481, 1482, 1480, 2628, 1481, 1482, 4096, 3935, 1043, - 1761, 3901, 3311, 1042, 1042, 1042, 3516, 1754, 2565, 3761, - 3619, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 110, 1536, 3616, 1536, 3597, 184, 186, 187, - 188, 3418, 1483, 109, 3417, 108, 1862, 2482, 3572, 3514, - 1754, 2643, 3358, 103, 3477, 1754, 3313, 3309, 2988, 1483, - 3475, 1754, 2598, 1483, 3471, 1754, 2479, 2955, 3468, 1754, - 2342, 1501, 1483, 1480, 2341, 1481, 1482, 1483, 2474, 2646, - 2468, 1483, 3466, 1754, 2466, 1483, 3464, 1754, 1988, 1483, - 3462, 1754, 95, 1894, 1483, 1502, 1503, 1504, 1505, 1506, - 1507, 1508, 1510, 1509, 1511, 1512, 1480, 1890, 1481, 1482, - 1483, 1480, 1858, 1481, 1482, 2615, 2666, 1480, 1754, 1481, - 1482, 1480, 121, 1481, 1482, 1480, 1216, 1481, 1482, 2954, - 2621, 3566, 3567, 2681, 3460, 1754, 3362, 3936, 1483, 1480, - 2497, 1481, 1482, 1480, 2629, 1481, 1482, 1480, 1934, 1481, - 1482, 3458, 1754, 2379, 4211, 3456, 1754, 2635, 2056, 4209, - 2632, 2633, 2634, 1483, 3454, 1754, 4053, 1483, 2108, 3452, - 1754, 1483, 4183, 3450, 1754, 679, 4057, 3448, 1754, 3976, - 1483, 3446, 1754, 2955, 1483, 3569, 2636, 4033, 2638, 3305, - 3304, 1480, 1483, 1481, 1482, 3303, 3222, 2641, 2967, 2642, - 1483, 2599, 3444, 1754, 1483, 1935, 1936, 1937, 1480, 1766, - 1481, 1482, 1480, 3244, 1481, 1482, 3571, 1483, 3245, 2659, - 3241, 1480, 2637, 1481, 1482, 2057, 1480, 3240, 1481, 1482, - 1480, 3908, 1481, 1482, 1480, 1056, 1481, 1482, 1480, 3242, - 1481, 1482, 3937, 1480, 3243, 1481, 1482, 1483, 2644, 742, - 2396, 2825, 2385, 1483, 3560, 3442, 1754, 3200, 3199, 1480, - 3621, 1481, 1482, 3440, 1754, 2607, 2608, 4015, 1483, 3739, - 2610, 3548, 3438, 1754, 3545, 2695, 3517, 2167, 1483, 2611, - 3741, 2813, 3544, 2857, 3424, 1754, 1057, 1480, 3209, 1481, - 1482, 2005, 3400, 1754, 1026, 3283, 2846, 1754, 3246, 2938, - 2908, 2909, 1042, 2138, 3726, 2136, 3725, 2860, 1483, 2844, - 1754, 2959, 1480, 2184, 1481, 1482, 1480, 2591, 1481, 1482, - 1480, 1483, 1481, 1482, 2590, 2896, 2897, 1182, 2858, 1480, - 2185, 1481, 1482, 1480, 2423, 1481, 1482, 1042, 2916, 2819, - 1754, 1480, 2589, 1481, 1482, 2796, 1754, 2588, 2861, 1480, - 2863, 1481, 1482, 1480, 2587, 1481, 1482, 1059, 1483, 3724, - 2788, 1754, 1483, 2895, 2586, 1060, 1480, 2107, 1481, 1482, - 2779, 1754, 1483, 2876, 2585, 1181, 2159, 2148, 2149, 2150, - 2151, 2161, 2152, 2153, 2154, 2166, 2162, 2155, 2156, 2163, - 2164, 2165, 2157, 2158, 2160, 3378, 1480, 2954, 1481, 1482, - 2777, 1754, 1480, 3037, 1481, 1482, 1483, 1722, 2848, 1445, - 2885, 2914, 1068, 2764, 1754, 2994, 42, 1480, 129, 1481, - 1482, 101, 3550, 1483, 103, 2913, 1067, 1480, 2915, 1481, - 1482, 102, 2868, 4225, 2941, 2943, 2971, 1483, 1716, 3212, - 3214, 1483, 2104, 2102, 2103, 2888, 2934, 1483, 3215, 2873, - 2762, 1754, 2992, 1483, 2760, 1754, 101, 1480, 2918, 1481, - 1482, 2602, 103, 4132, 2758, 1754, 102, 4034, 3931, 2922, - 1480, 3528, 1481, 1482, 2925, 1483, 110, 2407, 2408, 2489, - 2932, 3282, 2912, 2391, 1483, 2935, 2627, 109, 2957, 108, - 3003, 2179, 3198, 2960, 2961, 2062, 2180, 103, 2756, 1754, - 3197, 2061, 2946, 108, 4000, 3999, 3607, 1480, 1483, 1481, - 1482, 1480, 3979, 1481, 1482, 2754, 1754, 1483, 3747, 2956, - 3745, 1480, 3744, 1481, 1482, 1483, 3737, 3736, 3617, 2752, - 1754, 3549, 2964, 3483, 2242, 2968, 2969, 2970, 2965, 2750, - 1754, 110, 1483, 3547, 3000, 2748, 1754, 1483, 3314, 1882, - 2524, 1483, 109, 1930, 108, 1480, 1877, 1481, 1482, 3608, - 3609, 3610, 110, 2989, 2990, 1066, 109, 2746, 1754, 3538, - 4212, 2891, 1480, 109, 1481, 1482, 2744, 1754, 3710, 2999, - 3047, 3048, 4213, 4212, 4213, 3067, 1480, 2872, 1481, 1482, - 1480, 1483, 1481, 1482, 3101, 1483, 1480, 2685, 1481, 1482, - 2742, 1754, 1480, 1483, 1481, 1482, 1931, 1932, 1933, 2740, - 1754, 2377, 1483, 3026, 2325, 1783, 3064, 2738, 1754, 1483, - 3045, 1775, 114, 115, 1480, 4021, 1481, 1482, 3029, 1483, - 3583, 3, 97, 1480, 3479, 1481, 1482, 1, 2076, 2736, - 1754, 10, 1034, 3415, 2357, 3082, 3083, 3084, 3085, 3086, - 3087, 3088, 3089, 3090, 3091, 2074, 1448, 1480, 9, 1481, - 1482, 1755, 2364, 3001, 2075, 3099, 1480, 8, 1481, 1482, - 1447, 3587, 3065, 4144, 1480, 695, 1481, 1482, 2367, 1720, - 4184, 4140, 4141, 2734, 1754, 1974, 1964, 2732, 1754, 3649, - 2293, 1480, 1483, 1481, 1482, 3414, 1480, 3932, 1481, 1482, - 1480, 2389, 1481, 1482, 2730, 1754, 1483, 3317, 2530, 3615, - 1483, 2725, 1754, 2487, 1483, 1134, 154, 3141, 3049, 3143, - 2445, 3406, 3103, 2446, 1483, 3159, 3066, 3035, 4109, 118, - 3036, 1092, 117, 1137, 1483, 3154, 3155, 3156, 3157, 1245, - 1480, 2979, 1481, 1482, 1480, 2525, 1481, 1482, 1483, 3639, - 3046, 2939, 1480, 2454, 1481, 1482, 1808, 1806, 1807, 1805, - 1810, 1480, 3177, 1481, 1482, 1809, 4081, 3386, 1480, 2686, - 1481, 1482, 3166, 3168, 3484, 2067, 732, 2911, 1480, 726, - 1481, 1482, 192, 2423, 2721, 1754, 3092, 2328, 2330, 2328, - 2330, 1483, 1797, 1776, 2060, 1176, 685, 3291, 2719, 1754, - 2563, 691, 3404, 3139, 1533, 3229, 2842, 87, 2501, 2055, - 2423, 2423, 2423, 2423, 2423, 3196, 2841, 3149, 3150, 3151, - 3152, 3153, 2926, 1086, 1078, 3177, 2712, 1754, 2378, 2862, - 2423, 1085, 3909, 2423, 3230, 3542, 3167, 3208, 3169, 3210, - 2837, 1480, 1483, 1481, 1482, 2878, 3176, 1483, 3234, 3213, - 3206, 2016, 3251, 4014, 3738, 1480, 4094, 1481, 1482, 1480, - 3204, 1481, 1482, 1480, 2936, 1481, 1482, 1483, 3194, 3188, - 1772, 1483, 3504, 1480, 2425, 1481, 1482, 1483, 2658, 2174, - 3203, 1523, 3201, 1480, 2950, 1481, 1482, 757, 2422, 3216, - 3217, 3705, 2094, 755, 754, 752, 3334, 1480, 1045, 1481, - 1482, 2425, 2425, 2425, 2425, 2425, 3342, 3253, 3233, 1483, - 3254, 1046, 3202, 3236, 3237, 3235, 3239, 1483, 3238, 104, - 105, 2425, 3247, 1047, 2425, 1483, 2864, 3255, 3189, 3191, - 3193, 2892, 1487, 3261, 2710, 1754, 1486, 963, 2852, 2836, - 1480, 1784, 1481, 1482, 1483, 2903, 3292, 2901, 3294, 2900, - 2600, 2430, 3295, 3296, 3568, 3293, 1483, 3564, 4136, 2835, - 2424, 2420, 2871, 2834, 914, 3346, 913, 764, 756, 2833, - 746, 976, 912, 3343, 911, 3344, 3345, 3219, 3009, 2489, - 3336, 3315, 3359, 3011, 2937, 3347, 3355, 1464, 3353, 1739, - 1742, 1480, 2386, 1481, 1482, 1105, 1480, 3383, 1481, 1482, - 3225, 2832, 4040, 2626, 3412, 3225, 1483, 1738, 4047, 2823, - 3325, 3371, 3374, 3373, 3633, 3306, 1480, 2822, 1481, 1482, - 1480, 2985, 1481, 1482, 3381, 2517, 1480, 69, 1481, 1482, - 46, 4009, 3391, 4078, 906, 903, 2821, 3388, 3389, 3707, - 3390, 3708, 3709, 3392, 3162, 3394, 3163, 3396, 2820, 4060, - 4061, 3407, 3408, 3409, 3410, 3411, 902, 4062, 1480, 2231, - 1481, 1482, 1458, 1455, 4157, 2069, 1480, 96, 1481, 1482, - 36, 35, 34, 33, 1480, 32, 1481, 1482, 26, 25, - 24, 1536, 23, 22, 29, 1536, 19, 2645, 21, 20, - 3316, 2650, 18, 1480, 3328, 1481, 1482, 4179, 2817, 4224, - 123, 3529, 55, 3531, 52, 1480, 50, 1481, 1482, 131, - 130, 53, 49, 1219, 2653, 47, 2654, 3499, 31, 30, - 17, 16, 2662, 15, 3503, 14, 2664, 2665, 13, 12, - 11, 7, 6, 39, 38, 2671, 2672, 2673, 2674, 2675, - 2676, 2677, 2678, 2679, 2680, 37, 2682, 28, 27, 40, - 4, 3228, 2972, 2519, 3382, 1480, 0, 1481, 1482, 0, - 0, 0, 1717, 2423, 0, 0, 3534, 1483, 0, 2688, - 2689, 2690, 2691, 744, 2693, 2694, 3581, 2696, 3530, 3539, - 3532, 2698, 3546, 0, 0, 2703, 2704, 0, 2705, 3551, - 0, 2708, 2709, 2711, 2713, 2714, 2715, 2716, 2717, 2718, - 2720, 2722, 2723, 2724, 2726, 3337, 2728, 2729, 2731, 2733, - 2735, 2737, 2739, 2741, 2743, 2745, 2747, 2749, 2751, 2753, - 2755, 2757, 2759, 2761, 2763, 2765, 2766, 2767, 3573, 2769, - 3575, 2771, 3570, 2773, 2774, 3346, 2776, 2778, 2780, 0, - 3576, 0, 2783, 3343, 3536, 3506, 2787, 3508, 3509, 3510, - 2792, 2793, 2794, 2795, 2425, 3347, 3582, 1483, 0, 2812, - 3598, 0, 3600, 2806, 2807, 2808, 2809, 2810, 2811, 1483, - 0, 2815, 2816, 3592, 3593, 3376, 3377, 3563, 1483, 2818, - 0, 0, 1065, 1483, 2824, 1071, 1071, 0, 1483, 2827, - 2828, 2829, 2830, 2831, 0, 0, 3577, 3578, 0, 0, - 2838, 2839, 0, 2840, 0, 1483, 2843, 2845, 2389, 1483, - 2847, 0, 0, 3643, 3644, 0, 1480, 0, 1481, 1482, - 2859, 1483, 0, 0, 0, 3626, 0, 1483, 0, 3630, - 3631, 3632, 1483, 0, 3645, 0, 1483, 0, 0, 0, - 0, 1483, 0, 0, 2904, 2907, 2908, 2909, 2905, 2805, - 2906, 2910, 0, 0, 3566, 3567, 0, 0, 0, 0, - 1483, 2804, 0, 0, 0, 3661, 0, 1483, 0, 0, - 2803, 1483, 0, 0, 0, 2802, 0, 0, 0, 0, - 2801, 0, 0, 1483, 0, 0, 0, 0, 1483, 0, - 0, 0, 0, 3672, 0, 0, 0, 2800, 0, 1483, - 0, 2799, 0, 1483, 0, 0, 1480, 0, 1481, 1482, - 0, 0, 3694, 2798, 0, 0, 0, 0, 1480, 2797, - 1481, 1482, 1483, 0, 2791, 0, 0, 1480, 2790, 1481, - 1482, 0, 1480, 2789, 1481, 1482, 1483, 1480, 3723, 1481, - 1482, 3730, 0, 3732, 0, 3713, 0, 3714, 3715, 3716, - 1483, 0, 2786, 3703, 1480, 1483, 1481, 1482, 1480, 2785, - 1481, 1482, 0, 2784, 0, 0, 3229, 0, 3733, 87, - 1480, 3229, 1481, 1482, 0, 2782, 1480, 0, 1481, 1482, - 2775, 1480, 0, 1481, 1482, 1480, 1483, 1481, 1482, 0, - 1480, 2772, 1481, 1482, 0, 2770, 0, 1483, 0, 3666, - 2138, 1483, 2136, 0, 3763, 3734, 3743, 3755, 3742, 1480, - 3753, 1481, 1482, 0, 2768, 3750, 1480, 3752, 1481, 1482, - 1480, 0, 1481, 1482, 1483, 0, 0, 0, 2727, 0, - 3622, 3623, 1480, 0, 1481, 1482, 3915, 1480, 0, 1481, - 1482, 0, 2707, 3767, 0, 0, 0, 2706, 1480, 0, - 1481, 1482, 1480, 0, 1481, 1482, 0, 0, 0, 0, - 42, 2904, 2907, 2908, 2909, 2905, 0, 2906, 2910, 0, - 0, 1480, 0, 1481, 1482, 0, 3907, 3906, 2702, 0, - 0, 0, 0, 0, 3934, 1480, 3922, 1481, 1482, 2700, - 0, 3905, 0, 2692, 3926, 3927, 0, 0, 0, 1480, - 0, 1481, 1482, 0, 1480, 0, 1481, 1482, 0, 3973, - 3974, 3077, 3078, 3079, 3080, 3081, 2663, 3757, 3764, 3765, - 0, 0, 3731, 0, 0, 3917, 3918, 3919, 2138, 0, - 2136, 3096, 3977, 0, 0, 1480, 0, 1481, 1482, 0, - 0, 0, 0, 0, 0, 0, 1480, 0, 1481, 1482, - 1480, 0, 1481, 1482, 0, 0, 0, 0, 0, 3225, - 0, 0, 3980, 0, 4022, 3229, 3983, 0, 3759, 0, - 4013, 0, 0, 1480, 0, 1481, 1482, 0, 0, 1554, - 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, - 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1574, 1575, - 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, - 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, - 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, - 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, - 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, - 1646, 1647, 1648, 1649, 1650, 1651, 1653, 1654, 1655, 1656, - 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, - 1667, 1668, 1674, 1675, 1676, 1677, 1691, 1692, 1693, 1694, - 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, - 3978, 4023, 3228, 4007, 3997, 4006, 1483, 3228, 1744, 0, - 0, 4003, 0, 4005, 4041, 0, 0, 0, 0, 0, - 0, 0, 1752, 0, 0, 1745, 3910, 0, 0, 0, - 0, 3231, 87, 0, 0, 0, 4026, 0, 1717, 1483, - 0, 0, 0, 4025, 0, 0, 1744, 0, 0, 3249, - 2383, 2384, 1751, 1749, 1750, 1746, 0, 1747, 0, 4030, - 1752, 4043, 0, 1745, 0, 0, 0, 4046, 0, 0, - 4048, 0, 3914, 0, 0, 0, 0, 0, 0, 0, - 1748, 0, 0, 0, 0, 0, 0, 0, 1740, 1741, - 1751, 1749, 1750, 1746, 4055, 1747, 0, 0, 2657, 0, - 0, 0, 4065, 0, 0, 0, 0, 0, 0, 1484, - 0, 0, 0, 0, 0, 0, 0, 0, 1748, 0, - 0, 0, 0, 42, 0, 0, 4066, 0, 0, 4067, - 4091, 2652, 0, 0, 0, 87, 0, 0, 0, 0, - 1542, 0, 0, 0, 0, 0, 0, 0, 4076, 0, - 0, 0, 0, 0, 0, 1480, 0, 1481, 1482, 0, - 0, 4085, 0, 0, 1717, 0, 0, 0, 4027, 4097, - 0, 0, 0, 4095, 0, 3934, 4111, 3380, 4100, 4108, - 4105, 4102, 4101, 4099, 4104, 4103, 0, 0, 1480, 0, - 1481, 1482, 0, 0, 0, 0, 0, 0, 0, 3397, - 3398, 3228, 3399, 3401, 3403, 4130, 0, 0, 4153, 0, - 0, 0, 0, 4143, 0, 4135, 0, 4122, 4148, 0, - 0, 0, 0, 0, 4161, 0, 42, 0, 4163, 0, - 3416, 0, 0, 4174, 0, 3419, 0, 3421, 3422, 3423, - 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, - 3435, 3436, 3437, 3439, 3441, 3443, 3445, 3447, 3449, 3451, - 3453, 3455, 3457, 3459, 3461, 3463, 3465, 3467, 3469, 3470, - 3472, 3473, 3474, 3476, 4122, 4194, 3478, 2016, 3480, 3481, - 3482, 4193, 4204, 3486, 3487, 3488, 3489, 3490, 3491, 3492, - 3493, 3494, 3495, 3496, 4210, 2138, 4208, 2136, 4197, 4207, - 4206, 4203, 3502, 4178, 4173, 4218, 3507, 4092, 4032, 4087, - 3511, 3512, 0, 3513, 3515, 4226, 3518, 3520, 3225, 3522, - 3523, 3524, 3525, 4234, 4232, 0, 0, 0, 0, 3533, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4051, 4243, 4244, 3974, 4242, 0, 0, 0, - 0, 4122, 0, 2138, 0, 2136, 0, 4241, 0, 0, - 4039, 0, 0, 0, 3557, 3558, 0, 0, 3562, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4086, - 1774, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 44, 45, 88, 0, 0, 1863, 0, - 0, 0, 0, 3637, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 48, 76, 77, 0, 74, - 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 75, 0, 0, 0, 0, 0, 1723, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3656, 0, - 0, 3660, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 95, 0, 1024, 0, 0, - 2332, 0, 0, 1025, 0, 3673, 0, 0, 0, 0, - 0, 0, 4191, 2137, 0, 0, 677, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1029, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 2021, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3696, - 0, 0, 0, 0, 0, 0, 0, 0, 1100, 0, - 0, 0, 3704, 0, 0, 0, 0, 0, 0, 3711, - 0, 0, 982, 983, 984, 985, 986, 987, 988, 989, + 1656, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1679, 1680, 1681, + 1682, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1707, 1708, 1709, 3243, 3993, 4038, 4022, 4012, + 3243, 4021, 0, 1488, 0, 0, 4018, 3082, 4020, 4056, + 0, 0, 2919, 2922, 2923, 2924, 2920, 0, 2921, 2925, + 0, 3925, 3581, 3582, 0, 0, 0, 87, 0, 1750, + 3246, 0, 0, 0, 0, 0, 0, 4041, 0, 1750, + 0, 4040, 0, 1758, 0, 0, 1751, 0, 3264, 0, + 0, 0, 0, 1758, 4058, 4045, 1751, 0, 0, 0, + 4061, 0, 0, 0, 0, 3929, 0, 0, 0, 0, + 4063, 2394, 2395, 1757, 1755, 1756, 1752, 0, 1753, 0, + 0, 1746, 1747, 1757, 1755, 1756, 1752, 0, 1753, 0, + 0, 0, 0, 0, 0, 2665, 0, 0, 0, 0, + 0, 1754, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1754, 0, 0, 0, 4081, 0, 0, 4082, 0, + 0, 1225, 0, 1231, 42, 4106, 0, 0, 0, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 4091, 3156, + 0, 3158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4100, 1485, 0, 1486, 1487, 0, 3169, 3170, 3171, + 3172, 0, 0, 4042, 0, 1489, 4112, 0, 4137, 4115, + 4123, 4120, 4117, 4110, 4116, 0, 3395, 3949, 4126, 4114, + 4119, 4118, 0, 0, 0, 1459, 0, 0, 4145, 0, + 0, 0, 0, 0, 3243, 0, 1547, 4150, 3412, 3413, + 0, 3414, 3416, 3418, 0, 4168, 0, 0, 0, 0, + 0, 0, 4158, 4163, 0, 0, 0, 0, 0, 0, + 0, 4178, 4176, 0, 0, 4137, 0, 42, 4189, 3431, + 0, 0, 0, 0, 3434, 0, 3436, 3437, 3438, 3440, + 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, + 3451, 3452, 3454, 3456, 3458, 3460, 3462, 3464, 3466, 3468, + 3470, 3472, 3474, 3476, 3478, 3480, 3482, 3484, 3485, 3487, + 3488, 3489, 3491, 4209, 4212, 3493, 4193, 3495, 3496, 3497, + 2027, 4221, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, + 3509, 3510, 3511, 2149, 4222, 4225, 2147, 4223, 4233, 4219, + 4218, 3517, 4137, 4047, 4208, 3522, 4188, 4102, 4107, 3526, + 3527, 4241, 3528, 3530, 0, 3533, 3535, 4249, 3537, 3538, + 3539, 3540, 4247, 0, 0, 3240, 0, 0, 3548, 0, + 1028, 0, 0, 2343, 0, 0, 1029, 4066, 4258, 4259, + 3989, 4257, 0, 0, 0, 0, 2148, 0, 0, 0, + 0, 2149, 4256, 4054, 2147, 0, 0, 0, 0, 0, + 0, 0, 0, 3572, 3573, 0, 0, 3577, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4101, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 0, 0, 0, 0, 0, 0, - 51, 54, 57, 56, 59, 0, 73, 0, 0, 82, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 61, 91, 90, 0, 0, 71, 72, - 58, 0, 0, 0, 0, 0, 80, 81, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3923, 0, - 0, 0, 0, 0, 0, 0, 0, 3930, 0, 0, - 63, 64, 0, 65, 66, 67, 68, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3940, 3941, 3942, - 0, 3944, 0, 3945, 3946, 0, 0, 0, 0, 3949, - 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, - 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, - 3970, 0, 3972, 3975, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2089, 2090, 2091, 2092, 60, 3984, 3985, - 3986, 3987, 3988, 3990, 3991, 3993, 3995, 3996, 3998, 2105, - 0, 0, 4002, 0, 0, 0, 4004, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2144, 2145, 0, 0, 0, 0, - 2168, 4031, 0, 2172, 2173, 0, 0, 0, 2178, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2190, 2191, 2192, 2193, 2194, 2195, 2196, - 2197, 2198, 2199, 0, 2201, 0, 0, 89, 2223, 2224, - 2225, 2226, 2227, 2228, 2229, 2230, 2232, 0, 2237, 0, - 2239, 2240, 2241, 0, 2243, 2244, 2245, 0, 2247, 2248, - 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, - 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, - 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, - 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, - 2289, 2290, 2291, 2292, 2296, 2297, 2298, 2299, 2300, 2301, - 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, - 2312, 2313, 2314, 2315, 2316, 2317, 2318, 0, 0, 0, - 0, 0, 2324, 0, 2326, 0, 2333, 2334, 2335, 2336, - 2337, 2338, 0, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 2349, 2350, 2351, 2352, 2353, - 2354, 2355, 2356, 0, 2358, 2359, 2360, 2361, 2362, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 0, 0, 1071, 4177, 0, 0, 0, 4056, 0, - 0, 0, 0, 1826, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 129, 0, 151, 0, 0, 0, 0, - 0, 0, 4071, 0, 2403, 2404, 0, 0, 4074, 172, - 4075, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, - 2442, 0, 0, 4090, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 162, 0, 190, 0, 0, 1826, 150, - 0, 0, 1220, 0, 1226, 0, 1881, 0, 0, 4116, - 4117, 0, 0, 0, 959, 0, 0, 0, 129, 169, - 151, 0, 170, 4124, 4126, 4128, 0, 0, 0, 0, - 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, - 0, 4134, 2485, 0, 138, 139, 161, 160, 189, 0, - 0, 0, 0, 4156, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1454, 0, 162, 0, - 195, 0, 0, 195, 150, 0, 0, 730, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 1813, 4175, 0, 195, 169, 0, 0, 170, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1885, - 1886, 161, 160, 189, 0, 4198, 4200, 4202, 0, 0, - 0, 0, 0, 0, 736, 195, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 136, 158, 143, 135, 1813, 156, 157, 4223, 0, - 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, - 0, 0, 179, 144, 1827, 0, 4235, 4236, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 147, 145, 140, - 141, 142, 146, 0, 0, 0, 0, 0, 0, 137, - 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 155, 1887, 158, 0, 1884, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 1827, - 1840, 1843, 1844, 1845, 1846, 1847, 1848, 179, 1849, 1850, - 1852, 1853, 1851, 1854, 1855, 1828, 1829, 1830, 1831, 1811, - 1812, 1841, 0, 1814, 0, 1815, 1816, 1817, 1818, 1819, - 1820, 1821, 1822, 1823, 0, 0, 1824, 1832, 1833, 1834, - 1835, 0, 1836, 1837, 1838, 1839, 0, 0, 1825, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 164, 0, 0, 0, 1840, 1843, 1844, 1845, 1846, - 1847, 1848, 0, 1849, 1850, 1852, 1853, 1851, 1854, 1855, - 1828, 1829, 1830, 1831, 1811, 1812, 1841, 0, 1814, 0, - 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 0, - 0, 1824, 1832, 1833, 1834, 1835, 0, 1836, 1837, 1838, - 1839, 0, 0, 1825, 0, 0, 0, 0, 0, 0, - 2661, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2667, 2668, 2669, 2670, 0, 0, 164, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, - 0, 0, 1786, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1542, 0, 0, 0, 0, - 0, 1803, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1842, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1944, 0, 152, 0, 0, 153, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1989, - 165, 0, 0, 0, 0, 0, 0, 177, 0, 0, - 0, 0, 0, 0, 0, 0, 2017, 0, 1842, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2028, 0, 0, 0, 0, 0, 0, 2032, - 0, 152, 0, 0, 153, 0, 0, 0, 185, 1774, - 2043, 2044, 2045, 2046, 2047, 2048, 2049, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, - 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, - 0, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 0, 0, 0, 0, 0, 184, 186, 187, - 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166, 171, 168, 174, - 175, 176, 178, 180, 181, 182, 183, 0, 0, 0, - 0, 0, 184, 186, 187, 188, 0, 0, 736, 0, - 736, 736, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2082, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3042, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3068, - 3069, 3070, 0, 0, 3072, 0, 0, 3074, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3093, 3094, 3095, - 0, 0, 0, 0, 0, 0, 3100, 0, 0, 0, - 0, 3102, 0, 0, 3104, 3105, 3106, 0, 0, 0, - 3107, 3108, 0, 0, 3109, 0, 3110, 0, 0, 0, - 0, 0, 0, 3111, 0, 3112, 0, 0, 0, 3113, - 0, 3114, 0, 0, 3115, 0, 3116, 0, 3117, 0, - 3118, 0, 3119, 0, 3120, 0, 3121, 0, 3122, 0, - 3123, 0, 3124, 0, 3125, 0, 3126, 0, 3127, 0, - 3128, 0, 3129, 0, 3130, 0, 3131, 0, 3132, 0, - 0, 0, 3133, 0, 3134, 0, 3135, 0, 0, 3136, - 0, 3137, 0, 3138, 0, 2296, 3140, 0, 0, 3142, - 0, 0, 3144, 3145, 3146, 3147, 0, 0, 0, 0, - 3148, 2296, 2296, 2296, 2296, 2296, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3158, 0, 0, 0, - 0, 0, 0, 0, 3171, 0, 0, 3175, 0, 0, - 0, 0, 0, 0, 0, 0, 3178, 3179, 3180, 3181, - 3182, 3183, 0, 0, 0, 3184, 3185, 0, 3186, 0, - 3187, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 736, 736, 0, 0, - 0, 0, 0, 0, 1071, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3250, 736, 0, 2409, 0, 0, 0, 0, 195, 0, - 0, 2413, 736, 2416, 0, 0, 2082, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 736, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 1528, 736, - 3312, 0, 736, 736, 736, 736, 0, 736, 0, 736, - 736, 0, 736, 736, 736, 736, 736, 736, 0, 0, - 0, 0, 0, 0, 0, 1528, 736, 736, 1528, 736, - 1528, 195, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, - 736, 0, 195, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3405, 0, 195, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 736, 3420, 0, 0, 0, 1024, - 0, 0, 0, 0, 0, 1025, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2137, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2082, 0, 0, 0, - 0, 0, 0, 2575, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2596, 2597, 0, 0, 2601, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2606, 0, 0, 0, 0, 0, 0, 2609, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2612, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3642, 0, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1528, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3662, 0, 3663, 0, 3664, 0, - 3665, 0, 0, 0, 0, 0, 0, 0, 3668, 3669, - 0, 0, 0, 0, 0, 0, 0, 0, 3674, 0, - 0, 958, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3675, 0, 3676, 0, 3677, 0, 3678, 0, - 3679, 0, 3680, 0, 3681, 0, 3682, 0, 3683, 0, - 3684, 0, 3685, 0, 3686, 0, 3687, 0, 3688, 0, - 3689, 0, 3690, 0, 0, 3691, 0, 0, 0, 3692, - 0, 3693, 0, 0, 0, 0, 0, 3695, 0, 0, - 0, 0, 0, 713, 0, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3712, - 0, 0, 0, 0, 2343, 0, 0, 0, 3717, 0, - 3718, 3719, 0, 3720, 0, 3721, 0, 0, 0, 0, - 3722, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 735, 0, 0, 0, 3751, 195, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, - 3760, 0, 0, 3762, 0, 0, 2917, 0, 0, 0, - 0, 0, 0, 0, 0, 3766, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 736, 0, 0, 0, - 0, 3902, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 736, 0, 0, 2343, 195, 0, - 195, 0, 195, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2966, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, - 0, 0, 736, 736, 736, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3014, 3015, 3016, - 3017, 3018, 3019, 736, 0, 0, 0, 0, 0, 736, - 736, 0, 0, 736, 0, 736, 0, 0, 0, 0, - 4012, 736, 0, 0, 0, 0, 2082, 3030, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3038, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 736, 0, 0, 0, 736, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 195, 0, 0, 195, 0, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 736, 95, 0, 0, 1024, 0, 0, 0, - 0, 964, 1025, 977, 978, 979, 965, 0, 0, 966, - 967, 0, 968, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 973, 0, - 980, 981, 0, 0, 0, 0, 0, 4054, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1528, 0, 2343, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3348, - 3349, 0, 0, 4068, 0, 0, 4069, 0, 4070, 0, - 0, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 1020, 1021, 1022, 1023, 1024, 1025, 1026, 0, 0, 0, + 0, 0, 3652, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1785, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3671, 0, 0, + 3675, 0, 0, 0, 1797, 0, 0, 1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1814, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3688, 0, 0, 4206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1722, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 961, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3711, 0, + 0, 0, 0, 0, 0, 0, 1955, 0, 0, 0, + 0, 3719, 0, 0, 0, 0, 0, 0, 3726, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, + 197, 2000, 0, 197, 0, 0, 0, 732, 0, 0, + 0, 0, 738, 0, 0, 0, 0, 0, 2028, 0, + 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2039, 0, 0, 0, 0, 197, + 0, 2043, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 0, + 0, 0, 0, 0, 0, 0, 738, 197, 738, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3938, 0, 0, + 0, 0, 0, 0, 0, 0, 3945, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3955, 3956, 3957, 0, + 3959, 0, 3960, 3961, 0, 0, 0, 0, 3964, 3965, + 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, + 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, + 0, 3987, 3990, 0, 0, 0, 3709, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3999, 4000, 4001, + 4002, 4003, 4005, 4006, 4008, 4010, 4011, 4013, 0, 0, + 0, 4017, 0, 0, 0, 4019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4046, 0, 2100, 2101, 2102, 2103, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2093, 0, 0, 2116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2155, 2156, 0, 0, 0, 0, 2179, + 0, 0, 2183, 2184, 0, 0, 0, 2189, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, + 2209, 2210, 0, 2212, 0, 0, 0, 2234, 2235, 2236, + 2237, 2238, 2239, 2240, 2241, 2243, 0, 2248, 0, 2250, + 2251, 2252, 0, 2254, 2255, 2256, 0, 2258, 2259, 2260, + 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, + 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, + 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, + 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, + 2301, 2302, 2303, 2307, 2308, 2309, 2310, 2311, 2312, 2313, + 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, + 2324, 2325, 2326, 2327, 2328, 2329, 0, 0, 0, 0, + 0, 2335, 0, 2337, 4028, 2344, 2345, 2346, 2347, 2348, + 2349, 0, 0, 0, 0, 0, 0, 4071, 0, 0, + 0, 0, 0, 0, 2360, 2361, 2362, 2363, 2364, 2365, + 2366, 2367, 0, 2369, 2370, 2371, 2372, 2373, 0, 0, + 0, 4086, 0, 0, 0, 0, 0, 4089, 0, 4090, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4105, 1076, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 4131, 4132, + 0, 0, 0, 0, 0, 0, 0, 4192, 1892, 2416, + 2417, 0, 4139, 4141, 4143, 0, 1837, 0, 0, 0, + 131, 0, 153, 0, 0, 0, 0, 0, 0, 0, + 4149, 0, 192, 0, 0, 2455, 174, 0, 0, 0, + 0, 2422, 4171, 0, 0, 0, 0, 0, 0, 2426, + 0, 2429, 0, 0, 2093, 131, 0, 153, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 164, 174, 0, 0, 0, 0, 152, 0, 0, 0, + 4190, 0, 1722, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 197, 0, 0, 171, 2498, 0, 172, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, + 0, 152, 0, 0, 4213, 4215, 4217, 0, 0, 0, + 0, 1896, 1897, 163, 162, 191, 0, 0, 0, 0, + 738, 171, 738, 738, 172, 0, 0, 0, 4070, 0, + 0, 0, 0, 0, 0, 0, 4080, 4238, 0, 0, + 0, 0, 0, 0, 738, 197, 140, 141, 163, 162, + 191, 0, 0, 0, 0, 4250, 4251, 0, 0, 0, + 0, 0, 0, 1824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1533, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1722, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 157, 1898, 160, + 0, 1895, 0, 158, 159, 0, 0, 0, 0, 0, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 2093, 0, 0, 1838, 0, 0, + 0, 2588, 157, 138, 160, 145, 137, 0, 158, 159, + 0, 0, 2609, 2610, 0, 175, 2614, 0, 0, 0, + 0, 0, 0, 0, 181, 146, 0, 0, 2619, 0, + 0, 0, 0, 0, 0, 2622, 0, 0, 0, 149, + 147, 142, 143, 144, 148, 0, 0, 0, 0, 0, + 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 2625, 0, 1851, 1854, 1855, 1856, 1857, 1858, 1859, + 0, 1860, 1861, 1863, 1864, 1862, 1865, 1866, 1839, 1840, + 1841, 1842, 1822, 1823, 1852, 0, 1825, 0, 1826, 1827, + 1828, 1829, 1830, 1831, 1832, 1833, 1834, 0, 0, 1835, + 1843, 1844, 1845, 1846, 0, 1847, 1848, 1849, 1850, 0, + 0, 1836, 0, 0, 0, 0, 0, 0, 166, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 166, 0, 2674, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2680, 2681, 2682, 2683, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, + 738, 738, 0, 0, 0, 0, 0, 1837, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, + 1547, 0, 0, 0, 161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 197, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 738, 0, 0, 161, + 0, 0, 0, 197, 0, 0, 0, 738, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 738, 0, 738, 0, 0, 0, 0, 0, 0, 0, + 738, 0, 0, 1533, 738, 0, 0, 738, 738, 738, + 738, 0, 738, 0, 738, 738, 1853, 738, 738, 738, + 738, 738, 738, 154, 0, 0, 155, 0, 0, 0, + 1533, 738, 738, 1533, 738, 1533, 197, 738, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1824, 0, 197, 167, 154, 0, + 0, 155, 0, 0, 179, 0, 0, 0, 0, 738, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 738, 0, 0, 738, 1785, 197, 197, 0, + 0, 0, 167, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 197, 187, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 738, + 0, 0, 0, 0, 0, 0, 2932, 0, 1838, 0, + 187, 0, 0, 0, 0, 0, 0, 0, 168, 173, + 170, 176, 177, 178, 180, 182, 183, 184, 185, 0, + 0, 0, 0, 0, 186, 188, 189, 190, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 168, 173, 170, 176, 177, 178, 180, + 182, 183, 184, 185, 0, 0, 0, 0, 0, 186, + 188, 189, 190, 0, 1851, 1854, 1855, 1856, 1857, 1858, + 1859, 2981, 1860, 1861, 1863, 1864, 1862, 1865, 1866, 1839, + 1840, 1841, 1842, 1822, 1823, 1852, 0, 1825, 0, 1826, + 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 0, 0, + 1835, 1843, 1844, 1845, 1846, 0, 1847, 1848, 1849, 1850, + 0, 0, 1836, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3029, 3030, 3031, + 3032, 3033, 3034, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, + 738, 0, 0, 0, 0, 0, 2093, 3045, 0, 3057, + 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, + 0, 3053, 0, 0, 0, 0, 3083, 3084, 3085, 0, + 0, 3087, 0, 0, 3089, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3108, 3109, 3110, 0, 0, 0, + 0, 0, 0, 3115, 0, 738, 0, 0, 3117, 0, + 0, 3119, 3120, 3121, 0, 1533, 917, 3122, 3123, 0, + 0, 3124, 0, 3125, 0, 0, 0, 0, 0, 0, + 3126, 0, 3127, 1533, 0, 0, 3128, 0, 3129, 0, + 0, 3130, 0, 3131, 0, 3132, 0, 3133, 0, 3134, + 0, 3135, 0, 3136, 0, 3137, 0, 3138, 0, 3139, + 0, 3140, 0, 3141, 0, 3142, 0, 3143, 0, 3144, + 0, 3145, 0, 3146, 0, 3147, 0, 0, 0, 3148, + 0, 3149, 0, 3150, 736, 0, 3151, 1853, 3152, 0, + 3153, 0, 2307, 3155, 0, 0, 3157, 0, 0, 3159, + 3160, 3161, 3162, 0, 0, 0, 0, 3163, 2307, 2307, + 2307, 2307, 2307, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3173, 0, 0, 0, 0, 0, 0, + 0, 3186, 0, 0, 3190, 0, 0, 0, 1101, 0, + 1108, 0, 0, 3193, 3194, 3195, 3196, 3197, 3198, 0, + 0, 0, 3199, 3200, 0, 3201, 0, 3202, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2354, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1076, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 86, 44, 45, 88, 0, 960, 0, + 0, 0, 0, 0, 3235, 0, 0, 0, 0, 0, + 0, 0, 92, 0, 197, 0, 48, 76, 77, 738, + 74, 78, 0, 0, 0, 0, 0, 0, 0, 3265, + 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 0, 0, 197, + 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, + 715, 0, 0, 0, 62, 0, 737, 0, 0, 0, + 0, 197, 0, 0, 0, 738, 95, 0, 2354, 197, + 0, 197, 0, 197, 197, 0, 0, 0, 0, 3327, + 0, 0, 0, 0, 0, 0, 0, 0, 738, 0, + 0, 0, 0, 0, 0, 0, 0, 3317, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 0, 737, 0, 0, 0, 83, 0, 0, 0, + 0, 0, 0, 3355, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3369, 0, 0, + 0, 0, 0, 0, 0, 0, 738, 0, 0, 0, + 0, 0, 0, 738, 738, 738, 197, 0, 3387, 0, + 0, 3390, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 738, 0, 3420, 0, 0, 0, + 738, 738, 0, 0, 738, 0, 738, 0, 0, 0, + 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3435, 0, 0, 0, 0, 0, + 0, 51, 54, 57, 56, 59, 0, 73, 0, 0, + 82, 79, 0, 0, 0, 0, 0, 738, 0, 0, + 0, 0, 738, 0, 0, 0, 738, 738, 0, 0, + 0, 0, 0, 0, 61, 91, 90, 0, 0, 71, + 72, 58, 0, 0, 0, 0, 0, 80, 81, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 197, 0, 0, 197, 0, 197, 0, + 0, 63, 64, 0, 65, 66, 67, 68, 197, 0, + 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3550, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1028, 0, 0, 0, 60, 0, + 1029, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2148, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3611, 3633, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1533, 0, 2354, + 0, 3626, 0, 3627, 3628, 3629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3657, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 89, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 0, 0, 3677, 0, 3678, 0, 3679, 0, 3680, + 0, 0, 0, 0, 0, 0, 0, 3683, 3684, 0, + 0, 0, 1289, 0, 1289, 1289, 0, 3689, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3690, 0, 3691, 0, 3692, 1458, 3693, 0, 3694, + 0, 3695, 0, 3696, 0, 3697, 0, 3698, 0, 3699, + 0, 3700, 0, 3701, 0, 3702, 0, 3703, 94, 3704, + 0, 3705, 0, 0, 3706, 0, 0, 0, 3707, 0, + 3708, 0, 0, 0, 0, 0, 3710, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3727, 0, + 0, 0, 0, 0, 0, 0, 0, 3732, 0, 3733, + 3734, 0, 3735, 0, 3736, 0, 0, 0, 0, 3737, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 0, 3766, 0, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 3775, + 0, 738, 3777, 0, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 0, 3781, 0, 0, 738, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3917, 0, 0, 0, 737, 1444, 737, 737, 0, 0, + 0, 197, 0, 0, 0, 0, 197, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1532, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 738, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 738, 0, 0, 0, 0, 0, 0, 738, + 0, 0, 0, 738, 738, 0, 0, 0, 738, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4027, + 0, 0, 1732, 1733, 1533, 738, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 197, 197, + 197, 197, 197, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1791, 0, 0, 197, 197, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1809, 918, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1868, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 1877, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, + 0, 0, 1101, 0, 1904, 0, 0, 0, 0, 0, + 0, 0, 1913, 0, 0, 195, 1915, 0, 680, 1918, + 1919, 1921, 1921, 0, 1921, 0, 1921, 1921, 0, 1930, + 1921, 1921, 1921, 1921, 1921, 0, 0, 0, 680, 0, + 0, 0, 0, 1950, 1951, 0, 1101, 738, 0, 1956, + 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1077, 1077, 0, 0, 0, 0, 0, + 0, 1998, 680, 0, 737, 737, 0, 0, 0, 0, + 0, 0, 0, 0, 2020, 0, 0, 2024, 0, 0, + 0, 0, 0, 0, 0, 0, 4069, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 4067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 1289, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 4083, 0, 0, 4084, 0, 4085, 0, 0, + 0, 737, 738, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 0, 737, 0, 0, 0, + 0, 0, 0, 0, 737, 0, 0, 1532, 737, 0, + 0, 737, 737, 737, 737, 738, 737, 0, 737, 737, + 0, 737, 737, 737, 737, 737, 737, 0, 0, 0, + 197, 0, 0, 738, 1532, 737, 737, 1532, 737, 1532, + 0, 737, 0, 0, 0, 0, 0, 0, 0, 738, + 0, 0, 0, 1533, 0, 0, 738, 738, 1533, 197, + 197, 197, 197, 197, 0, 0, 0, 0, 0, 4169, + 0, 197, 0, 737, 0, 0, 0, 197, 0, 197, + 0, 0, 197, 197, 197, 0, 737, 0, 0, 737, + 0, 0, 0, 0, 0, 0, 0, 0, 4185, 0, + 4186, 0, 4187, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1289, 1289, 0, 0, 0, 0, 197, 0, 0, + 0, 0, 0, 737, 0, 0, 2081, 0, 0, 0, + 738, 0, 0, 1533, 0, 0, 95, 0, 738, 1028, + 0, 0, 0, 197, 966, 1029, 980, 981, 982, 967, + 0, 0, 968, 969, 0, 970, 0, 197, 0, 0, + 0, 0, 4236, 0, 4237, 0, 0, 0, 0, 0, + 0, 975, 0, 983, 984, 0, 0, 0, 197, 0, + 0, 197, 0, 0, 0, 0, 0, 2143, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3363, 3364, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3350, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4154, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3302, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4170, - 0, 4171, 0, 4172, 0, 0, 0, 0, 0, 0, - 0, 3340, 0, 0, 0, 735, 1439, 735, 735, 0, - 0, 0, 0, 0, 0, 3354, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3351, 3352, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 3372, 0, 0, 3375, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1527, 0, - 0, 195, 0, 4221, 0, 4222, 0, 0, 0, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 929, 0, 0, 0, 0, 0, 933, 0, 195, 0, - 930, 931, 0, 195, 0, 932, 934, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 3535, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 734, 736, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, - 736, 736, 0, 0, 0, 736, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1528, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, - 1096, 0, 1103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3596, - 0, 0, 0, 195, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3611, - 0, 3612, 3613, 3614, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 735, 735, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 735, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 1527, 735, 0, 0, 735, - 735, 735, 735, 0, 735, 0, 735, 735, 0, 735, - 735, 735, 735, 735, 735, 0, 0, 0, 0, 0, - 0, 0, 1527, 735, 735, 1527, 735, 1527, 0, 735, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 0, 0, 0, 735, 0, 0, 735, 0, 0, - 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 195, 0, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 1528, 0, - 0, 736, 736, 1528, 195, 195, 195, 195, 195, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 0, 0, 195, 0, 195, 0, 0, 195, 195, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 736, 0, 0, 1528, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 195, 0, 0, 0, - 0, 735, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1527, 0, 0, - 0, 0, 0, 0, 0, 0, 2146, 0, 0, 0, - 0, 0, 0, 0, 0, 1527, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1284, 0, 1284, 1284, 0, 0, + 1021, 1022, 1023, 1024, 1025, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1453, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 737, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 738, + 0, 0, 0, 0, 0, 0, 0, 3365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, + 0, 1289, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1532, + 0, 0, 0, 0, 0, 0, 0, 0, 2157, 0, + 0, 0, 0, 0, 0, 0, 0, 1532, 3366, 3367, + 0, 2391, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 916, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4052, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 2404, 0, 680, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 197, 0, 197, 197, 197, 0, 1791, 0, 0, + 1289, 0, 0, 738, 738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 193, 0, 0, 678, 0, 0, 195, 0, 195, 195, - 195, 0, 0, 0, 0, 0, 0, 0, 736, 736, - 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, - 735, 0, 0, 0, 0, 0, 0, 0, 0, 1052, + 1101, 0, 0, 931, 0, 0, 0, 0, 0, 935, + 0, 0, 0, 932, 933, 0, 0, 0, 934, 936, + 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 738, 738, 738, 738, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, + 0, 0, 0, 737, 0, 0, 0, 0, 1108, 0, + 0, 0, 0, 0, 0, 2519, 2520, 2521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1072, 1072, 0, 0, - 0, 0, 0, 735, 0, 678, 0, 736, 736, 736, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 735, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1101, 0, 0, 0, + 0, 0, 1108, 1913, 0, 0, 1913, 0, 1913, 0, + 0, 0, 0, 737, 2552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 0, 0, 1101, + 0, 0, 0, 0, 2143, 0, 0, 0, 2143, 2143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, + 0, 738, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1533, 0, 0, 0, 197, 0, 0, 738, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 0, 0, 0, 0, 0, 0, 737, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2630, 0, 0, 737, 0, + 0, 0, 0, 0, 737, 737, 0, 0, 737, 0, + 737, 0, 0, 0, 0, 0, 737, 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 0, 0, 0, 0, 735, - 735, 735, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 738, 0, 0, 0, 0, + 0, 680, 0, 0, 0, 0, 0, 0, 738, 0, + 0, 737, 0, 0, 0, 0, 737, 0, 0, 0, + 737, 737, 0, 0, 1056, 0, 0, 0, 0, 0, + 0, 1289, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 735, 0, 1726, 1727, 0, 0, 735, 735, 0, 0, - 735, 0, 735, 0, 0, 0, 0, 0, 735, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, + 738, 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1780, 0, 736, 0, 736, 0, 195, 0, - 0, 0, 0, 735, 0, 0, 0, 1798, 735, 0, - 0, 0, 735, 735, 0, 0, 0, 1528, 1857, 0, - 0, 195, 0, 0, 736, 0, 736, 0, 1866, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, + 0, 0, 0, 0, 0, 1534, 0, 0, 1534, 0, + 1534, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1096, 0, 1893, 0, 0, 0, 0, 0, 0, - 0, 1902, 0, 0, 0, 1904, 0, 0, 1907, 1908, - 1910, 1910, 0, 1910, 0, 1910, 1910, 0, 1919, 1910, - 1910, 1910, 1910, 1910, 736, 0, 0, 0, 0, 0, - 0, 0, 1939, 1940, 0, 1096, 0, 195, 1945, 0, - 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, - 1987, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2009, 0, 0, 2013, 0, 0, 0, + 0, 0, 2026, 680, 0, 0, 0, 0, 0, 0, + 0, 1532, 0, 737, 0, 0, 0, 0, 0, 680, + 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 0, 0, 2052, 2053, 680, 680, 680, + 680, 680, 680, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2878, 0, 0, 0, 197, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2895, + 0, 0, 0, 0, 0, 738, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, - 1284, 0, 0, 0, 0, 736, 0, 736, 0, 0, - 0, 0, 0, 1527, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1533, 738, 0, 738, 0, 0, 2977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, + 2354, 0, 0, 0, 2404, 0, 0, 0, 0, 0, + 0, 3001, 0, 0, 0, 1913, 1913, 0, 0, 0, + 3006, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 680, 0, 0, 0, 0, 0, 0, 3017, 0, 0, + 197, 738, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, + 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 738, 2945, 0, 1534, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 738, 0, 738, 0, 0, 2143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2143, + 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, + 0, 0, 0, 737, 0, 0, 0, 737, 737, 0, + 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1532, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 1284, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 2070, 0, 0, 0, 678, - 0, 678, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 736, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1972, + 0, 0, 0, 0, 3175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1077, 1289, 0, 0, 0, + 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1921, 0, 0, + 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 2026, 680, 3220, 680, 0, 680, 2445, + 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1289, 0, 0, 0, 0, 0, 0, 3247, 1921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2132, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 1529, 0, 0, 0, 0, 736, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1528, 736, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2930, 0, 0, 0, - 0, 0, 0, 0, 736, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 736, 0, 0, 735, + 0, 0, 1101, 0, 0, 0, 0, 0, 0, 0, + 2404, 0, 0, 0, 0, 0, 737, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 736, 735, 735, 0, - 1284, 0, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1527, 735, - 736, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, - 0, 736, 0, 0, 0, 0, 0, 0, 0, 2380, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 0, 0, 0, 1532, 0, 680, + 737, 737, 1532, 0, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 680, 680, 0, + 0, 680, 0, 2616, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, + 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3313, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 2627, 0, 0, 0, 0, 0, 0, + 0, 1868, 0, 0, 737, 0, 0, 1532, 0, 0, + 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1780, 0, 0, 1284, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1096, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1052, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, - 0, 1103, 0, 0, 0, 0, 0, 0, 2506, 2507, - 2508, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1096, - 0, 0, 0, 0, 0, 1103, 1902, 0, 0, 1902, - 0, 1902, 0, 0, 0, 0, 0, 2539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1096, 0, 0, 0, 0, 2132, 0, 0, - 0, 2132, 2132, 0, 0, 1529, 735, 0, 1529, 0, - 1529, 678, 0, 0, 0, 0, 0, 0, 735, 0, + 0, 0, 0, 0, 0, 3394, 0, 0, 0, 0, + 0, 0, 1534, 0, 2026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1961, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 678, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2015, 678, 0, 0, 0, 735, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, - 0, 735, 0, 0, 0, 1527, 678, 0, 735, 735, - 1527, 0, 0, 0, 0, 2041, 2042, 678, 678, 678, - 678, 678, 678, 678, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 735, 0, 0, 1527, 0, 0, 0, 0, - 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2404, 2404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3379, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3665, 3666, 3667, 3668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3601, 0, 0, 680, 0, 0, + 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, + 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3743, 0, 3743, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 737, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3771, 0, 3773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2865, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2880, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2404, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3940, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1534, + 1289, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 680, 680, 680, 680, 680, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 735, 735, 0, 0, 0, - 0, 0, 0, 0, 2015, 0, 0, 0, 0, 0, + 0, 680, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 0, 737, 680, 0, 0, 0, + 0, 0, 0, 0, 0, 3743, 0, 0, 0, 0, + 0, 0, 3743, 0, 3743, 0, 1532, 0, 0, 0, + 0, 0, 0, 737, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2962, 0, - 0, 0, 0, 0, 735, 735, 735, 735, 1961, 0, + 0, 0, 0, 2404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1072, 2393, 0, 0, 0, 0, - 0, 0, 2986, 0, 0, 0, 1902, 1902, 0, 0, - 0, 2991, 0, 1052, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, - 678, 0, 0, 0, 0, 0, 0, 2015, 678, 0, - 678, 0, 678, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2132, 0, 0, 0, 0, 2509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1527, 0, 0, 0, 0, 0, - 2132, 735, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2404, 0, 0, 0, 737, 0, 0, + 0, 0, 0, 0, 737, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2404, 0, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1077, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, + 0, 0, 0, 1534, 680, 680, 680, 680, 680, 0, + 0, 0, 0, 4087, 0, 0, 3263, 0, 0, 0, + 0, 0, 1972, 4095, 680, 0, 0, 680, 3271, 2026, + 0, 0, 0, 0, 2404, 0, 4103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 0, 735, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 735, 678, 678, 0, 0, 678, 0, 2603, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, - 0, 0, 0, 0, 678, 3160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1284, 0, 0, + 0, 1289, 1289, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 680, 0, + 0, 0, 0, 4153, 0, 0, 0, 0, 0, 0, + 0, 0, 680, 0, 3803, 3805, 3804, 3870, 3871, 3872, + 3873, 3874, 3875, 3876, 3806, 3807, 808, 0, 0, 737, + 0, 0, 0, 680, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 4095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 678, 0, 0, 0, 0, 0, 0, 2614, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1910, 0, - 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, - 0, 0, 735, 0, 735, 0, 3205, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 0, 0, 0, 0, 0, 0, 3232, 1910, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1868, 0, 4153, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1532, 737, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1529, 0, 2015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1096, 0, 0, 0, 0, 0, 0, 0, 2393, + 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 0, 0, 0, 0, 0, 0, 0, 680, 3811, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, + 737, 0, 0, 3819, 3820, 0, 0, 3895, 3894, 3893, + 0, 0, 3891, 3892, 3890, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 680, 0, 680, 680, + 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3896, 931, + 0, 784, 785, 3897, 3898, 935, 3899, 787, 788, 932, + 933, 0, 782, 786, 934, 936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, + 0, 3800, 3801, 3802, 3808, 3809, 3810, 3821, 3868, 3869, + 3877, 3879, 887, 3878, 3880, 3881, 3882, 3885, 3886, 3887, + 3888, 3883, 3884, 3889, 3783, 3787, 3784, 3785, 3786, 3798, + 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, + 3799, 3900, 3901, 3902, 3903, 3904, 3905, 3814, 3818, 3817, + 3815, 3816, 3812, 3813, 3840, 3839, 3841, 3842, 3843, 3844, + 3845, 3846, 3848, 3847, 3849, 3850, 3851, 3852, 3853, 3854, + 3822, 3823, 3826, 3827, 3825, 3824, 3828, 3837, 3838, 3829, + 3830, 3831, 3832, 3833, 3834, 3836, 3835, 3855, 3856, 3857, + 3858, 3859, 3861, 3860, 3864, 3865, 3863, 3862, 3867, 3866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 937, 0, 938, 0, 0, 942, 0, + 0, 0, 944, 943, 0, 945, 907, 906, 0, 0, + 939, 940, 0, 941, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1534, 0, 0, + 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3906, 3907, + 3908, 3909, 3910, 3911, 3912, 3913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 735, 0, 0, 0, 0, 0, 1961, - 1857, 0, 0, 1527, 735, 0, 735, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 735, 735, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, - 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2393, 2393, 735, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 678, 678, 678, 678, 678, 678, - 0, 0, 0, 3650, 3651, 3652, 3653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2807,4622 +2802,4510 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3728, 0, 3728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3756, 0, 3758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3925, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1284, - 0, 0, 0, 0, 0, 1072, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1529, 0, - 0, 0, 0, 1529, 678, 678, 678, 678, 678, 0, - 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0, - 0, 0, 1961, 0, 678, 0, 0, 678, 3256, 2015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3728, 0, 0, 0, 0, 0, - 0, 3728, 0, 3728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 1529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 678, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1972, 0, 0, 399, 0, + 0, 0, 0, 0, 0, 1427, 1411, 531, 0, 1353, + 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, + 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, + 1372, 1429, 369, 270, 1301, 1292, 206, 508, 1326, 433, + 1342, 205, 1392, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 1436, 373, 1378, + 0, 500, 404, 0, 0, 2026, 1417, 1416, 1347, 1357, + 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, + 1432, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 4127, 510, 962, 0, 0, 0, 0, 4128, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 1334, 1384, 612, 1426, 1335, 1386, 268, + 324, 275, 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, + 599, 0, 0, 231, 1428, 1359, 0, 1389, 0, 1443, + 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, 278, 0, + 0, 0, 0, 0, 0, 0, 1356, 1367, 1401, 1405, + 1350, 0, 0, 0, 0, 0, 0, 0, 0, 1327, + 0, 1376, 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2393, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4072, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4080, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2393, 0, 4088, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1284, 1284, 3788, 3790, 3789, 3855, 3856, 3857, 3858, 3859, - 3860, 3861, 3791, 3792, 806, 0, 678, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 678, 0, 678, 678, - 678, 0, 4138, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4080, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2393, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1857, 0, 4138, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3796, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3804, 3805, 0, 0, 3880, 3879, 3878, 1961, 0, - 3876, 3877, 3875, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1529, 0, 0, - 0, 1961, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3881, 929, 0, 782, - 783, 3882, 3883, 933, 3884, 785, 786, 930, 931, 0, - 780, 784, 932, 934, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1961, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3785, - 3786, 3787, 3793, 3794, 3795, 3806, 3853, 3854, 3862, 3864, - 885, 3863, 3865, 3866, 3867, 3870, 3871, 3872, 3873, 3868, - 3869, 3874, 3768, 3772, 3769, 3770, 3771, 3783, 3773, 3774, - 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3784, 3885, - 3886, 3887, 3888, 3889, 3890, 3799, 3803, 3802, 3800, 3801, - 3797, 3798, 3825, 3824, 3826, 3827, 3828, 3829, 3830, 3831, - 3833, 3832, 3834, 3835, 3836, 3837, 3838, 3839, 3807, 3808, - 3811, 3812, 3810, 3809, 3813, 3822, 3823, 3814, 3815, 3816, - 3817, 3818, 3819, 3821, 3820, 3840, 3841, 3842, 3843, 3844, - 3846, 3845, 3849, 3850, 3848, 3847, 3852, 3851, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 935, 0, 936, 0, 0, 940, 0, 0, 0, - 942, 941, 0, 943, 905, 904, 0, 0, 937, 938, - 0, 939, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3891, 3892, 3893, 3894, - 3895, 3896, 3897, 3898, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1961, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4110, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1961, 0, 0, 397, 0, - 0, 0, 0, 0, 0, 1422, 1406, 529, 0, 1348, - 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, - 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, - 1367, 1424, 367, 268, 1296, 1287, 204, 506, 1321, 431, - 1337, 203, 1387, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 1431, 371, 1373, - 0, 498, 402, 0, 0, 2015, 1412, 1411, 1342, 1352, - 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, - 1427, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 4112, 508, 960, 0, 0, 0, 0, 4113, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 1329, 1379, 610, 1421, 1330, 1381, 266, - 322, 273, 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, - 597, 0, 0, 229, 1423, 1354, 0, 1384, 0, 1438, - 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, 276, 0, - 0, 0, 0, 0, 0, 0, 1351, 1362, 1396, 1400, - 1345, 0, 0, 0, 0, 0, 0, 0, 0, 1322, - 0, 1371, 0, 0, 0, 1300, 1292, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1349, - 0, 0, 0, 0, 1303, 0, 1323, 1397, 0, 1286, - 298, 1297, 403, 258, 0, 454, 1404, 1417, 1346, 630, - 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, - 197, 225, 0, 1334, 413, 462, 474, 1409, 1319, 1328, - 254, 1326, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 1370, 1389, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 1298, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 1314, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 1405, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 1394, 1437, - 426, 473, 240, 607, 497, 199, 1308, 1313, 1306, 0, - 255, 256, 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, - 1429, 1430, 1415, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 1398, 1302, 0, 1311, 1312, 399, 1407, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 1369, 196, 221, - 369, 1433, 455, 289, 651, 619, 485, 614, 206, 223, - 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, - 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, - 1402, 1416, 1436, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 1368, 1374, 382, 282, 306, 321, 1383, 618, 503, - 227, 467, 291, 251, 1401, 1403, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1364, 1392, 377, 577, 578, 317, 397, 0, 0, 0, - 0, 0, 0, 1422, 1406, 529, 0, 1348, 1425, 1316, - 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, - 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, - 367, 268, 1296, 1287, 204, 506, 1321, 431, 1337, 203, - 1387, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 1431, 371, 1373, 0, 498, - 402, 0, 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, - 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 1329, 1379, 610, 1421, 1330, 1381, 266, 322, 273, - 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, - 0, 229, 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, - 0, 1291, 1295, 1434, 1418, 1324, 276, 0, 0, 0, - 0, 0, 0, 0, 1351, 1362, 1396, 1400, 1345, 0, - 0, 0, 0, 0, 0, 3257, 0, 1322, 0, 1371, - 0, 0, 0, 1300, 1292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1349, 0, 0, - 0, 0, 1303, 0, 1323, 1397, 0, 1286, 298, 1297, - 403, 258, 0, 454, 1404, 1417, 1346, 630, 1419, 1344, - 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, 197, 225, - 0, 1334, 413, 462, 474, 1409, 1319, 1328, 254, 1326, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 1370, 1389, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 1298, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 1314, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 1405, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 1394, 1437, 426, 473, - 240, 607, 497, 199, 1308, 1313, 1306, 0, 255, 256, - 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, - 1415, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 1398, - 1302, 0, 1311, 1312, 399, 1407, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 1369, 196, 221, 369, 1433, - 455, 289, 651, 619, 485, 614, 206, 223, 1305, 263, - 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, - 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, - 1436, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 1368, - 1374, 382, 282, 306, 321, 1383, 618, 503, 227, 467, - 291, 251, 1401, 1403, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 1364, 1392, - 377, 577, 578, 317, 397, 0, 0, 0, 0, 0, - 0, 1422, 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, - 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, - 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, 367, 268, - 1296, 1287, 204, 506, 1321, 431, 1337, 203, 1387, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 1431, 371, 1373, 0, 498, 402, 0, - 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, - 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 1329, - 1379, 610, 1421, 1330, 1381, 266, 322, 273, 265, 581, - 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, 0, 229, - 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, 0, 1291, - 1295, 1434, 1418, 1324, 276, 0, 0, 0, 0, 0, - 0, 0, 1351, 1362, 1396, 1400, 1345, 0, 0, 0, - 0, 0, 0, 3218, 0, 1322, 0, 1371, 0, 0, - 0, 1300, 1292, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1349, 0, 0, 0, 0, - 1303, 0, 1323, 1397, 0, 1286, 298, 1297, 403, 258, - 0, 454, 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, - 1301, 1410, 1336, 366, 1299, 331, 197, 225, 0, 1334, - 413, 462, 474, 1409, 1319, 1328, 254, 1326, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 1370, 1389, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 1298, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 1314, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 1405, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 1394, 1437, 426, 473, 240, 607, - 497, 199, 1308, 1313, 1306, 0, 255, 256, 1376, 576, - 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 1398, 1302, 0, - 1311, 1312, 399, 1407, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 1369, 196, 221, 369, 1433, 455, 289, - 651, 619, 485, 614, 206, 223, 1305, 263, 1317, 1325, - 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, - 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 1368, 1374, 382, - 282, 306, 321, 1383, 618, 503, 227, 467, 291, 251, - 1401, 1403, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 1364, 1392, 377, 577, - 578, 317, 397, 0, 0, 0, 0, 0, 0, 1422, - 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, 1338, 1341, - 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, 1290, 1318, - 1350, 271, 1315, 1408, 1367, 1424, 367, 268, 1296, 1287, - 204, 506, 1321, 431, 1337, 203, 1387, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 1431, 371, 1373, 0, 498, 402, 0, 0, 0, - 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, 1386, 1304, - 1372, 1426, 1333, 1382, 1427, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 960, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 1329, 1379, 610, - 1421, 1330, 1381, 266, 322, 273, 265, 581, 1432, 1413, - 1293, 1360, 1420, 1355, 597, 0, 0, 229, 1423, 1354, - 0, 1384, 0, 1438, 1288, 1375, 0, 1291, 1295, 1434, - 1418, 1324, 276, 0, 0, 0, 0, 0, 0, 0, - 1351, 1362, 1396, 1400, 1345, 0, 0, 0, 0, 0, - 0, 2411, 0, 1322, 0, 1371, 0, 0, 0, 1300, - 1292, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1349, 0, 0, 0, 0, 1303, 0, - 1323, 1397, 0, 1286, 298, 1297, 403, 258, 0, 454, - 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, 1301, 1410, - 1336, 366, 1299, 331, 197, 225, 0, 1334, 413, 462, - 474, 1409, 1319, 1328, 254, 1326, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 1370, 1389, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 1298, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 1314, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 1405, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 1394, 1437, 426, 473, 240, 607, 497, 199, - 1308, 1313, 1306, 0, 255, 256, 1376, 576, 1309, 1307, - 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, 656, 657, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1354, + 0, 0, 0, 0, 1308, 0, 1328, 1402, 0, 1291, + 300, 1302, 405, 260, 0, 456, 1409, 1422, 1351, 632, + 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, + 199, 227, 0, 1339, 415, 464, 476, 1414, 1324, 1333, + 256, 1331, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 1375, 1394, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 1303, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 1319, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 1410, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 1399, 1442, + 428, 475, 242, 609, 499, 201, 1313, 1318, 1311, 0, + 257, 258, 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, + 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 1403, 1307, 0, 1316, 1317, 401, 1412, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 1374, 198, 223, + 371, 1438, 457, 291, 653, 621, 487, 616, 208, 225, + 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, + 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, + 1407, 1421, 1441, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 1373, 1379, 384, 284, 308, 323, 1388, 620, 505, + 229, 469, 293, 253, 1406, 1408, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 1369, 1397, 379, 579, 580, 319, 399, 0, 0, 0, + 0, 0, 0, 1427, 1411, 531, 0, 1353, 1430, 1321, + 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, + 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, + 369, 270, 1301, 1292, 206, 508, 1326, 433, 1342, 205, + 1392, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 1436, 373, 1378, 0, 500, + 404, 0, 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, + 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 1334, 1384, 612, 1426, 1335, 1386, 268, 324, 275, + 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, + 0, 231, 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, + 0, 1296, 1300, 1439, 1423, 1329, 278, 0, 0, 0, + 0, 0, 0, 0, 1356, 1367, 1401, 1405, 1350, 0, + 0, 0, 0, 0, 0, 3272, 0, 1327, 0, 1376, + 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1354, 0, 0, + 0, 0, 1308, 0, 1328, 1402, 0, 1291, 300, 1302, + 405, 260, 0, 456, 1409, 1422, 1351, 632, 1424, 1349, + 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, 199, 227, + 0, 1339, 415, 464, 476, 1414, 1324, 1333, 256, 1331, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 1375, 1394, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 1303, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 1319, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 1410, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 1399, 1442, 428, 475, + 242, 609, 499, 201, 1313, 1318, 1311, 0, 257, 258, + 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, + 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 1403, + 1307, 0, 1316, 1317, 401, 1412, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 1374, 198, 223, 371, 1438, + 457, 291, 653, 621, 487, 616, 208, 225, 1310, 265, + 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, + 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, + 1441, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 1373, + 1379, 384, 284, 308, 323, 1388, 620, 505, 229, 469, + 293, 253, 1406, 1408, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 1369, 1397, + 379, 579, 580, 319, 399, 0, 0, 0, 0, 0, + 0, 1427, 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, + 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, + 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, 369, 270, + 1301, 1292, 206, 508, 1326, 433, 1342, 205, 1392, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 1436, 373, 1378, 0, 500, 404, 0, + 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, + 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 1334, + 1384, 612, 1426, 1335, 1386, 268, 324, 275, 267, 583, + 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, 0, 231, + 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, 0, 1296, + 1300, 1439, 1423, 1329, 278, 0, 0, 0, 0, 0, + 0, 0, 1356, 1367, 1401, 1405, 1350, 0, 0, 0, + 0, 0, 0, 3233, 0, 1327, 0, 1376, 0, 0, + 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1354, 0, 0, 0, 0, + 1308, 0, 1328, 1402, 0, 1291, 300, 1302, 405, 260, + 0, 456, 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, + 1306, 1415, 1341, 368, 1304, 333, 199, 227, 0, 1339, + 415, 464, 476, 1414, 1324, 1333, 256, 1331, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 1375, 1394, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 1303, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 1319, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 1410, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 1399, 1442, 428, 475, 242, 609, + 499, 201, 1313, 1318, 1311, 0, 257, 258, 1381, 578, + 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 1398, 1302, 0, 1311, 1312, - 399, 1407, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 1369, 196, 221, 369, 1433, 455, 289, 651, 619, - 485, 614, 206, 223, 1305, 263, 1317, 1325, 0, 1331, - 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, 1378, 1380, - 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 1368, 1374, 382, 282, 306, - 321, 1383, 618, 503, 227, 467, 291, 251, 1401, 1403, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 1364, 1392, 377, 577, 578, 317, - 397, 0, 0, 0, 0, 0, 0, 1422, 1406, 529, - 0, 1348, 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, - 1363, 417, 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, - 1315, 1408, 1367, 1424, 367, 268, 1296, 1287, 204, 506, - 1321, 431, 1337, 203, 1387, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 1431, - 371, 1373, 0, 498, 402, 0, 0, 0, 1412, 1411, - 1342, 1352, 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, - 1333, 1382, 1427, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 1329, 1379, 610, 1421, 1330, - 1381, 266, 322, 273, 265, 581, 1432, 1413, 1293, 1360, - 1420, 1355, 597, 0, 0, 229, 1423, 1354, 0, 1384, - 0, 1438, 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, - 276, 0, 0, 0, 0, 0, 0, 0, 1351, 1362, - 1396, 1400, 1345, 0, 0, 0, 0, 0, 0, 0, - 0, 1322, 0, 1371, 0, 0, 0, 1300, 1292, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1349, 0, 0, 0, 0, 1303, 0, 1323, 1397, - 0, 1286, 298, 1297, 403, 258, 0, 454, 1404, 1417, - 1346, 630, 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, - 1299, 331, 197, 225, 0, 1334, 413, 462, 474, 1409, - 1319, 1328, 254, 1326, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 1370, 1389, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 1298, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 1314, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 1405, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 1394, 1437, 426, 473, 240, 607, 497, 199, 1308, 1313, - 1306, 0, 255, 256, 1376, 576, 1309, 1307, 1365, 1366, - 1310, 1428, 1429, 1430, 1415, 655, 656, 657, 658, 659, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 1403, 1307, 0, + 1316, 1317, 401, 1412, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 1374, 198, 223, 371, 1438, 457, 291, + 653, 621, 487, 616, 208, 225, 1310, 265, 1322, 1330, + 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, + 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 1373, 1379, 384, + 284, 308, 323, 1388, 620, 505, 229, 469, 293, 253, + 1406, 1408, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 1369, 1397, 379, 579, + 580, 319, 399, 0, 0, 0, 0, 0, 0, 1427, + 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, 1343, 1346, + 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, 1295, 1323, + 1355, 273, 1320, 1413, 1372, 1429, 369, 270, 1301, 1292, + 206, 508, 1326, 433, 1342, 205, 1392, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 1436, 373, 1378, 0, 500, 404, 0, 0, 0, + 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, 1391, 1309, + 1377, 1431, 1338, 1387, 1432, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 962, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 1334, 1384, 612, + 1426, 1335, 1386, 268, 324, 275, 267, 583, 1437, 1418, + 1298, 1365, 1425, 1360, 599, 0, 0, 231, 1428, 1359, + 0, 1389, 0, 1443, 1293, 1380, 0, 1296, 1300, 1439, + 1423, 1329, 278, 0, 0, 0, 0, 0, 0, 0, + 1356, 1367, 1401, 1405, 1350, 0, 0, 0, 0, 0, + 0, 2424, 0, 1327, 0, 1376, 0, 0, 0, 1305, + 1297, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1354, 0, 0, 0, 0, 1308, 0, + 1328, 1402, 0, 1291, 300, 1302, 405, 260, 0, 456, + 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, 1306, 1415, + 1341, 368, 1304, 333, 199, 227, 0, 1339, 415, 464, + 476, 1414, 1324, 1333, 256, 1331, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 1375, 1394, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 1303, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 1319, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 1410, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 1399, 1442, 428, 475, 242, 609, 499, 201, + 1313, 1318, 1311, 0, 257, 258, 1381, 578, 1314, 1312, + 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 1398, 1302, 0, 1311, 1312, 399, 1407, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 1369, - 196, 221, 369, 1433, 455, 289, 651, 619, 485, 614, - 206, 223, 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, - 1353, 1356, 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, - 1393, 1395, 1402, 1416, 1436, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 1368, 1374, 382, 282, 306, 321, 1383, - 618, 503, 227, 467, 291, 251, 1401, 1403, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 1364, 1392, 377, 577, 578, 317, 397, 0, - 0, 0, 0, 0, 0, 1422, 1406, 529, 0, 1348, - 1425, 1316, 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, - 1332, 1320, 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, - 1367, 1424, 367, 268, 1296, 1287, 204, 506, 1321, 431, - 1337, 203, 1387, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 1431, 371, 1373, - 0, 498, 402, 0, 0, 0, 1412, 1411, 1342, 1352, - 1414, 1361, 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, - 1427, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 1329, 1379, 610, 1421, 1330, 1381, 266, - 322, 273, 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, - 597, 0, 0, 229, 1423, 1354, 0, 1384, 0, 1438, - 1288, 1375, 0, 1291, 1295, 1434, 1418, 1324, 276, 0, - 0, 0, 0, 0, 0, 0, 1351, 1362, 1396, 1400, - 1345, 0, 0, 0, 0, 0, 0, 0, 0, 1322, - 0, 1371, 0, 0, 0, 1300, 1292, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1349, - 0, 0, 0, 0, 1303, 0, 1323, 1397, 0, 1286, - 298, 1297, 403, 258, 0, 454, 1404, 1417, 1346, 630, - 1419, 1344, 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, - 197, 225, 0, 1334, 413, 462, 474, 1409, 1319, 1328, - 254, 1326, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 1370, 1389, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 1298, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 1314, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 1405, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 1394, 1437, - 426, 473, 240, 607, 497, 199, 1308, 1313, 1306, 0, - 255, 256, 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, - 1429, 1430, 1415, 655, 656, 657, 658, 659, 660, 661, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 1403, 1307, 0, 1316, 1317, + 401, 1412, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 1374, 198, 223, 371, 1438, 457, 291, 653, 621, + 487, 616, 208, 225, 1310, 265, 1322, 1330, 0, 1336, + 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, 1383, 1385, + 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 1373, 1379, 384, 284, 308, + 323, 1388, 620, 505, 229, 469, 293, 253, 1406, 1408, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 1369, 1397, 379, 579, 580, 319, + 399, 0, 0, 0, 0, 0, 0, 1427, 1411, 531, + 0, 1353, 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, + 1368, 419, 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, + 1320, 1413, 1372, 1429, 369, 270, 1301, 1292, 206, 508, + 1326, 433, 1342, 205, 1392, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 1436, + 373, 1378, 0, 500, 404, 0, 0, 0, 1417, 1416, + 1347, 1357, 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, + 1338, 1387, 1432, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 0, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 1334, 1384, 612, 1426, 1335, + 1386, 268, 324, 275, 267, 583, 1437, 1418, 1298, 1365, + 1425, 1360, 599, 0, 0, 231, 1428, 1359, 0, 1389, + 0, 1443, 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, + 278, 0, 0, 0, 0, 0, 0, 0, 1356, 1367, + 1401, 1405, 1350, 0, 0, 0, 0, 0, 0, 0, + 0, 1327, 0, 1376, 0, 0, 0, 1305, 1297, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1354, 0, 0, 0, 0, 1308, 0, 1328, 1402, + 0, 1291, 300, 1302, 405, 260, 0, 456, 1409, 1422, + 1351, 632, 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, + 1304, 333, 199, 227, 0, 1339, 415, 464, 476, 1414, + 1324, 1333, 256, 1331, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 1375, 1394, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 1303, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 1319, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 1410, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 1399, 1442, 428, 475, 242, 609, 499, 201, 1313, 1318, + 1311, 0, 257, 258, 1381, 578, 1314, 1312, 1370, 1371, + 1315, 1433, 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 1398, 1302, 0, 1311, 1312, 399, 1407, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 1369, 196, 221, - 369, 1433, 455, 289, 651, 619, 485, 614, 206, 223, - 1305, 263, 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, - 1357, 1358, 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, - 1402, 1416, 1436, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 1368, 1374, 382, 282, 306, 321, 1383, 618, 503, - 227, 467, 291, 251, 1401, 1403, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1364, 1392, 377, 577, 578, 317, 397, 0, 0, 0, - 0, 0, 0, 1422, 1406, 529, 0, 1348, 1425, 1316, - 1335, 1435, 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, - 1289, 1327, 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, - 367, 268, 1296, 1287, 204, 506, 1321, 431, 1337, 203, - 1387, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 1431, 371, 1373, 0, 498, - 402, 0, 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, - 1399, 1347, 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 1329, 1379, 610, 1421, 1330, 1381, 266, 322, 273, - 265, 581, 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, - 0, 229, 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, - 0, 1291, 1295, 1434, 1418, 1324, 276, 0, 0, 0, - 0, 0, 0, 0, 1351, 1362, 1396, 1400, 1345, 0, - 0, 0, 0, 0, 0, 0, 0, 1322, 0, 1371, - 0, 0, 0, 1300, 1292, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1349, 0, 0, - 0, 0, 1303, 0, 1323, 1397, 0, 1286, 298, 1297, - 403, 258, 0, 454, 1404, 1417, 1346, 630, 1419, 1344, - 1343, 1391, 1301, 1410, 1336, 366, 1299, 331, 197, 225, - 0, 1334, 413, 462, 474, 1409, 1319, 1328, 254, 1326, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 1370, 1389, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 1298, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 1314, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 1405, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 1394, 1437, 426, 473, - 240, 607, 497, 199, 1308, 1313, 1306, 0, 255, 256, - 1376, 576, 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, - 1415, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 1398, - 1302, 0, 1311, 1312, 399, 1407, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 1369, 196, 221, 369, 1433, - 455, 289, 651, 619, 485, 614, 206, 223, 1305, 263, - 1317, 1325, 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, - 1359, 1377, 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, - 1436, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 1368, - 1374, 382, 282, 306, 321, 1383, 618, 503, 227, 467, - 291, 251, 1401, 1403, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 1364, 1392, - 377, 577, 578, 317, 397, 0, 0, 0, 0, 0, - 0, 1422, 1406, 529, 0, 1348, 1425, 1316, 1335, 1435, - 1338, 1341, 1385, 1294, 1363, 417, 1332, 1320, 1289, 1327, - 1290, 1318, 1350, 271, 1315, 1408, 1367, 1424, 367, 268, - 1296, 1287, 204, 506, 1321, 431, 1337, 203, 1387, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 1431, 371, 1373, 0, 498, 402, 0, - 0, 0, 1412, 1411, 1342, 1352, 1414, 1361, 1399, 1347, - 1386, 1304, 1372, 1426, 1333, 1382, 1427, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 960, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 1329, - 1379, 610, 1421, 1330, 1381, 266, 322, 273, 265, 581, - 1432, 1413, 1293, 1360, 1420, 1355, 597, 0, 0, 229, - 1423, 1354, 0, 1384, 0, 1438, 1288, 1375, 0, 1291, - 1295, 1434, 1418, 1324, 276, 0, 0, 0, 0, 0, - 0, 0, 1351, 1362, 1396, 1400, 1345, 0, 0, 0, - 0, 0, 0, 0, 0, 1322, 0, 1371, 0, 0, - 0, 1300, 1292, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1349, 0, 0, 0, 0, - 1303, 0, 1323, 1397, 0, 1286, 298, 1297, 403, 258, - 0, 454, 1404, 1417, 1346, 630, 1419, 1344, 1343, 1391, - 1301, 1410, 1336, 366, 1299, 331, 197, 225, 0, 1334, - 413, 462, 474, 1409, 1319, 1328, 254, 1326, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 1370, 1389, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 1298, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 1314, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 1405, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 1394, 1437, 426, 473, 240, 607, - 497, 199, 1308, 1313, 1306, 0, 255, 256, 1376, 576, - 1309, 1307, 1365, 1366, 1310, 1428, 1429, 1430, 1415, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 1398, 1302, 0, - 1311, 1312, 399, 1407, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 1369, 196, 221, 369, 1433, 455, 289, - 651, 619, 485, 614, 206, 223, 1305, 263, 1317, 1325, - 0, 1331, 1339, 1340, 1353, 1356, 1357, 1358, 1359, 1377, - 1378, 1380, 1388, 1390, 1393, 1395, 1402, 1416, 1436, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 1368, 1374, 382, - 282, 306, 321, 1383, 618, 503, 227, 467, 291, 251, - 1401, 1403, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 1364, 1392, 377, 577, - 578, 317, 397, 0, 0, 0, 0, 0, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 749, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 2233, 2234, 2235, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 745, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 0, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 771, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 1403, 1307, 0, 1316, 1317, 401, 1412, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 1374, + 198, 223, 371, 1438, 457, 291, 653, 621, 487, 616, + 208, 225, 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, + 1358, 1361, 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, + 1398, 1400, 1407, 1421, 1441, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 1373, 1379, 384, 284, 308, 323, 1388, + 620, 505, 229, 469, 293, 253, 1406, 1408, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 1369, 1397, 379, 579, 580, 319, 399, 0, + 0, 0, 0, 0, 0, 1427, 1411, 531, 0, 1353, + 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, + 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, + 1372, 1429, 369, 270, 1301, 1292, 206, 508, 1326, 433, + 1342, 205, 1392, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 1436, 373, 1378, + 0, 500, 404, 0, 0, 0, 1417, 1416, 1347, 1357, + 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, + 1432, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 1334, 1384, 612, 1426, 1335, 1386, 268, + 324, 275, 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, + 599, 0, 0, 231, 1428, 1359, 0, 1389, 0, 1443, + 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, 278, 0, + 0, 0, 0, 0, 0, 0, 1356, 1367, 1401, 1405, + 1350, 0, 0, 0, 0, 0, 0, 0, 0, 1327, + 0, 1376, 0, 0, 0, 1305, 1297, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1354, + 0, 0, 0, 0, 1308, 0, 1328, 1402, 0, 1291, + 300, 1302, 405, 260, 0, 456, 1409, 1422, 1351, 632, + 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, + 199, 227, 0, 1339, 415, 464, 476, 1414, 1324, 1333, + 256, 1331, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 1375, 1394, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 1303, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 1319, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 1410, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 1399, 1442, + 428, 475, 242, 609, 499, 201, 1313, 1318, 1311, 0, + 257, 258, 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, + 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 1403, 1307, 0, 1316, 1317, 401, 1412, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 1374, 198, 223, + 371, 1438, 457, 291, 653, 621, 487, 616, 208, 225, + 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, + 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, + 1407, 1421, 1441, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 1373, 1379, 384, 284, 308, 323, 1388, 620, 505, + 229, 469, 293, 253, 1406, 1408, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 1369, 1397, 379, 579, 580, 319, 399, 0, 0, 0, + 0, 0, 0, 1427, 1411, 531, 0, 1353, 1430, 1321, + 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, + 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, + 369, 270, 1301, 1292, 206, 508, 1326, 433, 1342, 205, + 1392, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 1436, 373, 1378, 0, 500, + 404, 0, 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, + 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 1334, 1384, 612, 1426, 1335, 1386, 268, 324, 275, + 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, + 0, 231, 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, + 0, 1296, 1300, 1439, 1423, 1329, 278, 0, 0, 0, + 0, 0, 0, 0, 1356, 1367, 1401, 1405, 1350, 0, + 0, 0, 0, 0, 0, 0, 0, 1327, 0, 1376, + 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1354, 0, 0, + 0, 0, 1308, 0, 1328, 1402, 0, 1291, 300, 1302, + 405, 260, 0, 456, 1409, 1422, 1351, 632, 1424, 1349, + 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, 199, 227, + 0, 1339, 415, 464, 476, 1414, 1324, 1333, 256, 1331, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 1375, 1394, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 1303, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 1319, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 1410, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 1399, 1442, 428, 475, + 242, 609, 499, 201, 1313, 1318, 1311, 0, 257, 258, + 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, + 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 1403, + 1307, 0, 1316, 1317, 401, 1412, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 1374, 198, 223, 371, 1438, + 457, 291, 653, 621, 487, 616, 208, 225, 1310, 265, + 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, + 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, + 1441, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 1373, + 1379, 384, 284, 308, 323, 1388, 620, 505, 229, 469, + 293, 253, 1406, 1408, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 1369, 1397, + 379, 579, 580, 319, 399, 0, 0, 0, 0, 0, + 0, 1427, 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, + 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, + 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, 369, 270, + 1301, 1292, 206, 508, 1326, 433, 1342, 205, 1392, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 1436, 373, 1378, 0, 500, 404, 0, + 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, + 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 1334, + 1384, 612, 1426, 1335, 1386, 268, 324, 275, 267, 583, + 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, 0, 231, + 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, 0, 1296, + 1300, 1439, 1423, 1329, 278, 0, 0, 0, 0, 0, + 0, 0, 1356, 1367, 1401, 1405, 1350, 0, 0, 0, + 0, 0, 0, 0, 0, 1327, 0, 1376, 0, 0, + 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1354, 0, 0, 0, 0, + 1308, 0, 1328, 1402, 0, 1291, 300, 1302, 405, 260, + 0, 456, 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, + 1306, 1415, 1341, 368, 1304, 333, 199, 227, 0, 1339, + 415, 464, 476, 1414, 1324, 1333, 256, 1331, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 1375, 1394, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 1303, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 1319, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 1410, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 1399, 1442, 428, 475, 242, 609, + 499, 201, 1313, 1318, 1311, 0, 257, 258, 1381, 578, + 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 2440, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 749, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 2441, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 745, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 771, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 86, 529, 0, 778, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 765, 0, 0, 0, 271, 770, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 777, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 772, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 95, 0, 0, - 1024, 508, 960, 749, 926, 964, 1025, 977, 978, 979, - 965, 0, 238, 966, 967, 245, 968, 0, 925, 808, - 810, 809, 875, 876, 877, 878, 879, 880, 881, 811, - 812, 806, 973, 610, 980, 981, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 745, - 762, 0, 776, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 759, 760, 0, 0, 0, 0, 920, - 0, 761, 0, 0, 769, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 771, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 919, 0, 0, 630, 0, 0, - 917, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 970, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 971, - 972, 257, 653, 816, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 824, 825, - 281, 308, 901, 900, 899, 307, 309, 897, 898, 896, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 907, 929, 918, 782, 783, 908, 909, - 933, 910, 785, 786, 930, 931, 779, 780, 784, 932, - 934, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 921, - 768, 767, 0, 774, 775, 0, 804, 805, 807, 813, - 814, 815, 826, 873, 874, 882, 884, 885, 883, 886, - 887, 888, 891, 892, 893, 894, 889, 890, 895, 787, - 791, 788, 789, 790, 802, 792, 793, 794, 795, 796, - 797, 798, 799, 800, 801, 803, 944, 945, 946, 947, - 948, 949, 819, 823, 822, 820, 821, 817, 818, 845, - 844, 846, 847, 848, 849, 850, 851, 853, 852, 854, - 855, 856, 857, 858, 859, 827, 828, 831, 832, 830, - 829, 833, 842, 843, 834, 835, 836, 837, 838, 839, - 841, 840, 860, 861, 862, 863, 864, 866, 865, 869, - 870, 868, 867, 872, 871, 766, 196, 221, 369, 94, - 455, 289, 651, 619, 485, 614, 206, 223, 935, 263, - 936, 0, 0, 940, 0, 0, 0, 942, 941, 0, - 943, 905, 904, 0, 0, 937, 938, 0, 939, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 950, 951, 952, 953, 954, 955, 956, - 957, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 975, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 778, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 765, 0, 0, 0, 271, 770, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 777, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 773, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 1024, 508, 960, 749, 926, 964, 1025, 977, - 978, 979, 965, 0, 238, 966, 967, 245, 968, 0, - 925, 808, 810, 809, 875, 876, 877, 878, 879, 880, - 881, 811, 812, 806, 973, 610, 980, 981, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 745, 762, 0, 776, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 759, 760, 0, 0, 0, - 0, 920, 0, 761, 0, 0, 769, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 771, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 919, 0, 0, 630, - 0, 0, 917, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 970, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 4098, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 971, 972, 257, 653, 816, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 824, 825, 281, 308, 901, 900, 899, 307, 309, 897, - 898, 896, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 907, 929, 918, 782, 783, - 908, 909, 933, 910, 785, 786, 930, 931, 779, 780, - 784, 932, 934, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 1403, 1307, 0, + 1316, 1317, 401, 1412, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 1374, 198, 223, 371, 1438, 457, 291, + 653, 621, 487, 616, 208, 225, 1310, 265, 1322, 1330, + 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, + 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 1373, 1379, 384, + 284, 308, 323, 1388, 620, 505, 229, 469, 293, 253, + 1406, 1408, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 1369, 1397, 379, 579, + 580, 319, 399, 0, 0, 0, 0, 0, 0, 0, + 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, + 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 95, 0, 0, 1028, 510, 962, 751, + 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, + 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, + 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, + 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, + 2244, 2245, 2246, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 747, 764, 0, 778, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, + 762, 0, 0, 0, 0, 922, 0, 763, 0, 0, + 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 773, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, + 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, + 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, + 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, + 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, + 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, + 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, + 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, + 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, + 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, + 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, + 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, + 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, + 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, + 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, + 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, + 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, + 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, + 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, + 0, 0, 0, 0, 0, 2453, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, + 962, 751, 928, 966, 1029, 980, 981, 982, 967, 0, + 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, + 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, + 975, 612, 983, 984, 2454, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 747, 764, 0, + 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, + 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 773, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, + 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, + 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, + 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, + 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, + 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, + 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, + 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, + 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, + 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, + 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, + 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, + 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, + 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, + 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, + 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 86, 531, 0, 780, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 767, 0, 0, 0, 273, 772, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 1723, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 774, + 775, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 95, 0, 0, + 1028, 510, 962, 751, 928, 966, 1029, 980, 981, 982, + 967, 0, 240, 968, 969, 247, 970, 0, 927, 810, + 812, 811, 877, 878, 879, 880, 881, 882, 883, 813, + 814, 808, 975, 612, 983, 984, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 747, + 764, 0, 778, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 761, 762, 0, 0, 0, 0, 922, + 0, 763, 0, 0, 771, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 1023, 1024, 1025, 1026, 773, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 921, 0, 0, 632, 0, 0, + 919, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 972, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 973, + 974, 259, 655, 818, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 826, 827, + 283, 310, 903, 902, 901, 309, 311, 899, 900, 898, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 909, 931, 920, 784, 785, 910, 911, + 935, 912, 787, 788, 932, 933, 781, 782, 786, 934, + 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 923, + 770, 769, 0, 776, 777, 0, 806, 807, 809, 815, + 816, 817, 828, 875, 876, 884, 886, 887, 885, 888, + 889, 890, 893, 894, 895, 896, 891, 892, 897, 789, + 793, 790, 791, 792, 804, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 805, 946, 947, 948, 949, + 950, 951, 821, 825, 824, 822, 823, 819, 820, 847, + 846, 848, 849, 850, 851, 852, 853, 855, 854, 856, + 857, 858, 859, 860, 861, 829, 830, 833, 834, 832, + 831, 835, 844, 845, 836, 837, 838, 839, 840, 841, + 843, 842, 862, 863, 864, 865, 866, 868, 867, 871, + 872, 870, 869, 874, 873, 768, 198, 223, 371, 94, + 457, 291, 653, 621, 487, 616, 208, 225, 937, 265, + 938, 0, 0, 942, 0, 0, 0, 944, 943, 0, + 945, 907, 906, 0, 0, 939, 940, 0, 941, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 952, 953, 954, 955, 956, 957, 958, + 959, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 1027, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 780, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 767, 0, 0, 0, 273, 772, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 779, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 774, 775, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, + 0, 0, 1028, 510, 962, 751, 928, 966, 1029, 980, + 981, 982, 967, 0, 240, 968, 969, 247, 970, 0, + 927, 810, 812, 811, 877, 878, 879, 880, 881, 882, + 883, 813, 814, 808, 975, 612, 983, 984, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 747, 764, 0, 778, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 761, 762, 0, 0, 0, + 0, 922, 0, 763, 0, 0, 771, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, + 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 773, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 921, 0, 0, 632, + 0, 0, 919, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 972, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 4113, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 973, 974, 259, 655, 818, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 826, 827, 283, 310, 903, 902, 901, 309, 311, 899, + 900, 898, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 909, 931, 920, 784, 785, + 910, 911, 935, 912, 787, 788, 932, 933, 781, 782, + 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 923, 770, 769, 0, 776, 777, 0, 806, 807, + 809, 815, 816, 817, 828, 875, 876, 884, 886, 887, + 885, 888, 889, 890, 893, 894, 895, 896, 891, 892, + 897, 789, 793, 790, 791, 792, 804, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 805, 946, 947, + 948, 949, 950, 951, 821, 825, 824, 822, 823, 819, + 820, 847, 846, 848, 849, 850, 851, 852, 853, 855, + 854, 856, 857, 858, 859, 860, 861, 829, 830, 833, + 834, 832, 831, 835, 844, 845, 836, 837, 838, 839, + 840, 841, 843, 842, 862, 863, 864, 865, 866, 868, + 867, 871, 872, 870, 869, 874, 873, 768, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 937, 265, 938, 0, 0, 942, 0, 0, 0, 944, + 943, 0, 945, 907, 906, 0, 0, 939, 940, 0, + 941, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 952, 953, 954, 955, 956, + 957, 958, 959, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 1027, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 780, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 767, 0, 0, 0, 273, + 772, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 779, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 774, 775, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 1760, 1028, 510, 962, 751, 928, 966, + 1029, 980, 981, 982, 967, 0, 240, 968, 969, 247, + 970, 0, 927, 810, 812, 811, 877, 878, 879, 880, + 881, 882, 883, 813, 814, 808, 975, 612, 983, 984, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 747, 764, 0, 778, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 761, 762, 0, + 0, 0, 0, 922, 0, 763, 0, 0, 771, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 773, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 921, 0, + 0, 632, 0, 0, 919, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 972, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 973, 974, 259, 655, 818, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 826, 827, 283, 310, 903, 902, 901, 309, + 311, 899, 900, 898, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 909, 931, 920, + 784, 785, 910, 911, 935, 912, 787, 788, 932, 933, + 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 921, 768, 767, 0, 774, 775, 0, 804, 805, - 807, 813, 814, 815, 826, 873, 874, 882, 884, 885, - 883, 886, 887, 888, 891, 892, 893, 894, 889, 890, - 895, 787, 791, 788, 789, 790, 802, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 803, 944, 945, - 946, 947, 948, 949, 819, 823, 822, 820, 821, 817, - 818, 845, 844, 846, 847, 848, 849, 850, 851, 853, - 852, 854, 855, 856, 857, 858, 859, 827, 828, 831, - 832, 830, 829, 833, 842, 843, 834, 835, 836, 837, - 838, 839, 841, 840, 860, 861, 862, 863, 864, 866, - 865, 869, 870, 868, 867, 872, 871, 766, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 935, 263, 936, 0, 0, 940, 0, 0, 0, 942, - 941, 0, 943, 905, 904, 0, 0, 937, 938, 0, - 939, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 950, 951, 952, 953, 954, - 955, 956, 957, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 975, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 765, 0, 0, 0, 271, - 770, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 777, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 772, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 1754, 1024, 508, 960, 749, 926, 964, - 1025, 977, 978, 979, 965, 0, 238, 966, 967, 245, - 968, 0, 925, 808, 810, 809, 875, 876, 877, 878, - 879, 880, 881, 811, 812, 806, 973, 610, 980, 981, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 745, 762, 0, 776, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 760, 0, - 0, 0, 0, 920, 0, 761, 0, 0, 769, 982, - 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, - 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 771, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 919, 0, - 0, 630, 0, 0, 917, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 970, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 971, 972, 257, 653, 816, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 824, 825, 281, 308, 901, 900, 899, 307, - 309, 897, 898, 896, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 907, 929, 918, - 782, 783, 908, 909, 933, 910, 785, 786, 930, 931, - 779, 780, 784, 932, 934, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 923, 770, 769, 0, 776, 777, 0, + 806, 807, 809, 815, 816, 817, 828, 875, 876, 884, + 886, 887, 885, 888, 889, 890, 893, 894, 895, 896, + 891, 892, 897, 789, 793, 790, 791, 792, 804, 794, + 795, 796, 797, 798, 799, 800, 801, 802, 803, 805, + 946, 947, 948, 949, 950, 951, 821, 825, 824, 822, + 823, 819, 820, 847, 846, 848, 849, 850, 851, 852, + 853, 855, 854, 856, 857, 858, 859, 860, 861, 829, + 830, 833, 834, 832, 831, 835, 844, 845, 836, 837, + 838, 839, 840, 841, 843, 842, 862, 863, 864, 865, + 866, 868, 867, 871, 872, 870, 869, 874, 873, 768, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 937, 265, 938, 0, 0, 942, 0, 0, + 0, 944, 943, 0, 945, 907, 906, 0, 0, 939, + 940, 0, 941, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 952, 953, 954, + 955, 956, 957, 958, 959, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 1027, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, + 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 95, 0, 0, 1028, 510, 962, 751, + 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, + 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, + 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, + 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 747, 764, 0, 778, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, + 762, 1075, 0, 0, 0, 922, 0, 763, 0, 0, + 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 773, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, + 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, + 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, + 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 921, 768, 767, 0, 774, 775, 0, - 804, 805, 807, 813, 814, 815, 826, 873, 874, 882, - 884, 885, 883, 886, 887, 888, 891, 892, 893, 894, - 889, 890, 895, 787, 791, 788, 789, 790, 802, 792, - 793, 794, 795, 796, 797, 798, 799, 800, 801, 803, - 944, 945, 946, 947, 948, 949, 819, 823, 822, 820, - 821, 817, 818, 845, 844, 846, 847, 848, 849, 850, - 851, 853, 852, 854, 855, 856, 857, 858, 859, 827, - 828, 831, 832, 830, 829, 833, 842, 843, 834, 835, - 836, 837, 838, 839, 841, 840, 860, 861, 862, 863, - 864, 866, 865, 869, 870, 868, 867, 872, 871, 766, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 935, 263, 936, 0, 0, 940, 0, 0, - 0, 942, 941, 0, 943, 905, 904, 0, 0, 937, - 938, 0, 939, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 950, 951, 952, - 953, 954, 955, 956, 957, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 975, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 749, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 745, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 1070, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 771, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, + 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, + 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, + 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, + 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, + 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, + 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, + 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, + 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, + 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, + 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, + 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, + 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, + 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, + 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, + 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, + 962, 751, 928, 966, 1029, 980, 981, 982, 967, 0, + 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, + 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, + 975, 612, 983, 984, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 747, 764, 0, + 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, + 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 773, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, + 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, + 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, + 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 749, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 745, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 771, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 778, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 765, 0, 0, 0, 271, 770, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 777, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 772, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 95, 0, 0, - 1024, 508, 960, 749, 926, 964, 1025, 977, 978, 979, - 965, 0, 238, 966, 967, 245, 968, 0, 925, 808, - 810, 809, 875, 876, 877, 878, 879, 880, 881, 811, - 812, 806, 973, 610, 980, 981, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 745, - 762, 0, 776, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 759, 760, 0, 0, 0, 0, 920, - 0, 761, 0, 0, 769, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 3174, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 919, 0, 0, 630, 0, 0, - 917, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 970, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 971, - 972, 257, 653, 816, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 824, 825, - 281, 308, 901, 900, 899, 307, 309, 897, 898, 896, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 907, 929, 918, 782, 783, 908, 909, - 933, 910, 785, 786, 930, 931, 779, 780, 784, 932, - 934, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 921, - 768, 767, 0, 774, 775, 0, 804, 805, 807, 813, - 814, 815, 826, 873, 874, 882, 884, 885, 883, 886, - 887, 888, 891, 892, 893, 894, 889, 890, 895, 787, - 791, 788, 789, 790, 802, 792, 793, 794, 795, 796, - 797, 798, 799, 800, 801, 803, 944, 945, 946, 947, - 948, 949, 819, 823, 822, 820, 821, 817, 818, 845, - 844, 846, 847, 848, 849, 850, 851, 853, 852, 854, - 855, 856, 857, 858, 859, 827, 828, 831, 832, 830, - 829, 833, 842, 843, 834, 835, 836, 837, 838, 839, - 841, 840, 860, 861, 862, 863, 864, 866, 865, 869, - 870, 868, 867, 872, 871, 766, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 935, 263, - 936, 0, 0, 940, 0, 0, 0, 942, 941, 0, - 943, 905, 904, 0, 0, 937, 938, 0, 939, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 950, 951, 952, 953, 954, 955, 956, - 957, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 975, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 778, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 765, 0, 0, 0, 271, 770, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 777, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 772, 773, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 1024, 508, 960, 749, 926, 964, 1025, 977, - 978, 979, 965, 0, 238, 966, 967, 245, 968, 0, - 925, 808, 810, 809, 875, 876, 877, 878, 879, 880, - 881, 811, 812, 806, 973, 610, 980, 981, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 745, 762, 0, 776, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 759, 760, 0, 0, 0, - 0, 920, 0, 761, 0, 0, 769, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 3170, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 919, 0, 0, 630, - 0, 0, 917, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 970, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 971, 972, 257, 653, 816, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 824, 825, 281, 308, 901, 900, 899, 307, 309, 897, - 898, 896, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 907, 929, 918, 782, 783, - 908, 909, 933, 910, 785, 786, 930, 931, 779, 780, - 784, 932, 934, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, + 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, + 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, + 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, + 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, + 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, + 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, + 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, + 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, + 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, + 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, + 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, + 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 780, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 767, 0, 0, 0, 273, 772, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 779, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 774, + 775, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 95, 0, 0, + 1028, 510, 962, 751, 928, 966, 1029, 980, 981, 982, + 967, 0, 240, 968, 969, 247, 970, 0, 927, 810, + 812, 811, 877, 878, 879, 880, 881, 882, 883, 813, + 814, 808, 975, 612, 983, 984, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 747, + 764, 0, 778, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 761, 762, 0, 0, 0, 0, 922, + 0, 763, 0, 0, 771, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 1023, 1024, 1025, 1026, 3189, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 921, 0, 0, 632, 0, 0, + 919, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 972, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 973, + 974, 259, 655, 818, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 826, 827, + 283, 310, 903, 902, 901, 309, 311, 899, 900, 898, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 909, 931, 920, 784, 785, 910, 911, + 935, 912, 787, 788, 932, 933, 781, 782, 786, 934, + 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 923, + 770, 769, 0, 776, 777, 0, 806, 807, 809, 815, + 816, 817, 828, 875, 876, 884, 886, 887, 885, 888, + 889, 890, 893, 894, 895, 896, 891, 892, 897, 789, + 793, 790, 791, 792, 804, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 805, 946, 947, 948, 949, + 950, 951, 821, 825, 824, 822, 823, 819, 820, 847, + 846, 848, 849, 850, 851, 852, 853, 855, 854, 856, + 857, 858, 859, 860, 861, 829, 830, 833, 834, 832, + 831, 835, 844, 845, 836, 837, 838, 839, 840, 841, + 843, 842, 862, 863, 864, 865, 866, 868, 867, 871, + 872, 870, 869, 874, 873, 768, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 937, 265, + 938, 0, 0, 942, 0, 0, 0, 944, 943, 0, + 945, 907, 906, 0, 0, 939, 940, 0, 941, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 952, 953, 954, 955, 956, 957, 958, + 959, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 1027, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 780, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 767, 0, 0, 0, 273, 772, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 779, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 774, 775, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, + 0, 0, 1028, 510, 962, 751, 928, 966, 1029, 980, + 981, 982, 967, 0, 240, 968, 969, 247, 970, 0, + 927, 810, 812, 811, 877, 878, 879, 880, 881, 882, + 883, 813, 814, 808, 975, 612, 983, 984, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 747, 764, 0, 778, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 761, 762, 0, 0, 0, + 0, 922, 0, 763, 0, 0, 771, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, + 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 3185, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 921, 0, 0, 632, + 0, 0, 919, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 972, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 973, 974, 259, 655, 818, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 826, 827, 283, 310, 903, 902, 901, 309, 311, 899, + 900, 898, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 909, 931, 920, 784, 785, + 910, 911, 935, 912, 787, 788, 932, 933, 781, 782, + 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 923, 770, 769, 0, 776, 777, 0, 806, 807, + 809, 815, 816, 817, 828, 875, 876, 884, 886, 887, + 885, 888, 889, 890, 893, 894, 895, 896, 891, 892, + 897, 789, 793, 790, 791, 792, 804, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 805, 946, 947, + 948, 949, 950, 951, 821, 825, 824, 822, 823, 819, + 820, 847, 846, 848, 849, 850, 851, 852, 853, 855, + 854, 856, 857, 858, 859, 860, 861, 829, 830, 833, + 834, 832, 831, 835, 844, 845, 836, 837, 838, 839, + 840, 841, 843, 842, 862, 863, 864, 865, 866, 868, + 867, 871, 872, 870, 869, 874, 873, 768, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 937, 265, 938, 0, 0, 942, 0, 0, 0, 944, + 943, 0, 945, 907, 906, 0, 0, 939, 940, 0, + 941, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 952, 953, 954, 955, 956, + 957, 958, 959, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 1027, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 780, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 767, 0, 0, 0, 273, + 772, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 779, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 774, 775, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 0, 1028, 510, 962, 1096, 928, 966, + 1029, 980, 981, 982, 967, 0, 240, 968, 969, 247, + 970, 0, 927, 810, 812, 811, 877, 878, 879, 880, + 881, 882, 883, 813, 814, 808, 975, 612, 983, 984, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 764, 0, 778, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 761, 762, 0, + 0, 0, 0, 922, 0, 763, 0, 0, 771, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 773, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 921, 0, + 0, 632, 0, 0, 919, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 972, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 973, 974, 259, 655, 818, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 826, 827, 283, 310, 903, 902, 901, 309, + 311, 899, 900, 898, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 909, 931, 920, + 784, 785, 910, 911, 935, 912, 787, 788, 932, 933, + 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 921, 768, 767, 0, 774, 775, 0, 804, 805, - 807, 813, 814, 815, 826, 873, 874, 882, 884, 885, - 883, 886, 887, 888, 891, 892, 893, 894, 889, 890, - 895, 787, 791, 788, 789, 790, 802, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 803, 944, 945, - 946, 947, 948, 949, 819, 823, 822, 820, 821, 817, - 818, 845, 844, 846, 847, 848, 849, 850, 851, 853, - 852, 854, 855, 856, 857, 858, 859, 827, 828, 831, - 832, 830, 829, 833, 842, 843, 834, 835, 836, 837, - 838, 839, 841, 840, 860, 861, 862, 863, 864, 866, - 865, 869, 870, 868, 867, 872, 871, 766, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 935, 263, 936, 0, 0, 940, 0, 0, 0, 942, - 941, 0, 943, 905, 904, 0, 0, 937, 938, 0, - 939, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 950, 951, 952, 953, 954, - 955, 956, 957, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 975, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 765, 0, 0, 0, 271, - 770, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 777, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 772, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 1024, 508, 960, 1091, 926, 964, - 1025, 977, 978, 979, 965, 0, 238, 966, 967, 245, - 968, 0, 925, 808, 810, 809, 875, 876, 877, 878, - 879, 880, 881, 811, 812, 806, 973, 610, 980, 981, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 762, 0, 776, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 760, 0, - 0, 0, 0, 920, 0, 761, 0, 0, 769, 982, - 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, - 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, - 1023, 771, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 919, 0, - 0, 630, 0, 0, 917, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 970, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 971, 972, 257, 653, 816, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 824, 825, 281, 308, 901, 900, 899, 307, - 309, 897, 898, 896, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 907, 929, 918, - 782, 783, 908, 909, 933, 910, 785, 786, 930, 931, - 779, 780, 784, 932, 934, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 923, 770, 769, 0, 776, 777, 0, + 806, 807, 809, 815, 816, 817, 828, 875, 876, 884, + 886, 887, 885, 888, 889, 890, 893, 894, 895, 896, + 891, 892, 897, 789, 793, 790, 791, 792, 804, 794, + 795, 796, 797, 798, 799, 800, 801, 802, 803, 805, + 946, 947, 948, 949, 950, 951, 821, 825, 824, 822, + 823, 819, 820, 847, 846, 848, 849, 850, 851, 852, + 853, 855, 854, 856, 857, 858, 859, 860, 861, 829, + 830, 833, 834, 832, 831, 835, 844, 845, 836, 837, + 838, 839, 840, 841, 843, 842, 862, 863, 864, 865, + 866, 868, 867, 871, 872, 870, 869, 874, 873, 768, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 937, 265, 938, 0, 0, 942, 0, 0, + 0, 944, 943, 0, 945, 907, 906, 0, 0, 939, + 940, 0, 941, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 952, 953, 954, + 955, 956, 957, 958, 959, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 1027, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, + 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 95, 0, 0, 1028, 510, 962, 1096, + 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, + 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, + 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, + 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 764, 0, 778, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, + 762, 0, 0, 0, 0, 922, 0, 763, 0, 0, + 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 2135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, + 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, + 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, + 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 921, 768, 767, 0, 774, 775, 0, - 804, 805, 807, 813, 814, 815, 826, 873, 874, 882, - 884, 885, 883, 886, 887, 888, 891, 892, 893, 894, - 889, 890, 895, 787, 791, 788, 789, 790, 802, 792, - 793, 794, 795, 796, 797, 798, 799, 800, 801, 803, - 944, 945, 946, 947, 948, 949, 819, 823, 822, 820, - 821, 817, 818, 845, 844, 846, 847, 848, 849, 850, - 851, 853, 852, 854, 855, 856, 857, 858, 859, 827, - 828, 831, 832, 830, 829, 833, 842, 843, 834, 835, - 836, 837, 838, 839, 841, 840, 860, 861, 862, 863, - 864, 866, 865, 869, 870, 868, 867, 872, 871, 766, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 935, 263, 936, 0, 0, 940, 0, 0, - 0, 942, 941, 0, 943, 905, 904, 0, 0, 937, - 938, 0, 939, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 950, 951, 952, - 953, 954, 955, 956, 957, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 975, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 778, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 765, 0, 0, - 0, 271, 770, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 777, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 772, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 0, 1024, 508, 960, 1091, - 926, 964, 1025, 977, 978, 979, 965, 0, 238, 966, - 967, 245, 968, 0, 925, 808, 810, 809, 875, 876, - 877, 878, 879, 880, 881, 811, 812, 806, 973, 610, - 980, 981, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 762, 0, 776, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 760, 0, 0, 0, 0, 920, 0, 761, 0, 0, - 769, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 2124, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 919, 0, 0, 630, 0, 0, 917, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 970, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 971, 972, 257, 653, 816, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 824, 825, 281, 308, 901, 900, - 899, 307, 309, 897, 898, 896, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 907, - 929, 918, 782, 783, 908, 909, 933, 910, 785, 786, - 930, 931, 779, 780, 784, 932, 934, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, + 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, + 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, + 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, + 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, + 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, + 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, + 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, + 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, + 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, + 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, + 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, + 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, + 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, + 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, + 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, + 962, 1096, 928, 966, 1029, 980, 981, 982, 967, 0, + 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, + 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, + 975, 612, 983, 984, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, + 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, + 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 2133, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, + 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, + 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, + 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 921, 768, 767, 0, 774, - 775, 0, 804, 805, 807, 813, 814, 815, 826, 873, - 874, 882, 884, 885, 883, 886, 887, 888, 891, 892, - 893, 894, 889, 890, 895, 787, 791, 788, 789, 790, - 802, 792, 793, 794, 795, 796, 797, 798, 799, 800, - 801, 803, 944, 945, 946, 947, 948, 949, 819, 823, - 822, 820, 821, 817, 818, 845, 844, 846, 847, 848, - 849, 850, 851, 853, 852, 854, 855, 856, 857, 858, - 859, 827, 828, 831, 832, 830, 829, 833, 842, 843, - 834, 835, 836, 837, 838, 839, 841, 840, 860, 861, - 862, 863, 864, 866, 865, 869, 870, 868, 867, 872, - 871, 766, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 935, 263, 936, 0, 0, 940, - 0, 0, 0, 942, 941, 0, 943, 905, 904, 0, - 0, 937, 938, 0, 939, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 950, - 951, 952, 953, 954, 955, 956, 957, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 975, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 778, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 765, - 0, 0, 0, 271, 770, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 777, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 772, 773, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 1024, 508, - 960, 1091, 926, 964, 1025, 977, 978, 979, 965, 0, - 238, 966, 967, 245, 968, 0, 925, 808, 810, 809, - 875, 876, 877, 878, 879, 880, 881, 811, 812, 806, - 973, 610, 980, 981, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, - 776, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 759, 760, 0, 0, 0, 0, 920, 0, 761, - 0, 0, 769, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, - 1019, 1020, 1021, 1022, 1023, 2122, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 919, 0, 0, 630, 0, 0, 917, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 970, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 971, 972, 257, - 653, 816, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 824, 825, 281, 308, - 901, 900, 899, 307, 309, 897, 898, 896, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 907, 929, 918, 782, 783, 908, 909, 933, 910, - 785, 786, 930, 931, 779, 780, 784, 932, 934, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 921, 768, 767, - 0, 774, 775, 0, 804, 805, 807, 813, 814, 815, - 826, 873, 874, 882, 884, 885, 883, 886, 887, 888, - 891, 892, 893, 894, 889, 890, 895, 787, 791, 788, - 789, 790, 802, 792, 793, 794, 795, 796, 797, 798, - 799, 800, 801, 803, 944, 945, 946, 947, 948, 949, - 819, 823, 822, 820, 821, 817, 818, 845, 844, 846, - 847, 848, 849, 850, 851, 853, 852, 854, 855, 856, - 857, 858, 859, 827, 828, 831, 832, 830, 829, 833, - 842, 843, 834, 835, 836, 837, 838, 839, 841, 840, - 860, 861, 862, 863, 864, 866, 865, 869, 870, 868, - 867, 872, 871, 766, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 935, 263, 936, 0, - 0, 940, 0, 0, 0, 942, 941, 0, 943, 905, - 904, 0, 0, 937, 938, 0, 939, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 950, 951, 952, 953, 954, 955, 956, 957, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 975, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 1142, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 1141, 630, 0, 0, - 0, 0, 0, 1138, 1139, 366, 1099, 331, 197, 225, - 1132, 1136, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 86, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 95, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, + 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, + 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, + 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, + 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, + 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, + 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, + 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, + 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, + 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, + 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, + 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, + 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 1147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 1146, 632, 0, 0, + 0, 0, 0, 1143, 1144, 368, 1104, 333, 199, 227, + 1137, 1141, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 86, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 97, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, + 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 94, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 2440, 0, + 0, 2439, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 86, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 97, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 1760, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 94, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 2427, 0, - 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 1777, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 1779, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1781, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 1480, - 0, 1481, 1482, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 94, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 1788, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 1790, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 1792, 510, 727, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 1485, 0, 1486, 1487, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 86, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 95, 0, 1754, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 95, 0, 0, 0, 510, + 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 94, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 95, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 2427, 0, 0, 2426, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 2374, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 1962, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 2372, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 1093, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 1099, 331, - 197, 225, 1097, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 2440, 0, 0, 2439, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 2385, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 1973, 510, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 2383, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 1098, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 1104, 333, + 199, 227, 1102, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 2385, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 0, 0, 0, 1973, 510, 196, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 2374, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1962, 508, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 1760, 0, 510, 727, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 3744, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 1754, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 3729, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 2144, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2145, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 2133, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2134, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 2881, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2882, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 2866, - 0, 0, 0, 0, 238, 0, 0, 245, 2867, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 2896, 510, 727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2897, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 727, 0, 0, 0, 0, 2879, + 0, 0, 0, 0, 240, 0, 0, 247, 2880, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 1811, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 0, 0, 0, 1810, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 1800, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 1799, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 729, 730, + 731, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 727, 728, - 729, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 4088, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 4073, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 1962, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 3729, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 1973, 510, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 3744, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 0, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 2441, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 196, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 2428, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 1792, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 1781, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 2080, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 2071, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 2091, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 2082, 510, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 1940, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 1929, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 1938, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 727, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 1927, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 1936, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 1925, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 1923, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 1921, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 1934, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 1932, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 1928, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 1917, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 1926, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 727, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 1915, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 725, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 1924, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 1913, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 1888, 0, 0, - 0, 508, 725, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 0, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 1785, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 1899, 0, 0, + 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 1796, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 95, 0, 0, 0, 510, 962, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 410, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 95, 0, 0, 0, 508, 960, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 196, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1462, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1457, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 1461, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 1456, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1050, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 397, 0, 377, 577, - 578, 317, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, - 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, - 367, 268, 0, 0, 204, 506, 0, 431, 0, 203, - 0, 488, 253, 378, 375, 584, 283, 274, 270, 250, - 318, 386, 429, 519, 423, 0, 371, 0, 0, 498, - 402, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, - 248, 326, 202, 414, 499, 287, 0, 0, 0, 0, - 0, 508, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 0, 245, 0, 0, 0, 352, - 361, 360, 340, 341, 343, 345, 351, 358, 364, 337, - 346, 0, 0, 610, 0, 0, 0, 266, 322, 273, - 265, 581, 0, 0, 0, 0, 0, 0, 597, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, - 403, 258, 0, 454, 0, 676, 0, 630, 0, 0, - 0, 0, 0, 0, 0, 366, 0, 331, 197, 225, - 0, 0, 413, 462, 474, 0, 0, 0, 254, 0, - 472, 427, 605, 233, 285, 459, 433, 470, 441, 288, - 0, 0, 471, 373, 586, 451, 602, 631, 632, 264, - 407, 616, 523, 624, 649, 226, 261, 421, 507, 608, - 495, 398, 582, 583, 330, 494, 296, 201, 370, 637, - 224, 480, 372, 242, 231, 588, 613, 300, 252, 290, - 457, 644, 213, 518, 599, 239, 484, 0, 0, 652, - 247, 505, 611, 600, 215, 595, 504, 394, 327, 328, - 214, 0, 458, 269, 294, 0, 0, 259, 416, 590, - 591, 257, 653, 228, 623, 220, 0, 622, 409, 585, - 596, 395, 384, 219, 594, 393, 383, 335, 356, 357, - 281, 308, 448, 376, 449, 307, 309, 405, 404, 406, - 207, 609, 627, 0, 208, 0, 500, 612, 654, 453, - 212, 234, 235, 237, 0, 280, 284, 292, 295, 304, - 305, 314, 368, 420, 447, 443, 452, 0, 580, 603, - 617, 629, 635, 636, 638, 639, 640, 641, 642, 645, - 643, 408, 312, 496, 334, 374, 0, 0, 426, 473, - 240, 607, 497, 199, 0, 0, 0, 0, 255, 256, - 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 650, - 509, 515, 510, 511, 512, 513, 514, 0, 516, 0, - 0, 0, 0, 0, 399, 0, 592, 593, 673, 385, - 487, 604, 336, 350, 353, 342, 362, 0, 363, 338, - 339, 344, 347, 348, 349, 354, 355, 359, 365, 249, - 210, 391, 400, 579, 313, 216, 217, 218, 525, 526, - 527, 528, 620, 621, 625, 205, 463, 464, 465, 466, - 293, 615, 310, 469, 468, 332, 333, 380, 450, 541, - 543, 554, 558, 560, 562, 568, 571, 542, 544, 555, - 559, 561, 563, 569, 572, 531, 533, 535, 537, 550, - 549, 546, 574, 575, 552, 557, 536, 548, 553, 566, - 573, 570, 530, 534, 538, 547, 565, 564, 545, 556, - 567, 551, 539, 532, 540, 0, 196, 221, 369, 0, - 455, 289, 651, 619, 485, 614, 206, 223, 0, 263, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 262, 277, - 279, 286, 299, 311, 319, 320, 323, 329, 381, 387, - 388, 389, 390, 410, 411, 412, 415, 418, 419, 422, - 424, 425, 428, 432, 436, 437, 438, 440, 442, 444, - 456, 461, 475, 476, 477, 478, 479, 482, 483, 489, - 490, 491, 492, 493, 501, 502, 517, 587, 589, 606, - 626, 633, 481, 302, 303, 445, 446, 315, 316, 647, - 648, 301, 601, 634, 598, 646, 628, 439, 379, 0, - 0, 382, 282, 306, 321, 0, 618, 503, 227, 467, - 291, 251, 0, 0, 211, 246, 230, 260, 275, 278, - 325, 392, 401, 430, 435, 297, 272, 244, 460, 241, - 486, 520, 521, 522, 524, 396, 267, 434, 397, 0, - 377, 577, 578, 317, 0, 0, 0, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, - 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, - 0, 0, 367, 268, 0, 0, 204, 506, 0, 431, - 0, 203, 0, 488, 253, 378, 375, 584, 283, 274, - 270, 250, 318, 386, 429, 519, 423, 0, 371, 0, - 0, 498, 402, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 324, 248, 326, 202, 414, 499, 287, 0, 0, - 0, 0, 0, 508, 725, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, - 0, 352, 361, 360, 340, 341, 343, 345, 351, 358, - 364, 337, 346, 0, 0, 610, 0, 0, 0, 266, - 322, 273, 265, 581, 0, 0, 0, 0, 0, 0, - 597, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 298, 0, 403, 258, 0, 454, 0, 0, 0, 630, - 0, 0, 0, 0, 0, 0, 0, 366, 0, 331, - 197, 225, 0, 0, 413, 462, 474, 0, 0, 0, - 254, 0, 472, 427, 605, 233, 285, 459, 433, 470, - 441, 288, 0, 0, 471, 373, 586, 451, 602, 631, - 632, 264, 407, 616, 523, 624, 649, 226, 261, 421, - 507, 608, 495, 398, 582, 583, 330, 494, 296, 201, - 370, 637, 224, 480, 372, 242, 231, 588, 613, 300, - 252, 290, 457, 644, 213, 518, 599, 239, 484, 0, - 0, 652, 247, 505, 611, 600, 215, 595, 504, 394, - 327, 328, 214, 0, 458, 269, 294, 0, 0, 259, - 416, 590, 591, 257, 653, 228, 623, 220, 0, 622, - 409, 585, 596, 395, 384, 219, 594, 393, 383, 335, - 356, 357, 281, 308, 448, 376, 449, 307, 309, 405, - 404, 406, 207, 609, 627, 0, 208, 0, 500, 612, - 654, 453, 212, 234, 235, 237, 0, 280, 284, 292, - 295, 304, 305, 314, 368, 420, 447, 443, 452, 0, - 580, 603, 617, 629, 635, 636, 638, 639, 640, 641, - 642, 645, 643, 408, 312, 496, 334, 374, 0, 0, - 426, 473, 240, 607, 497, 199, 0, 0, 0, 0, - 255, 256, 0, 576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 655, 656, 657, 658, 659, 660, 661, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1054, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, + 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, + 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, + 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, + 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, + 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, + 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, + 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, + 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, + 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, + 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, + 405, 260, 0, 456, 0, 678, 0, 632, 0, 0, + 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, + 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, + 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, + 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, + 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, + 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, + 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, + 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, + 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, + 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, + 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, + 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, + 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, + 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, + 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, + 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, + 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, + 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, + 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, + 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, + 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, + 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, + 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, + 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, + 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, + 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, + 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, + 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, + 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, + 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, + 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, + 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, + 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, + 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, + 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, + 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, + 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, + 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, + 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, + 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, + 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, + 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, + 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, + 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, + 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, + 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, + 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, + 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, + 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, + 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, + 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, + 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, + 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, + 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, + 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, + 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, + 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, + 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, + 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, + 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, + 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, + 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, + 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, + 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, + 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, + 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, + 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, + 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, + 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, + 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, + 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, + 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, + 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, + 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, + 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, + 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, + 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, + 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, + 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, + 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, + 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, + 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, + 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, + 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, + 383, 389, 390, 391, 392, 4154, 413, 414, 417, 420, + 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, + 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, + 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, + 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, + 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, + 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, + 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, + 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, + 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, + 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, + 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, + 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, + 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, + 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, + 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, + 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, + 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, + 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, + 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, + 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, + 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, + 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, + 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, + 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, + 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, + 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, + 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, + 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, + 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, + 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, + 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, + 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, + 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, + 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, + 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, + 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 650, 509, 515, 510, 511, 512, 513, 514, 0, - 516, 0, 0, 0, 0, 0, 399, 0, 592, 593, - 673, 385, 487, 604, 336, 350, 353, 342, 362, 0, - 363, 338, 339, 344, 347, 348, 349, 354, 355, 359, - 365, 249, 210, 391, 400, 579, 313, 216, 217, 218, - 525, 526, 527, 528, 620, 621, 625, 205, 463, 464, - 465, 466, 293, 615, 310, 469, 468, 332, 333, 380, - 450, 541, 543, 554, 558, 560, 562, 568, 571, 542, - 544, 555, 559, 561, 563, 569, 572, 531, 533, 535, - 537, 550, 549, 546, 574, 575, 552, 557, 536, 548, - 553, 566, 573, 570, 530, 534, 538, 547, 565, 564, - 545, 556, 567, 551, 539, 532, 540, 0, 196, 221, - 369, 0, 455, 289, 651, 619, 485, 614, 206, 223, - 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 262, 277, 279, 286, 299, 311, 319, 320, 323, 329, - 381, 387, 388, 389, 390, 4139, 411, 412, 415, 418, - 419, 422, 424, 425, 428, 432, 436, 437, 438, 440, - 442, 444, 456, 461, 475, 476, 477, 478, 479, 482, - 483, 489, 490, 491, 492, 493, 501, 502, 517, 587, - 589, 606, 626, 633, 481, 302, 303, 445, 446, 315, - 316, 647, 648, 301, 601, 634, 598, 646, 628, 439, - 379, 0, 0, 382, 282, 306, 321, 0, 618, 503, - 227, 467, 291, 251, 0, 0, 211, 246, 230, 260, - 275, 278, 325, 392, 401, 430, 435, 297, 272, 244, - 460, 241, 486, 520, 521, 522, 524, 396, 267, 434, - 397, 0, 377, 577, 578, 317, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 0, 0, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 367, 268, 0, 0, 204, 506, - 0, 431, 0, 203, 0, 488, 253, 378, 375, 584, - 283, 274, 270, 250, 318, 386, 429, 519, 423, 0, - 371, 0, 0, 498, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 324, 248, 326, 202, 414, 499, 287, - 0, 0, 0, 0, 0, 508, 725, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, - 0, 0, 0, 352, 361, 360, 340, 341, 343, 345, - 351, 358, 364, 337, 346, 0, 0, 610, 0, 0, - 0, 266, 322, 273, 265, 581, 0, 0, 0, 0, - 0, 0, 597, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 298, 0, 403, 258, 0, 454, 0, 0, - 0, 630, 0, 0, 0, 0, 0, 0, 0, 366, - 0, 331, 197, 225, 0, 0, 413, 462, 474, 0, - 0, 0, 254, 0, 472, 427, 605, 233, 285, 459, - 433, 470, 441, 288, 0, 0, 471, 373, 586, 451, - 602, 631, 632, 264, 407, 616, 523, 624, 649, 226, - 261, 421, 507, 608, 495, 398, 582, 583, 330, 494, - 296, 201, 370, 637, 224, 480, 372, 242, 231, 588, - 613, 300, 252, 290, 457, 644, 213, 518, 599, 239, - 484, 0, 0, 652, 247, 505, 611, 600, 215, 595, - 504, 394, 327, 328, 214, 0, 458, 269, 294, 0, - 0, 259, 416, 590, 591, 257, 653, 228, 623, 220, - 0, 622, 409, 585, 596, 395, 384, 219, 594, 393, - 383, 335, 356, 357, 281, 308, 448, 376, 449, 307, - 309, 405, 404, 406, 207, 609, 627, 0, 208, 0, - 500, 612, 654, 453, 212, 234, 235, 237, 0, 280, - 284, 292, 295, 304, 305, 314, 368, 420, 447, 443, - 452, 0, 580, 603, 617, 629, 635, 636, 638, 639, - 640, 641, 642, 645, 643, 408, 312, 496, 334, 374, - 0, 0, 426, 473, 240, 607, 497, 199, 0, 0, - 0, 0, 255, 256, 0, 576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 655, 656, 657, 658, 659, + 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, + 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, + 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, + 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, + 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, + 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, + 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, + 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, + 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, + 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, + 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, + 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, + 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, + 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, + 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, + 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, + 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, + 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, + 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, + 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, + 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, + 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, + 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, + 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, + 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, + 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, + 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, + 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, + 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, + 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, + 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, + 501, 289, 0, 0, 0, 0, 0, 510, 962, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, + 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, + 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, + 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, + 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, + 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, + 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, + 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, + 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, + 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, + 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, + 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, + 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, + 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, + 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, + 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, + 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, + 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, + 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, + 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, + 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, + 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, + 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 650, 509, 515, 510, 511, 512, 513, - 514, 0, 516, 0, 0, 0, 0, 0, 399, 0, - 592, 593, 673, 385, 487, 604, 336, 350, 353, 342, - 362, 0, 363, 338, 339, 344, 347, 348, 349, 354, - 355, 359, 365, 249, 210, 391, 400, 579, 313, 216, - 217, 218, 525, 526, 527, 528, 620, 621, 625, 205, - 463, 464, 465, 466, 293, 615, 310, 469, 468, 332, - 333, 380, 450, 541, 543, 554, 558, 560, 562, 568, - 571, 542, 544, 555, 559, 561, 563, 569, 572, 531, - 533, 535, 537, 550, 549, 546, 574, 575, 552, 557, - 536, 548, 553, 566, 573, 570, 530, 534, 538, 547, - 565, 564, 545, 556, 567, 551, 539, 532, 540, 0, - 196, 221, 369, 0, 455, 289, 651, 619, 485, 614, - 206, 223, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 262, 277, 279, 286, 299, 311, 319, 320, - 323, 329, 381, 387, 388, 389, 390, 410, 411, 412, - 415, 418, 419, 422, 424, 425, 428, 432, 436, 437, - 438, 440, 442, 444, 456, 461, 475, 476, 477, 478, - 479, 482, 483, 489, 490, 491, 492, 493, 501, 502, - 517, 587, 589, 606, 626, 633, 481, 302, 303, 445, - 446, 315, 316, 647, 648, 301, 601, 634, 598, 646, - 628, 439, 379, 0, 0, 382, 282, 306, 321, 0, - 618, 503, 227, 467, 291, 251, 0, 0, 211, 246, - 230, 260, 275, 278, 325, 392, 401, 430, 435, 297, - 272, 244, 460, 241, 486, 520, 521, 522, 524, 396, - 267, 434, 397, 0, 377, 577, 578, 317, 0, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 0, 0, 0, 367, 268, 0, 0, - 204, 506, 0, 431, 0, 203, 0, 488, 253, 378, - 375, 584, 283, 274, 270, 250, 318, 386, 429, 519, - 423, 0, 371, 0, 0, 498, 402, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 248, 326, 202, 414, - 499, 287, 0, 0, 0, 0, 0, 508, 960, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 0, 245, 0, 0, 0, 352, 361, 360, 340, 341, - 343, 345, 351, 358, 364, 337, 346, 0, 0, 610, - 0, 0, 0, 266, 322, 273, 265, 581, 0, 0, - 0, 0, 0, 0, 597, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 298, 0, 403, 258, 0, 454, - 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, - 0, 366, 0, 331, 197, 225, 0, 0, 413, 462, - 474, 0, 0, 0, 254, 0, 472, 427, 605, 233, - 285, 459, 433, 470, 441, 288, 0, 0, 471, 373, - 586, 451, 602, 631, 632, 264, 407, 616, 523, 624, - 649, 226, 261, 421, 507, 608, 495, 398, 582, 583, - 330, 494, 296, 201, 370, 637, 224, 480, 372, 242, - 231, 588, 613, 300, 252, 290, 457, 644, 213, 518, - 599, 239, 484, 0, 0, 652, 247, 505, 611, 600, - 215, 595, 504, 394, 327, 328, 214, 0, 458, 269, - 294, 0, 0, 259, 416, 590, 591, 257, 653, 228, - 623, 220, 0, 622, 409, 585, 596, 395, 384, 219, - 594, 393, 383, 335, 356, 357, 281, 308, 448, 376, - 449, 307, 309, 405, 404, 406, 207, 609, 627, 0, - 208, 0, 500, 612, 654, 453, 212, 234, 235, 237, - 0, 280, 284, 292, 295, 304, 305, 314, 368, 420, - 447, 443, 452, 0, 580, 603, 617, 629, 635, 636, - 638, 639, 640, 641, 642, 645, 643, 408, 312, 496, - 334, 374, 0, 0, 426, 473, 240, 607, 497, 199, - 0, 0, 0, 0, 255, 256, 0, 576, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 655, 656, 657, + 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, + 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, + 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, + 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, + 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, + 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, + 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, + 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, + 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, + 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, + 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, + 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, + 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, + 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, + 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, + 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, + 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, + 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, + 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, + 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, + 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, + 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, + 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, + 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, + 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, + 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, + 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, + 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, + 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, + 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, + 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, + 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, + 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, + 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, + 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, + 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, + 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, + 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, + 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, + 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, + 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, + 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, + 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, + 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, + 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, + 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, + 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, + 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, + 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, + 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, + 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, + 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, + 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, + 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, + 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 650, 509, 515, 510, 511, - 512, 513, 514, 0, 516, 0, 0, 0, 0, 0, - 399, 0, 592, 593, 673, 385, 487, 604, 336, 350, - 353, 342, 362, 0, 363, 338, 339, 344, 347, 348, - 349, 354, 355, 359, 365, 249, 210, 391, 400, 579, - 313, 216, 217, 218, 525, 526, 527, 528, 620, 621, - 625, 205, 463, 464, 465, 466, 293, 615, 310, 469, - 468, 332, 333, 380, 450, 541, 543, 554, 558, 560, - 562, 568, 571, 542, 544, 555, 559, 561, 563, 569, - 572, 531, 533, 535, 537, 550, 549, 546, 574, 575, - 552, 557, 536, 548, 553, 566, 573, 570, 530, 534, - 538, 547, 565, 564, 545, 556, 567, 551, 539, 532, - 540, 0, 196, 221, 369, 0, 455, 289, 651, 619, - 485, 614, 206, 223, 0, 263, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 262, 277, 279, 286, 299, 311, - 319, 320, 323, 329, 381, 387, 388, 389, 390, 410, - 411, 412, 415, 418, 419, 422, 424, 425, 428, 432, - 436, 437, 438, 440, 442, 444, 456, 461, 475, 476, - 477, 478, 479, 482, 483, 489, 490, 491, 492, 493, - 501, 502, 517, 587, 589, 606, 626, 633, 481, 302, - 303, 445, 446, 315, 316, 647, 648, 301, 601, 634, - 598, 646, 628, 439, 379, 0, 0, 382, 282, 306, - 321, 0, 618, 503, 227, 467, 291, 251, 0, 0, - 211, 246, 230, 260, 275, 278, 325, 392, 401, 430, - 435, 297, 272, 244, 460, 241, 486, 520, 521, 522, - 524, 396, 267, 434, 397, 0, 377, 577, 578, 317, - 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, - 0, 0, 0, 271, 0, 0, 0, 0, 367, 268, - 0, 0, 204, 506, 0, 431, 0, 203, 0, 488, - 253, 378, 375, 584, 283, 274, 270, 250, 318, 386, - 429, 519, 423, 0, 371, 0, 0, 498, 402, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 324, 248, 326, - 202, 414, 499, 287, 0, 0, 0, 0, 0, 508, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 0, 245, 0, 0, 0, 352, 361, 360, - 340, 341, 343, 345, 351, 358, 364, 337, 346, 0, - 0, 610, 0, 0, 0, 266, 322, 273, 265, 581, - 0, 0, 0, 0, 0, 0, 597, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 298, 0, 403, 258, - 0, 454, 0, 0, 0, 630, 0, 0, 0, 0, - 0, 0, 0, 366, 0, 331, 197, 225, 0, 0, - 413, 462, 474, 0, 0, 0, 254, 0, 472, 427, - 605, 233, 285, 459, 433, 470, 441, 288, 0, 0, - 471, 373, 586, 451, 602, 631, 632, 264, 407, 616, - 523, 624, 649, 226, 261, 421, 507, 608, 495, 398, - 582, 583, 330, 494, 296, 201, 370, 637, 224, 480, - 372, 242, 231, 588, 613, 300, 252, 290, 457, 644, - 213, 518, 599, 239, 484, 0, 0, 652, 247, 505, - 611, 600, 215, 595, 504, 394, 327, 328, 214, 0, - 458, 269, 294, 0, 0, 259, 416, 590, 591, 257, - 653, 228, 623, 220, 0, 622, 409, 585, 596, 395, - 384, 219, 594, 393, 383, 335, 356, 357, 281, 308, - 448, 376, 449, 307, 309, 405, 404, 406, 207, 609, - 627, 0, 208, 0, 500, 612, 654, 453, 212, 234, - 235, 237, 0, 280, 284, 292, 295, 304, 305, 314, - 368, 420, 447, 443, 452, 0, 580, 603, 617, 629, - 635, 636, 638, 639, 640, 641, 642, 645, 643, 408, - 312, 496, 334, 374, 0, 0, 426, 473, 240, 607, - 497, 199, 0, 0, 0, 0, 255, 256, 0, 576, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 650, 509, 515, - 510, 511, 512, 513, 514, 0, 516, 0, 0, 0, - 0, 0, 399, 0, 592, 593, 673, 385, 487, 604, - 336, 350, 353, 342, 362, 0, 363, 338, 339, 344, - 347, 348, 349, 354, 355, 359, 365, 249, 210, 391, - 400, 579, 313, 216, 217, 218, 525, 526, 527, 528, - 620, 621, 625, 205, 463, 464, 465, 466, 293, 615, - 310, 469, 468, 332, 333, 380, 450, 541, 543, 554, - 558, 560, 562, 568, 571, 542, 544, 555, 559, 561, - 563, 569, 572, 531, 533, 535, 537, 550, 549, 546, - 574, 575, 552, 557, 536, 548, 553, 566, 573, 570, - 530, 534, 538, 547, 565, 564, 545, 556, 567, 551, - 539, 532, 540, 0, 196, 221, 369, 0, 455, 289, - 651, 619, 485, 614, 206, 223, 0, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 262, 277, 279, 286, - 299, 311, 319, 320, 323, 329, 381, 387, 388, 389, - 390, 410, 411, 412, 415, 418, 419, 422, 424, 425, - 428, 432, 436, 437, 438, 440, 442, 444, 456, 461, - 475, 476, 477, 478, 479, 482, 483, 489, 490, 491, - 492, 493, 501, 502, 517, 587, 589, 606, 626, 633, - 481, 302, 303, 445, 446, 315, 316, 647, 648, 301, - 601, 634, 598, 646, 628, 439, 379, 0, 0, 382, - 282, 306, 321, 0, 618, 503, 227, 467, 291, 251, - 0, 0, 211, 246, 230, 260, 275, 278, 325, 392, - 401, 430, 435, 297, 272, 244, 460, 241, 486, 520, - 521, 522, 524, 396, 267, 434, 0, 0, 377, 577, - 578, 317, + 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, + 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, + 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, + 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, + 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, + 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, + 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, + 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, + 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, + 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, + 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, + 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, + 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, + 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, + 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, + 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, + 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, + 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, + 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, + 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, + 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, + 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, + 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, + 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, + 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, + 523, 524, 526, 398, 269, 436, 0, 0, 379, 579, + 580, 319, } var yyPact = [...]int{ - -1000, -1000, 4350, -1000, -549, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 6221, -1000, -548, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2520, 2555, -1000, -1000, -1000, -1000, 2696, -1000, 1031, - 2117, -1000, 2474, 4989, -1000, 56250, 778, -1000, 53282, -420, - 897, 238, 36958, -1000, 193, -1000, 186, 54766, 189, -1000, - -1000, -1000, -1000, -420, 22860, 2334, 57, 55, 56250, -1000, - -1000, -1000, -1000, -373, 2641, 2087, -1000, 392, -1000, -1000, - -1000, -1000, -1000, -1000, 52540, -1000, 1119, -1000, -1000, 2482, - 2485, 2309, 941, 2399, -1000, 2569, 2087, -1000, 22860, 2632, - 2475, 22118, 22118, 456, -1000, -1000, 269, -1000, -1000, 31764, - 56250, 39926, 322, -1000, 2474, -1000, -1000, -1000, 211, -1000, - 342, 1987, -1000, 1971, -1000, 937, 914, 389, 473, 471, - 386, 385, 384, 368, 367, 363, 358, 355, 399, -1000, - 958, 958, -218, -220, 371, 769, 460, 460, 1035, 490, - 2427, 2379, -1000, -1000, 958, 958, 958, 339, 958, 958, - 958, 958, 311, 310, 958, 958, 958, 958, 958, 958, - 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, - 958, 917, 2474, 270, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2427, 2595, -1000, -1000, -1000, -1000, 2584, -1000, 1011, + 2054, -1000, 2404, 5131, -1000, 55080, 512, -1000, 52112, -417, + 870, 238, 35788, -1000, 182, -1000, 174, 53596, 178, -1000, + -1000, -1000, -1000, -417, 21690, 2298, 35, 34, 55080, -1000, + -1000, -1000, -1000, -371, 2545, 1982, -1000, 373, -1000, -1000, + -1000, -1000, -1000, -1000, 51370, -1000, -1000, -1000, 1106, -1000, + -1000, 2412, 2395, 2264, 900, 2329, -1000, 2473, 1982, -1000, + 21690, 2535, 2363, 20948, 20948, 442, -1000, -1000, 292, -1000, + -1000, 30594, 55080, 38756, 285, -1000, 2404, -1000, -1000, -1000, + 213, -1000, 341, 1956, -1000, 1950, -1000, 893, 963, 383, + 834, 490, 382, 381, 368, 365, 363, 355, 353, 348, + 391, -1000, 943, 943, -223, -224, 1482, 441, 379, 379, + 1074, 459, 2374, 2345, -1000, -1000, 943, 943, 943, 360, + 943, 943, 943, 943, 322, 321, 943, 943, 943, 943, + 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, + 943, 943, 943, 976, 2404, 307, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7470,67 +7353,68 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 56250, 194, 56250, -1000, 828, 775, - -1000, -1000, -459, 1114, 1114, 101, 1114, 1114, 1114, 1114, - 183, 1043, 54, -1000, 182, 261, 168, 271, 1096, 304, - -1000, -1000, 257, 1096, 1834, -1000, 946, 266, 169, -1000, - 1114, 1114, -1000, 15416, 203, 15416, 15416, 265, 172, -1000, - 2464, -1000, -1000, -1000, -1000, -1000, 1344, -1000, -1000, -1000, - -1000, -37, 489, -1000, -1000, -1000, -1000, 54766, 51798, 283, - -1000, -1000, 780, 1851, 1393, 22860, 1315, 938, -1000, -1000, - 1434, 900, -1000, -1000, -1000, -1000, -1000, 809, -1000, 25086, - 25086, 25086, 25086, -1000, -1000, 1830, 51056, 1830, 1830, 25086, - 1830, 25086, 1830, 1830, 1830, 1830, 22860, 1830, 1830, 1830, - 1830, -1000, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, -1000, -1000, -1000, -1000, 1830, 826, 1830, 1830, 1830, - 1830, 1830, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1830, - 1830, 1830, 1830, 1830, 1830, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, -1000, -1000, - -1000, 1692, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1693, - 1513, 1500, 1498, -1000, 19892, 1830, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 55080, 191, 55080, -1000, + 822, 511, -1000, -1000, -456, 1094, 1094, 78, 1094, 1094, + 1094, 1094, 175, 1019, 33, -1000, 169, 304, 173, 289, + 1082, 189, -1000, -1000, 275, 1082, 1799, -1000, 926, 286, + 184, -1000, 1094, 1094, -1000, 14246, 210, 14246, 14246, 280, + 156, -1000, 2391, -1000, -1000, -1000, -1000, -1000, 1406, -1000, + -1000, -1000, -1000, -44, 457, -1000, -1000, -1000, -1000, 53596, + 50628, 320, -1000, -1000, 45, 1858, 1400, 21690, 1330, 916, + -1000, -1000, 1254, 877, -1000, -1000, -1000, -1000, -1000, 811, + -1000, 23916, 23916, 23916, 23916, -1000, -1000, 1529, 49886, 1529, + 1529, 23916, 1529, 23916, 1529, 1529, 1529, 1529, 21690, 1529, + 1529, 1529, 1529, -1000, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, -1000, -1000, -1000, -1000, 1529, 820, 1529, + 1529, 1529, 1529, 1529, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1529, 1529, 1529, 1529, 1529, 1529, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + -1000, -1000, -1000, 1648, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2048, 1571, 1556, 1547, -1000, 18722, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 56250, -1000, 1830, - 216, 54766, 54766, 340, 1333, -1000, -1000, 2569, 2087, -1000, - 2641, 2620, 392, -1000, 3919, 2111, 1683, 1406, 2087, 1954, - 56250, -1000, 2005, -1000, -1000, -1000, -357, -364, 2232, 1455, - 1829, -1000, -1000, -1000, -1000, 1798, 22860, -1000, -1000, 2693, - -1000, 28796, 823, 2687, 50314, -1000, 456, 456, 1969, 421, - 13, -1000, -1000, -1000, -1000, 979, 36216, -1000, -1000, -1000, - -1000, -1000, 1884, 56250, -1000, -1000, 5043, 54766, -1000, 2107, - -1000, 1875, -1000, 2041, 22860, 2126, 768, 54766, 523, 516, - 510, 475, -62, -1000, -1000, -1000, -1000, -1000, -1000, 958, - 958, 958, -1000, 395, 2623, 4989, 5064, -1000, -1000, -1000, - 49572, 2102, 54766, -1000, 2088, -1000, 1039, 861, 864, 864, - 54766, -1000, -1000, 55508, 54766, 1037, 1033, 54766, 54766, 54766, - 54766, -1000, 48830, -1000, 48088, 47346, 1331, 54766, 46604, 45862, - 45120, 44378, 43636, -1000, 2609, -1000, 2204, -1000, -1000, -1000, - 55508, 54766, 54766, 55508, 54766, 55508, 56250, 54766, -1000, -1000, - 357, -1000, -1000, 1329, 1327, 1319, 958, 958, 1317, 1828, - 1823, 1816, 958, 958, 1305, 1800, 38442, 1780, 276, 1299, - 1296, 1294, 1293, 1775, 259, 1757, 1237, 1220, 1272, 54766, - 2083, 56250, -1000, 250, 1070, 434, 978, 2474, 2331, 1964, - 488, 767, 54766, 474, 474, 54766, -1000, 16164, 56250, 230, - -1000, 1744, 22860, -1000, 1117, 1096, 1096, -1000, -1000, -1000, - -1000, -1000, -1000, 1114, 56250, 1117, -1000, -1000, -1000, 1096, - 1114, 56250, 1114, 1114, 1114, 1114, 1096, 1096, 1096, 1114, - 56250, 56250, 56250, 56250, 56250, 56250, 56250, 56250, 56250, 15416, - 946, 1114, -460, -1000, 1742, -1000, -1000, -1000, 2230, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1529, -1000, -1000, + -1000, 55080, -1000, 1529, 217, 53596, 53596, 387, 1382, -1000, + -1000, 2473, 1982, -1000, 2545, 2497, 373, -1000, 3932, 1793, + 1596, 1478, 1982, 1928, 55080, -1000, 1974, 220, -1000, -1000, + -1000, -357, -358, 2199, 1528, 1797, -1000, -1000, -1000, -1000, + 2226, 21690, -1000, -1000, 2568, -1000, 28368, 818, 2566, 49144, + -1000, 442, 442, 1944, 420, -5, -1000, -1000, -1000, -1000, + 960, 35046, -1000, -1000, -1000, -1000, -1000, 1804, 55080, -1000, + -1000, 5532, 53596, -1000, 2053, -1000, 1795, -1000, 2000, 21690, + 2064, 497, 53596, 479, 478, 477, 439, -73, -1000, -1000, + -1000, -1000, -1000, -1000, 943, 943, 943, -1000, 390, 2531, + 5131, 5096, -1000, -1000, -1000, 48402, 2043, 53596, -1000, 2040, + -1000, 1020, 865, 850, 850, 53596, -1000, -1000, 54338, 53596, + 1018, 1012, 53596, 53596, 53596, 53596, -1000, 47660, -1000, 46918, + 46176, 1381, 53596, 45434, 44692, 43950, 43208, 42466, -1000, 2252, + -1000, 2016, -1000, -1000, -1000, 54338, 53596, 53596, 54338, 53596, + 54338, 55080, 53596, -1000, -1000, 336, -1000, -1000, 1380, 1379, + 1366, 943, 943, 1365, 1786, 1784, 1783, 943, 943, 1364, + 1779, 37272, 1777, 265, 1357, 1355, 1343, 1378, 1771, 194, + 1766, 1372, 1352, 1342, 53596, 2035, 55080, -1000, 271, 1060, + 974, 956, 2404, 2282, 1943, 456, 484, 53596, 436, 436, + 53596, -1000, 14994, 55080, 225, -1000, 1751, 21690, -1000, 1083, + 1082, 1082, -1000, -1000, -1000, -1000, -1000, -1000, 1094, 55080, + 1083, -1000, -1000, -1000, 1082, 1094, 55080, 1094, 1094, 1094, + 1094, 1082, 1082, 1082, 1094, 55080, 55080, 55080, 55080, 55080, + 55080, 55080, 55080, 55080, 14246, 926, 1094, -457, -1000, 1749, + -1000, -1000, -1000, 2160, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7546,337 +7430,337 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 15416, - 15416, -1000, -1000, 2565, 2559, -1000, -1000, -1000, 1960, -1000, - 184, 17, 185, -1000, 42894, 535, 974, -1000, 535, -1000, - -1000, -1000, -1000, -1000, 1959, 42152, -1000, -461, -464, -467, - -469, -1000, -1000, -1000, -471, -473, -1000, -1000, -1000, 22860, - 22860, 22860, 22860, -257, -1000, 1217, 25086, 2491, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 22860, 247, 1131, 25086, 25086, - 25086, 25086, 25086, 25086, 25086, 26570, 25828, 25086, 25086, 25086, - 25086, 25086, 25086, -1000, -1000, 33990, 6271, 6271, 900, 900, - 900, 900, -1000, -174, 1958, 55508, -1000, -1000, -1000, 822, - 22860, 22860, 900, -1000, 1238, 2007, 19892, 22860, 22860, 22860, - 22860, 960, 1393, 55508, 22860, -1000, 1406, -1000, -1000, -1000, - -1000, 1234, -1000, -1000, 1081, 2376, 2376, 2376, 2376, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 2376, - 22860, 208, 208, 919, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 18408, 22860, 22860, 25086, 22860, 22860, 22860, 1406, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 1406, - 22860, 1221, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 17660, - 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 22860, 1406, - 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1686, 1493, 1478, 22860, -1000, - 1957, -1000, -202, 31022, 22860, 1739, 2683, 2157, 54766, -1000, - -1000, -1000, -1000, 2569, -1000, 2569, 1686, 3881, 2277, 22118, - -1000, -1000, 3881, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1737, -1000, 56250, 1954, - 2545, 54766, -1000, -294, -1000, -295, 2272, 1730, 351, -1000, - 22860, 22860, 1953, -1000, 1399, 56250, -1000, -257, -1000, 41410, - -1000, -1000, 14668, 56250, 350, 56250, -1000, 30280, 40668, 306, - -1000, 13, 1933, -1000, 29, 1, 19150, 899, -1000, -1000, - -1000, 371, 27312, 1822, 899, 100, -1000, -1000, -1000, 2041, - -1000, 2041, 2041, 2041, 2041, 351, 351, 351, 351, -1000, - -1000, -1000, -1000, -1000, 2079, 2041, 2075, -1000, 2041, 2041, - 2041, 2041, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2073, - 2073, 2073, 2061, 2061, 2042, 2042, 447, -1000, 22860, 486, - 39926, 2537, 1270, 1538, 250, 475, 2144, 54766, 54766, 54766, - 56250, 989, -1000, 1445, 1412, 1398, -1000, -532, 1952, -1000, - -1000, 2617, -1000, -1000, 956, 1088, 1084, 1064, 54766, 214, - 335, -1000, 433, -1000, 39926, 54766, 1029, 864, 54766, -1000, - 54766, -1000, -1000, -1000, -1000, -1000, 54766, -1000, -1000, 1950, - -1000, 1927, 1106, 1083, 1098, 1080, 1950, -1000, -1000, -183, - 1950, -1000, 1950, -1000, 1950, -1000, 1950, -1000, 1950, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1001, 278, - -350, 54766, 214, 487, -1000, 485, 33990, -1000, -1000, -1000, - 33990, 33990, -1000, -1000, -1000, -1000, 1726, 1723, -1000, -1000, + -1000, -1000, -1000, -1000, 14246, 14246, -1000, -1000, 2467, 2462, + -1000, -1000, -1000, 1942, -1000, 172, -4, 177, -1000, 41724, + 506, 953, -1000, 506, -1000, -1000, -1000, -1000, -1000, 1940, + 40982, -1000, -458, -459, -460, -461, -1000, -1000, -1000, -465, + -471, -1000, -1000, -1000, 21690, 21690, 21690, 21690, -261, -1000, + 1194, 23916, 2356, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 21690, 1186, 1062, 23916, 23916, 23916, 23916, 23916, 23916, 23916, + 25400, 24658, 23916, 23916, 23916, 23916, 23916, 23916, -1000, -1000, + 32820, 6516, 6516, 877, 877, 877, 877, -1000, -196, 1937, + 54338, -1000, -1000, -1000, 816, 21690, 21690, 877, -1000, 1344, + 3283, 18722, 21690, 21690, 21690, 21690, 965, 1400, 54338, 21690, + -1000, 1478, -1000, -1000, -1000, -1000, 1242, -1000, -1000, 1050, + 2342, 2342, 2342, 2342, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 2342, 21690, 881, 881, 732, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 17238, 21690, 21690, + 23916, 21690, 21690, 21690, 1478, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 1478, 21690, 1349, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 16490, 21690, 21690, 21690, 21690, 21690, + -1000, -1000, -1000, -1000, -1000, -1000, 21690, 21690, 21690, 21690, + 21690, 21690, 21690, 21690, 1478, 21690, 21690, 21690, 21690, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1526, 1550, 1497, 1529, 21690, -1000, 1934, -1000, -199, 29852, + 21690, 1743, 2562, 2057, 53596, -1000, -1000, -1000, -1000, 2473, + -1000, 2473, 1526, 3922, 2218, 20948, -1000, -1000, 3922, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -520, 56250, -1000, - 236, 971, 268, 376, 291, 56250, 405, 2423, 2413, 2403, - 2396, 2391, 2373, 2366, 242, 298, 56250, 56250, 474, 2206, - 56250, 2522, 56250, -1000, -1000, -1000, -1000, -1000, 1716, 1708, - -1000, 1393, 56250, -1000, -1000, 1114, 1114, -1000, -1000, 56250, - 1114, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1114, + -1000, -1000, 1792, -1000, 55080, 1928, 2457, 53596, -1000, 1912, + -1000, -1000, 1529, -1000, -297, -1000, -300, 2205, 1718, 350, + -1000, 21690, 21690, 1901, -1000, 1445, 55080, -1000, -261, -1000, + 40240, -1000, -1000, 13498, 55080, 344, 55080, -1000, 29110, 39498, + 602, -1000, -5, 1881, -1000, 14, -10, 17980, 876, -1000, + -1000, -1000, 1482, 26142, 1843, 876, 95, -1000, -1000, -1000, + 2000, -1000, 2000, 2000, 2000, 2000, 350, 350, 350, 350, + -1000, -1000, -1000, -1000, -1000, 2033, 2000, 2027, -1000, 2000, + 2000, 2000, 2000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 56250, -1000, -1000, -1000, -1000, - 1702, -1000, 56250, -37, 177, -1000, -1000, 54766, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -114, -1000, 854, - 26, 393, -1000, -1000, -1000, -1000, -1000, 2550, -1000, 1393, - 1021, 1010, -1000, 1830, -1000, -1000, 1233, -1000, -1000, -1000, - -1000, -1000, 1830, 1830, 1830, -1000, -1000, -1000, -1000, -1000, - 247, 25086, 25086, 25086, 1782, 777, 1891, 1812, 1474, 1231, - 1231, 976, 25086, 976, 25086, 918, 918, 918, 918, 918, - -1000, -1000, -1000, -1000, -1000, -1000, 1692, -1000, 1667, -1000, - 1830, 55508, 1827, 17660, 1747, 1599, 1406, 932, -1000, -1000, + 2026, 2026, 2026, 2024, 2024, 2001, 2001, 426, -1000, 21690, + 433, 38756, 2426, 1326, 2191, 271, 439, 1993, 53596, 53596, + 53596, 55080, 970, -1000, 1431, 1413, 1412, -1000, -533, 1895, + -1000, -1000, 2528, -1000, -1000, 904, 1044, 1041, 851, 53596, + 216, 339, -1000, 416, -1000, 38756, 53596, 1005, 850, 53596, + -1000, 53596, -1000, -1000, -1000, -1000, -1000, 53596, -1000, -1000, + 1893, -1000, 1911, 1207, 1039, 1091, 1037, 1893, -1000, -1000, + -197, 1893, -1000, 1893, -1000, 1893, -1000, 1893, -1000, 1893, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 984, + 306, -348, 53596, 216, 454, -1000, 452, 32820, -1000, -1000, + -1000, 32820, 32820, -1000, -1000, -1000, -1000, 1711, 1708, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3935, 1406, - 1851, 1406, 1674, 3902, 1026, -1000, 22860, 1406, 3610, -1000, - -1000, 1406, 1406, 22860, -1000, -1000, 22860, 22860, 22860, 22860, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 22860, 1538, 1947, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1938, 2669, 1558, 1538, 1538, 1538, 1538, 3587, 1538, - 1538, 22860, 1358, -1000, -1000, -1000, 1419, 3583, 1684, 3572, - 1538, 1538, -1000, 1538, 3541, 3536, 1406, 2928, 2820, 1538, - 1538, 1538, 1538, 1538, 2792, 2778, 1538, 1538, 2705, 1538, - 3522, 1538, 2698, 2681, 2677, 2633, 2611, 2603, 2594, 2570, - 2561, 2539, 2533, 2523, 2509, 2492, 2458, 2448, 2444, 2407, - 1538, 1538, 1538, 3508, 1538, 3489, 1538, 3485, 1538, 1538, - 3474, 2394, 2364, 1406, 1934, -1000, 3469, 1538, 3457, 3453, - 3446, 2354, 3427, 3422, 3418, 1538, 1538, 1538, 2339, 3413, - 3407, 3395, 3391, 3374, 3369, 3364, 3355, 3343, 1538, 1478, - 1478, 1478, 1478, 1478, 3253, -259, 1538, 1406, -1000, -1000, - -1000, -1000, -1000, 3092, 2333, 3042, 3030, 3011, 3003, 1406, - 1830, 821, -1000, -1000, 1478, 1406, 1406, 1478, 1478, 2995, - 2963, 2957, 2953, 2933, 2834, 1538, 1538, -1000, 1538, 2810, - 2800, 2303, 2290, 1406, -1000, 1478, 56250, -1000, -451, -1000, - -8, 954, 1830, -1000, 38442, 1406, -1000, 4349, -1000, 1168, - -1000, -1000, -1000, -1000, -1000, 35474, 1879, -1000, -1000, -1000, - -1000, 1830, 1762, -1000, -1000, -1000, -1000, 351, 73, 34732, - 890, 890, 123, 1393, 1393, 22860, -1000, -1000, -1000, -1000, - -1000, -1000, 820, 2642, 404, 1830, -1000, 1948, 3576, -1000, - -1000, -1000, 2544, 28054, -1000, -1000, 1830, 1830, 56250, 1939, - 1745, -1000, 819, -1000, 1320, 1933, 13, 24, -1000, -1000, - -1000, -1000, 1393, -1000, 1378, 353, 346, -1000, 437, -1000, - -1000, -1000, -1000, 2343, 81, -1000, -1000, -1000, 912, 351, - -1000, -1000, -1000, -1000, -1000, -1000, 1664, -1000, 1664, -1000, - -1000, -1000, -1000, -1000, 1268, -1000, -1000, -1000, -1000, 1266, - -1000, -1000, 1256, -1000, -1000, 2877, 2183, 486, -1000, -1000, - 958, 1655, -1000, -1000, 2356, 958, 958, 54766, -1000, -1000, - 1783, 2537, 236, 56250, 2203, -1000, 2144, 2144, 2144, -1000, - 2497, -1000, -1000, -1000, -1000, -1000, -1000, -522, 174, 609, - -1000, -1000, -1000, 1389, 54766, 1721, -1000, 224, -1000, 1779, - -1000, 54766, -1000, 1713, 2053, 54766, 54766, -1000, -1000, -1000, - 54766, 1830, -1000, -1000, -1000, -1000, 760, 2471, 319, -1000, - -1000, -283, -1000, -1000, 214, 224, 55508, 54766, 899, -1000, - -1000, -1000, -1000, -1000, -523, 1690, 506, 228, 328, 56250, - 56250, 56250, 56250, 56250, 56250, 800, -1000, -1000, 39, -1000, - -1000, 202, -1000, -1000, 1623, -1000, -1000, -1000, -1000, 202, - -1000, -1000, -1000, -1000, -1000, 275, 478, -1000, 56250, 56250, - 964, -1000, -1000, -1000, -1000, -1000, 1096, -1000, -1000, 1096, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -520, 55080, + -1000, 243, 952, 317, 319, 295, 55080, 422, 2368, 2359, + 2353, 2352, 2337, 2331, 2324, 276, 313, 55080, 55080, 436, + 2147, 55080, 2440, 55080, -1000, -1000, -1000, -1000, -1000, 1672, + 1656, -1000, 1400, 55080, -1000, -1000, 1094, 1094, -1000, -1000, + 55080, 1094, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1094, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 55080, -1000, -1000, -1000, + -1000, 1654, -1000, 55080, -44, 161, -1000, -1000, 53596, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -112, -1000, + 296, 5, 397, -1000, -1000, -1000, -1000, -1000, 2461, -1000, + 1400, 987, 992, -1000, 1529, -1000, -1000, 1290, -1000, -1000, + -1000, -1000, -1000, 1529, 1529, 1529, -1000, -1000, -1000, -1000, + -1000, 1186, 23916, 23916, 23916, 1597, 476, 1384, 1339, 1195, + 1128, 1128, 1210, 23916, 1210, 23916, 882, 882, 882, 882, + 882, -1000, -1000, -1000, -1000, -1000, -1000, 1648, -1000, 1643, + -1000, 1529, 54338, 1765, 16490, 1262, 1715, 1478, 892, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 2457, 56250, 20, -490, -1000, -486, 22860, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1666, 749, 1891, 25086, - 25086, 2007, 2007, 25086, -1000, -1000, -1000, 1076, 1076, 33990, - -1000, 25086, 22860, -1000, -1000, 22860, 22860, 22860, 981, -1000, - 22860, 1181, -1000, 22860, -1000, -259, 1478, 1538, 1538, 1538, - 1538, -259, -259, -259, -259, -259, -259, -259, -259, -259, - -259, 1908, -1000, 22860, 22860, 22860, 1406, 334, -1000, -1000, - -1000, -259, 22860, -1000, -1000, 2666, -1000, 22860, -1000, 33990, - 22860, 22860, 22860, -1000, -1000, -1000, 22860, 22860, -1000, -1000, - 22860, -1000, 22860, -1000, -1000, -1000, -1000, -1000, -1000, 22860, - -1000, 22860, -1000, -1000, -1000, 22860, -1000, 22860, -1000, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, -1000, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, 22860, 22860, -1000, 22860, 22860, 22860, -1000, 22860, 22860, - 22860, 22860, -1000, -1000, -1000, -1000, 22860, 22860, 22860, 22860, - 22860, 22860, 22860, 22860, 22860, 22860, -1000, -1000, -1000, -1000, - -1000, -1000, 22860, -1000, 39926, 47, -259, 1221, 47, 1221, - 24344, 832, 507, 23602, -1000, 22860, 16912, -1000, -1000, -1000, - -1000, -1000, 22860, 22860, 22860, 22860, 22860, 22860, -1000, -1000, - -1000, 22860, 22860, -1000, 22860, -1000, 22860, -1000, -1000, -1000, - -1000, -1000, 954, -1000, 455, 453, 864, 54766, -1000, -1000, - -1000, -1000, 1930, -1000, 2564, -1000, 2285, 2284, 2659, 2642, - 22118, -1000, 30280, -1000, -1000, 54766, -419, -1000, 2326, 2476, - 890, 890, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13920, - 2569, 22860, 2201, 55508, 223, -1000, 29538, 54766, 55508, 30280, - 30280, 30280, 30280, 30280, -1000, 2242, 2235, -1000, 2254, 2228, - 2313, 56250, -1000, 1686, 1688, -1000, 22860, 32506, 1935, 30280, - -1000, -1000, 30280, 56250, 13172, -1000, -1000, 6, -7, -1000, - -1000, -1000, -1000, 371, -1000, -1000, 1082, 2543, 2338, -1000, - -1000, -1000, -1000, -1000, 1682, -1000, 1676, 1928, 1671, 1662, - 278, -1000, 2067, 2451, 958, 958, -1000, 1254, -1000, 1238, - 1614, 1586, -1000, -1000, -1000, 496, -1000, 56250, 2200, 2195, - 2194, -1000, -540, 1253, 2052, 2012, 22860, 2051, 2615, 1913, - 54766, -1000, -1000, 55508, -1000, 197, -1000, 486, 54766, -1000, - -1000, -1000, 335, 56250, -1000, 7068, -1000, -1000, -1000, 224, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 56250, 233, -1000, - 2047, 1343, -1000, -1000, 2140, -1000, -1000, -1000, -1000, -1000, - 213, 201, 1583, 199, 1547, -1000, 199, -1000, 56250, 928, - 2183, 56250, -1000, -1000, -1000, 1114, 1114, -1000, -1000, 2449, - -1000, 1238, 1538, 25086, 25086, -1000, 900, -1000, -1000, 435, - -229, 2041, 2041, -1000, 2041, 2042, -1000, 2041, 171, 2041, - 154, 2041, -1000, -1000, 1406, 1406, -1000, 1478, 2286, 1439, - 2796, -1000, 1393, 22860, 2715, -1000, -1000, -259, -259, -259, - -259, -259, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -69, 2689, 2637, 1538, -1000, 2039, 2036, -1000, - 1538, 22860, 1538, 1406, 2278, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 2266, 2257, 2249, - 2196, 2175, 2171, 2167, 2163, 2158, 2149, 2145, 2128, 2084, - 2080, 2076, 2062, 1538, 1538, 2058, 1538, 2054, 2048, -1000, - 1393, 1478, 2628, 1478, 1538, 1538, 2527, 337, 1538, 1651, - 1651, 1651, 1651, 1651, 1478, 1478, 1478, 1478, 1538, 54766, - -1000, -259, -1000, -1000, -307, -309, -1000, 1406, -259, 1926, - 25086, 1538, 25086, 25086, 25086, 1538, 1406, -1000, 2043, 2010, - 2270, 1940, 1538, 1832, 1538, 1538, 1538, 1821, -1000, 2535, - 1830, 2535, 1830, 2535, 1647, 1168, 56250, -1000, -1000, -1000, - -1000, 2642, 2639, -1000, 1914, -1000, 73, 639, -1000, 2311, - 2476, -1000, 2610, 2306, 2598, -1000, -1000, -1000, -1000, -1000, - 1393, -1000, 2479, 1916, -1000, 963, 1907, -1000, -1000, 21376, - 1649, 2281, 817, 1647, 1923, 3576, 2136, 2190, 3359, -1000, - -1000, -1000, -1000, 2231, -1000, 2063, -1000, -1000, 2005, -1000, - 1790, 350, 30280, 1877, 1877, -1000, 816, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1100, 7068, 2704, -1000, 1544, -1000, - 1366, 195, 1240, -1000, -1000, 958, 958, -1000, 1028, 1020, - -1000, 56250, 2031, -1000, 351, 1529, 351, 1225, -1000, -1000, - 1215, -1000, -1000, -1000, -1000, 1994, 2562, -1000, -1000, -1000, - -1000, 56250, -1000, 56250, 56250, 56250, 2029, 2595, -1000, 22860, - 2015, 962, 2253, 54766, 54766, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 427, 958, -503, 297, - 294, 958, 958, 958, -541, -1000, -1000, 1639, 1637, -1000, - -205, -1000, 22860, -1000, -1000, -1000, -1000, -1000, 1249, 1249, - 1513, 1500, 1498, -1000, 2005, -1000, -1000, -1000, 1722, -1000, - -1000, -186, 54766, 54766, 54766, 54766, -1000, -1000, -1000, 1187, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3919, + 1478, 1858, 1478, 1463, 3550, 975, -1000, 21690, 1478, 3538, + -1000, -1000, 1478, 1478, 21690, -1000, -1000, 21690, 21690, 21690, + 21690, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 21690, 2191, 1889, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 900, 1406, 375, -188, 1406, -1000, -1000, 351, + -1000, -1000, 1887, 2556, 1216, 2191, 2191, 2191, 2191, 3532, + 2191, 2191, 21690, 2292, -1000, -1000, -1000, 1450, 3523, 1580, + 3519, 2191, 2191, -1000, 2191, 3507, 3500, 1478, 2690, 2679, + 2191, 2191, 2191, 2191, 2191, 2662, 2642, 2191, 2191, 2628, + 2191, 3496, 2191, 2618, 2614, 2601, 2579, 2534, 2529, 2518, + 2514, 2496, 2492, 2485, 2468, 2420, 2415, 2407, 2387, 2371, + 2346, 2191, 2191, 2191, 3489, 2191, 3477, 2191, 3471, 2191, + 2191, 3445, 2339, 2326, 1478, 1885, -1000, 3434, 2191, 3428, + 3424, 3410, 2321, 3406, 3400, 3396, 2191, 2191, 2191, 2309, + 3384, 3363, 3357, 3291, 3114, 3105, 3097, 3082, 3073, 2191, + 1497, 1497, 1497, 1497, 1497, 3069, -266, 2191, 1478, -1000, + -1000, -1000, -1000, -1000, 3062, 2299, 3042, 3029, 3024, 3017, + 1478, 1529, 815, -1000, -1000, 1497, 1478, 1478, 1497, 1497, + 2993, 2988, 2968, 2949, 2907, 2898, 2191, 2191, -1000, 2191, + 2888, 2883, 2277, 2260, 1478, -1000, 1497, 55080, -1000, -449, + -1000, -13, 962, 1529, -1000, 37272, 1478, -1000, 4152, -1000, + 1190, -1000, -1000, -1000, -1000, -1000, 34304, 1841, -1000, -1000, + -1000, -1000, 1529, 1760, -1000, -491, 20206, -1000, -1000, -1000, + 350, 58, 33562, 868, 868, 116, 1400, 1400, 21690, -1000, + -1000, -1000, -1000, -1000, -1000, 799, 2522, 370, 1529, -1000, + 1903, 2626, -1000, -1000, -1000, 2452, 26884, -1000, -1000, 1529, + 1529, 55080, 1875, 1845, -1000, 790, -1000, 1414, 1881, -5, + -16, -1000, -1000, -1000, -1000, 1400, -1000, 1405, 347, 357, + -1000, 424, -1000, -1000, -1000, -1000, 2314, 64, -1000, -1000, + -1000, 899, 350, -1000, -1000, -1000, -1000, -1000, -1000, 1640, + -1000, 1640, -1000, -1000, -1000, -1000, -1000, 1320, -1000, -1000, + -1000, -1000, 1319, -1000, -1000, 1311, -1000, -1000, 2812, 2075, + 433, -1000, -1000, 943, 1637, -1000, -1000, 2317, 943, 943, + 53596, -1000, -1000, 1837, 2426, 243, 55080, 2144, -1000, 1993, + 1993, 1993, -1000, 2421, -1000, -1000, -1000, -1000, -1000, -1000, + -522, 166, 362, -1000, -1000, -1000, 1444, 53596, 1747, -1000, + 214, -1000, 1836, -1000, 53596, -1000, 1741, 2023, 53596, 53596, + -1000, -1000, -1000, 53596, 1529, -1000, -1000, -1000, -1000, 482, + 2400, 323, -1000, -1000, -286, -1000, -1000, 216, 214, 54338, + 53596, 876, -1000, -1000, -1000, -1000, -1000, -523, 1734, 474, + 228, 515, 55080, 55080, 55080, 55080, 55080, 55080, 782, -1000, + -1000, 24, -1000, -1000, 195, -1000, -1000, 1634, -1000, -1000, + -1000, -1000, 195, -1000, -1000, -1000, -1000, -1000, 293, 450, + -1000, 55080, 55080, 918, -1000, -1000, -1000, -1000, -1000, 1082, + -1000, -1000, 1082, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2389, 55080, 3, -488, -1000, + -484, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1479, + 434, 1384, 23916, 23916, 3283, 3283, 23916, -1000, -1000, -1000, + 332, 332, 32820, -1000, 23916, 21690, -1000, -1000, 21690, 21690, + 21690, 964, -1000, 21690, 1182, -1000, 21690, -1000, -266, 1497, + 2191, 2191, 2191, 2191, -266, -266, -266, -266, -266, -266, + -266, -266, -266, -266, 1894, -1000, 21690, 21690, 21690, 1478, + 315, -1000, -1000, -1000, -266, 21690, -1000, -1000, 2551, -1000, + 21690, -1000, 32820, 21690, 21690, 21690, -1000, -1000, -1000, 21690, + 21690, -1000, -1000, 21690, -1000, 21690, -1000, -1000, -1000, -1000, + -1000, -1000, 21690, -1000, 21690, -1000, -1000, -1000, 21690, -1000, + 21690, -1000, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, -1000, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, -1000, 21690, -1000, + 21690, -1000, 21690, -1000, 21690, 21690, -1000, 21690, 21690, 21690, + -1000, 21690, 21690, 21690, 21690, -1000, -1000, -1000, -1000, 21690, + 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, -1000, + -1000, -1000, -1000, -1000, -1000, 21690, -1000, 38756, 62, -266, + 1349, 62, 1349, 23174, 824, 783, 22432, -1000, 21690, 15742, + -1000, -1000, -1000, -1000, -1000, 21690, 21690, 21690, 21690, 21690, + 21690, -1000, -1000, -1000, 21690, 21690, -1000, 21690, -1000, 21690, + -1000, -1000, -1000, -1000, -1000, 962, -1000, 471, 466, 850, + 53596, -1000, -1000, -1000, -1000, 1878, -1000, 2472, -1000, 2242, + 2234, 2548, 2522, 20948, -1000, 29110, -1000, -1000, 53596, -1000, + -1000, -407, -1000, 2293, 2280, 868, 868, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 12750, 2473, 21690, 2143, 54338, 1529, + -1000, 27626, 53596, 54338, 29110, 29110, 29110, 29110, 29110, -1000, + 2196, 2192, -1000, 2179, 2161, 2239, 55080, -1000, 1526, 1732, + -1000, 21690, 31336, 1825, 29110, -1000, -1000, 29110, 55080, 12002, + -1000, -1000, 0, -19, -1000, -1000, -1000, -1000, 1482, -1000, + -1000, 1358, 2450, 2311, -1000, -1000, -1000, -1000, -1000, 1725, + -1000, 1717, 1872, 1701, 1697, 306, -1000, 2063, 2384, 943, + 943, -1000, 1309, -1000, 1344, 1620, 1610, -1000, -1000, -1000, + 462, -1000, 55080, 2142, 2139, 2131, -1000, -531, 1297, 2017, + 1994, 21690, 2015, 2524, 1869, 53596, -1000, -1000, 54338, -1000, + 274, -1000, 433, 53596, -1000, -1000, -1000, 339, 55080, -1000, + 7431, -1000, -1000, -1000, 214, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 55080, 232, -1000, 2009, 1389, -1000, -1000, 1980, + -1000, -1000, -1000, -1000, -1000, 207, 192, 1602, 187, 1592, + -1000, 187, -1000, 55080, 903, 2075, 55080, -1000, -1000, -1000, + 1094, 1094, -1000, -1000, 2378, -1000, 1344, 2191, 23916, 23916, + -1000, 877, -1000, -1000, 378, -234, 2000, 2000, -1000, 2000, + 2001, -1000, 2000, 148, 2000, 129, 2000, -1000, -1000, 1478, + 1478, -1000, 1497, 2215, 2121, 2801, -1000, 1400, 21690, 2751, + -1000, -1000, -266, -266, -266, -266, -266, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -82, 2729, 2724, + 2191, -1000, 1997, 1992, -1000, 2191, 21690, 2191, 1478, 2211, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2198, 2182, 2173, 2146, 2137, 2129, 2102, 2097, + 2093, 2084, 2002, 1989, 1984, 1976, 1971, 1938, 2191, 2191, + 1876, 2191, 1861, 1856, -1000, 1400, 1497, 2718, 1497, 2191, + 2191, 2712, 299, 2191, 1691, 1691, 1691, 1691, 1691, 1497, + 1497, 1497, 1497, 2191, 53596, -1000, -266, -1000, -1000, -311, + -320, -1000, 1478, -266, 1871, 23916, 2191, 23916, 23916, 23916, + 2191, 1478, -1000, 1849, 1831, 2708, 1823, 2191, 2624, 2191, + 2191, 2191, 1770, -1000, 2460, 1529, 2460, 1529, 2460, 1626, + 1190, 55080, -1000, -1000, -1000, -1000, 2522, 2537, -1000, 1870, + -1000, 58, 620, -1000, 2302, 2280, -1000, 2523, 2281, 2521, + -1000, -1000, -1000, -1000, -1000, 1400, -1000, 2406, 1833, -1000, + 951, 1886, -1000, -1000, 20206, 1629, 2228, 784, 1626, 1930, + 2626, 2106, 2116, 3857, -1000, -1000, -1000, -1000, 2181, -1000, + 2169, -1000, -1000, 1974, -1000, 1947, 344, 29110, 1839, 1839, + -1000, 548, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1081, + 7431, 2592, -1000, 1590, -1000, 1391, 212, 1280, -1000, -1000, + 943, 943, -1000, 1001, 1000, -1000, 55080, 1988, -1000, 350, + 1585, 350, 1247, -1000, -1000, 1228, -1000, -1000, -1000, -1000, + 1967, 2231, -1000, -1000, -1000, -1000, 55080, -1000, 55080, 55080, + 55080, 1983, 2512, -1000, 21690, 1981, 944, 2702, 53596, 53596, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 22860, -1000, 22860, -1000, 22860, 1393, 22860, -1000, -1000, -1000, - -1000, -1000, 2569, 1489, 22860, 22860, -1000, 1211, 1209, -259, - 1538, -1000, -1000, -1000, 22860, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, 22860, -1000, - -1000, 22860, -1000, -1000, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, -1000, -1000, 22860, 264, 1076, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1406, 347, -1000, - -1000, -1000, 2650, -1000, 1406, 22860, 2007, -1000, 2007, 2007, - 2007, -1000, -1000, -1000, 22860, -1000, 22860, 22860, -1000, 22860, - -1000, 22860, -1000, -1000, -1000, -1000, 22860, 1830, 2374, 39184, - 1830, 39184, 1830, 32506, -1000, -1000, 2639, 2596, 2593, 2300, - 2312, 2312, 2311, -1000, 2589, 2587, -1000, 1472, 2585, 1458, - 1006, -1000, 55508, 22860, -1000, 223, 38442, -1000, 403, 54766, - 223, 54766, -1000, 2634, -1000, -1000, 22860, 2014, -1000, 22860, - -1000, -1000, -1000, -1000, 6271, 2642, 1877, -1000, -1000, 922, - -1000, 22860, -1000, 11485, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1453, 1446, -1000, -1000, 2006, 22860, -1000, -1000, - -1000, 1663, 1652, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2005, -1000, -1000, -1000, -1000, 335, -527, 2224, 54766, - 1206, -1000, 1632, 1913, 288, 223, 1432, 958, 958, 958, - 1161, 1152, 38442, 1605, -1000, 54766, 364, -1000, 335, -1000, - -222, -223, 1538, -1000, -1000, 2530, -1000, -1000, 16912, -1000, - -1000, 2003, 2141, -1000, -1000, -1000, -1000, 2264, -179, -200, - -1000, -1000, 1538, 1538, 1538, 1405, 1406, -1000, 1538, 1538, - 1633, 1543, -1000, -1000, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1478, 1778, -1000, 264, 1406, 2184, - -1000, -1000, 6271, -1000, -1000, 2634, 2579, 47, -1000, -1000, - 222, 47, 1393, 1032, 1406, 1406, 1032, 1760, 1538, 1660, - 1642, 1538, 1538, 33248, -1000, 2572, 2571, 1542, -1000, -1000, - 39184, 1542, 39184, 954, 2596, -270, 22860, 22860, 2297, 1164, - -1000, -1000, -1000, -1000, 1402, 1390, -1000, 1377, -1000, 2699, - -1000, 1393, -1000, 1830, 223, -1000, 808, 1907, -1000, 2569, - 1393, 54766, 1393, 75, 2634, -1000, 1538, -1000, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, -1000, - -1000, 54766, 2180, -1000, -1000, 2529, 1554, 166, -1000, 1475, - 1913, -1000, -1000, 221, -1000, 22860, -1000, 38442, 1374, 1360, - -1000, -1000, -1000, -1000, -541, -1000, -1000, -1000, -1000, -1000, - -1000, 392, 1888, -1000, 957, 54766, 56250, -1000, 2188, -1000, - -1000, -1000, -1000, 22860, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 445, 943, -501, 312, 301, 943, 943, 943, -538, + -1000, -1000, 1624, 1618, -1000, -221, -1000, 21690, -1000, -1000, + -1000, -1000, -1000, 1236, 1236, 1571, 1556, 1547, -1000, 1974, + -1000, -1000, -1000, 1748, -1000, -1000, -202, 53596, 53596, 53596, + 53596, -1000, -1000, -1000, 1111, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 877, 1478, 346, + -212, 1478, -1000, -1000, 350, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 21690, -1000, 21690, -1000, 21690, + 1400, 21690, -1000, -1000, -1000, -1000, -1000, 2473, 1544, 21690, + 21690, -1000, 1224, 1217, -266, 2191, -1000, -1000, -1000, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, + -1000, 21690, -1000, 21690, -1000, -1000, 21690, -1000, -1000, -1000, + 21690, -1000, 21690, -1000, 21690, -1000, -1000, -1000, 21690, 266, + 332, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1478, 342, -1000, -1000, -1000, 2543, -1000, 1478, + 21690, 3283, -1000, 3283, 3283, 3283, -1000, -1000, -1000, 21690, + -1000, 21690, 21690, -1000, 21690, -1000, 21690, -1000, -1000, -1000, + -1000, 21690, 1529, 2284, 38014, 1529, 38014, 1529, 31336, -1000, + -1000, 2537, 2499, 2509, 2262, 2269, 2269, 2302, -1000, 2508, + 2507, -1000, 1538, 2505, 1532, 998, -1000, 54338, 21690, -1000, + 1529, 37272, -1000, 377, 53596, 1529, 53596, -1000, 2493, -1000, + -1000, 21690, 1979, -1000, 21690, -1000, -1000, -1000, -1000, 6516, + 2522, 1839, -1000, -1000, 886, -1000, 21690, -1000, 10057, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1527, 1509, -1000, + -1000, 1975, 21690, -1000, -1000, -1000, 1742, 1619, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1974, -1000, -1000, -1000, + -1000, 339, -530, 2696, 53596, 1213, -1000, 1614, 1869, 324, + 1529, 1489, 943, 943, 943, 1201, 1178, 37272, 1609, -1000, + 53596, 407, -1000, 339, -1000, -226, -227, 2191, -1000, -1000, + 2447, -1000, -1000, 15742, -1000, -1000, 1969, 1985, -1000, -1000, + -1000, -1000, 2204, -193, -218, -1000, -1000, 2191, 2191, 2191, + 1235, 1478, -1000, 2191, 2191, 1598, 1517, -1000, -1000, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, + 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 1497, + 1723, -1000, 266, 1478, 2115, -1000, -1000, 6516, -1000, -1000, + 2493, 2500, 62, -1000, -1000, 209, 62, 1400, 978, 1478, + 1478, 978, 1699, 2191, 1695, 1652, 2191, 2191, 32078, -1000, + 2483, 2482, 1516, -1000, -1000, 38014, 1516, 38014, 962, 2499, + -275, 21690, 21690, 2255, 1271, -1000, -1000, -1000, -1000, 1480, + 1441, -1000, 1437, -1000, 2591, -1000, 1400, -1000, 1529, 1529, + -1000, 531, 1886, -1000, 2473, 1400, 53596, 1400, 55, 2493, + -1000, 2191, -1000, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1529, 1529, 1529, -1000, -1000, 53596, 2506, -1000, -1000, + 2445, 1553, 164, -1000, 1494, 1869, -1000, -1000, 922, -1000, + 21690, -1000, 37272, 1435, 1432, -1000, -1000, -1000, -1000, -538, + -1000, -1000, -1000, -1000, -1000, -1000, 373, 1860, -1000, 942, + 53596, 55080, -1000, 2167, -1000, -1000, -1000, -1000, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 22860, -1000, 1406, 2181, -1000, -375, -1000, -504, 22860, - -259, -1000, -1000, -259, -1000, -1000, -1000, -1000, -1000, 22860, - -1000, -1000, 22860, -1000, 22860, -1000, -1000, 1542, -1000, -1000, - -1000, 37700, -1000, 1542, -1000, 1542, -1000, -270, -1000, 1882, - -1000, 54766, 1393, 345, -1000, 1162, -1000, -1000, -1000, -1000, - -1000, 55508, 54766, 1907, 54766, -1000, -1000, 1508, 1406, 1830, - 2569, -1000, 1482, -1000, 392, -1000, 2002, 2012, -1000, -1000, - -1000, 20634, -1000, -1000, -1000, -1000, -1000, 249, -185, 16912, - 12424, 1480, -1000, -184, 1538, 1478, -1000, -479, -1000, -1000, - -1000, -1000, 279, -1000, -1000, 1851, -1000, -1000, 1621, 1527, - 1444, -1000, -1000, -1000, -1000, -1000, -1000, -270, -1000, -1000, - 2525, -1000, -226, -1000, -1000, 1367, 1442, -1000, -1000, -1000, - 32506, 54024, -1000, -171, 293, -185, 22860, 1995, 1406, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -52, -1000, -1000, - 799, -1000, -1000, -1000, 2140, -189, -1000, -1000, -1000, 284, - -494, -291, -292, 25086, -1000, 22860, -1000, 22860, -1000, 22860, - -1000, 54766, 1830, -1000, -1000, -1000, 1426, -1000, 4978, -334, - 2177, -1000, -126, -1000, -1000, -1000, 1042, 1359, -1000, -1000, - -1000, -1000, -1000, -1000, 1936, 54766, -1000, 446, -1000, -1000, - 16164, -186, -201, 1000, -1000, -1000, -1000, -1000, -1000, 2007, - 1365, 1353, 1538, -1000, 54766, -1000, 54024, -314, 899, 6271, - -1000, 2164, 2159, 2656, -1000, -1000, -1000, -1000, -1000, -1000, - -544, 1356, 243, -1000, -1000, -1000, 284, -338, -1000, 22860, - -1000, 22860, -1000, 1406, -1000, -1000, 2494, 75, -1000, 2658, - -1000, 2643, 1016, 1016, -1000, 1136, -544, -1000, -1000, -1000, - -1000, 1538, 1538, -1000, -354, -1000, -1000, -1000, -1000, -1000, - 440, 1275, -1000, -1000, -1000, -1000, -1000, 6271, -1000, -1000, - -1000, 263, 263, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 21690, -1000, 1478, 2112, + -1000, -370, -1000, -502, 21690, -266, -1000, -1000, -266, -1000, + -1000, -1000, -1000, -1000, 21690, -1000, -1000, 21690, -1000, 21690, + -1000, -1000, 1516, -1000, -1000, -1000, 36530, -1000, 1516, -1000, + 1516, -1000, -275, -1000, 1859, -1000, 53596, 1400, 375, -1000, + 1234, -1000, -1000, -1000, -1000, -1000, 54338, 53596, 1886, 53596, + -1000, -1000, 1508, 1478, 1529, 2473, -1000, 1506, -1000, 373, + -1000, 1968, 1994, -1000, -1000, -1000, 19464, -1000, -1000, -1000, + -1000, -1000, 249, -200, 15742, 11254, 1500, -1000, -198, 2191, + 1497, -1000, -476, -1000, -1000, -1000, -1000, 303, -1000, -1000, + 1858, -1000, -1000, 1647, 1616, 1541, -1000, -1000, -1000, -1000, + -1000, -1000, -275, -1000, -1000, 2442, -1000, -230, -1000, -1000, + 1848, 1493, -1000, -1000, -1000, 31336, 52854, -1000, -187, 376, + -200, 21690, 1961, 1478, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -20, -1000, -1000, 494, -1000, -1000, -1000, 1980, + -215, -1000, -1000, -1000, 310, -495, -317, -318, 23916, -1000, + 21690, -1000, 21690, -1000, 21690, -1000, 53596, 1529, -1000, -1000, + -1000, 1477, -1000, 5091, -342, 2111, -1000, -109, -1000, -1000, + -1000, 1059, 1408, -1000, -1000, -1000, -1000, -1000, -1000, 2305, + 53596, -1000, 417, -1000, -1000, 14994, -202, -219, 990, -1000, + -1000, -1000, -1000, -1000, 3283, 1488, 1303, 2191, -1000, 53596, + -1000, 52854, -330, 876, 6516, -1000, 2103, 2079, 2582, -1000, + -1000, -1000, -1000, -1000, -1000, -545, 1455, 245, -1000, -1000, + -1000, 310, -338, -1000, 21690, -1000, 21690, -1000, 1478, -1000, + -1000, 2417, 55, -1000, 2588, -1000, 2577, 907, 907, -1000, + 1144, -545, -1000, -1000, -1000, -1000, 2191, 2191, -1000, -361, + -1000, -1000, -1000, -1000, -1000, 413, 1240, -1000, -1000, -1000, + -1000, -1000, 6516, -1000, -1000, -1000, 282, 282, -1000, -1000, } var yyPgo = [...]int{ - 0, 3243, 3242, 31, 6, 37, 36, 3240, 3239, 3238, - 174, 3237, 3235, 3224, 3223, 3222, 3221, 2754, 2745, 2728, - 3220, 3219, 3218, 3215, 3213, 3211, 3210, 3209, 3208, 38, - 116, 91, 104, 201, 213, 3205, 170, 161, 197, 3203, - 3202, 3201, 115, 187, 84, 92, 195, 3200, 3199, 71, - 3196, 3194, 3192, 190, 189, 188, 1092, 3190, 184, 114, - 48, 3189, 3187, 3184, 3182, 3179, 3178, 3176, 3174, 3173, - 3172, 3170, 3169, 3168, 3165, 3163, 3162, 3161, 3160, 285, - 3157, 3155, 12, 3154, 73, 3153, 3152, 3149, 3147, 3146, - 8, 3140, 3139, 26, 45, 63, 3136, 3134, 44, 3132, - 3131, 3129, 3125, 3124, 72, 3123, 27, 3121, 40, 3120, - 3117, 124, 3115, 3111, 3105, 42, 3104, 3100, 3098, 28, - 169, 3097, 3094, 140, 3093, 3092, 3087, 167, 205, 3085, - 2265, 3082, 99, 3080, 3079, 3077, 166, 193, 3076, 125, - 3074, 3073, 3072, 152, 3068, 3263, 3066, 3065, 59, 80, - 164, 3064, 3062, 199, 79, 54, 3061, 17, 19, 3060, - 3058, 67, 70, 3057, 108, 3056, 3054, 103, 77, 3052, - 105, 102, 3051, 3050, 5, 7, 3048, 1, 4, 2, - 83, 3047, 3044, 119, 3041, 3040, 3039, 101, 3037, 3035, - 4407, 3031, 93, 130, 106, 76, 3028, 171, 132, 3027, - 3026, 3022, 3021, 3016, 2985, 49, 2984, 2983, 2982, 136, - 22, 110, 2981, 146, 346, 51, 147, 2978, 196, 78, - 2977, 172, 2971, 2969, 134, 133, 2968, 2962, 58, 168, - 194, 2960, 96, 129, 120, 176, 95, 135, 2954, 2946, - 56, 62, 2944, 2943, 2940, 2939, 181, 2935, 2929, 61, - 2927, 53, 2925, 182, 2924, 306, 69, 2922, 180, 162, - 2921, 60, 2919, 2918, 68, 100, 55, 39, 2914, 157, - 160, 127, 165, 2913, 2912, 52, 2905, 2899, 2894, 200, - 301, 2891, 2890, 329, 183, 143, 149, 85, 2887, 323, - 2886, 2885, 2884, 16, 5094, 7550, 186, 25, 159, 2883, - 2882, 8334, 20, 43, 24, 2872, 210, 2869, 185, 2867, - 2866, 2865, 211, 207, 112, 158, 57, 2864, 2859, 2857, - 2856, 64, 2855, 2850, 2849, 2848, 2847, 2846, 35, 34, - 33, 75, 218, 65, 21, 98, 156, 151, 66, 2843, - 2841, 2839, 123, 90, 2835, 155, 153, 126, 163, 2829, - 175, 142, 117, 2823, 87, 32, 2822, 2821, 2819, 2818, - 89, 2813, 2810, 2806, 2805, 150, 144, 121, 81, 2803, - 82, 118, 148, 145, 50, 2799, 46, 2798, 2797, 30, - 191, 29, 2787, 13, 111, 109, 2780, 6691, 2779, 9, - 305, 154, 2776, 2775, 10, 11, 14, 2772, 2771, 2770, - 2769, 131, 2768, 2765, 2763, 2761, 23, 47, 18, 15, - 113, 137, 74, 2760, 2746, 141, 2732, 2727, 2722, 0, - 1034, 128, 2721, 202, + 0, 3230, 3220, 33, 5, 38, 37, 3214, 3213, 3212, + 176, 3211, 3209, 3205, 3204, 3203, 3202, 2650, 2613, 2609, + 3200, 3199, 3194, 3191, 3189, 3188, 3187, 3183, 3181, 43, + 115, 97, 113, 200, 212, 3176, 3175, 170, 165, 196, + 3174, 3171, 3168, 118, 189, 73, 81, 192, 3167, 3166, + 66, 3164, 3163, 3162, 187, 186, 184, 1061, 3161, 178, + 111, 47, 3160, 3159, 3157, 3151, 3150, 3147, 3145, 3142, + 3136, 3134, 3133, 3131, 3128, 3126, 3119, 3114, 3111, 3110, + 284, 3108, 3107, 14, 3106, 70, 3103, 3100, 3099, 3098, + 3097, 6, 3096, 3095, 30, 39, 59, 3093, 3092, 44, + 3091, 3087, 3085, 3083, 3082, 79, 3081, 15, 3078, 35, + 3072, 3071, 126, 3070, 3069, 3068, 40, 3067, 3065, 3061, + 9, 169, 3059, 3056, 140, 3055, 3052, 3048, 167, 202, + 3047, 2275, 3040, 94, 3037, 3031, 3030, 166, 193, 3029, + 123, 3006, 3004, 3002, 152, 3000, 3337, 2998, 2996, 63, + 67, 164, 2995, 2993, 199, 65, 10, 2991, 21, 19, + 2990, 2987, 64, 68, 2985, 112, 2982, 2981, 95, 72, + 2980, 90, 107, 2976, 2974, 27, 8, 2973, 1, 4, + 2, 105, 2966, 2963, 117, 2961, 2960, 2959, 93, 2955, + 2952, 3364, 2949, 83, 135, 96, 78, 2946, 172, 116, + 2942, 2940, 2939, 2936, 2929, 2928, 51, 2927, 2926, 2920, + 141, 1261, 102, 2914, 2908, 147, 344, 130, 52, 133, + 2905, 146, 2903, 208, 75, 2901, 171, 2900, 2899, 138, + 137, 2895, 2889, 55, 168, 195, 2888, 91, 129, 122, + 182, 89, 131, 2883, 2881, 57, 61, 2878, 2875, 2870, + 2866, 181, 2862, 2860, 58, 2859, 54, 2856, 191, 2854, + 306, 71, 2848, 180, 163, 2842, 60, 2841, 2840, 82, + 104, 121, 34, 2839, 157, 161, 127, 162, 2838, 2837, + 53, 2836, 2831, 2827, 194, 312, 2826, 2824, 350, 177, + 143, 150, 84, 2823, 318, 2822, 2819, 2813, 24, 4524, + 6056, 179, 32, 159, 2811, 2810, 7149, 48, 41, 11, + 2809, 210, 2807, 188, 2806, 2802, 2800, 217, 207, 99, + 158, 56, 2796, 2794, 2792, 2791, 42, 2790, 2789, 2788, + 2785, 2782, 2772, 36, 31, 29, 62, 197, 80, 7, + 92, 160, 154, 69, 2768, 2766, 2765, 120, 98, 2763, + 156, 155, 125, 101, 2742, 175, 144, 108, 2741, 87, + 28, 2740, 2737, 2736, 2731, 85, 2730, 2727, 2726, 2723, + 153, 148, 119, 77, 2719, 76, 114, 151, 145, 50, + 2717, 45, 2699, 2696, 26, 190, 25, 2695, 16, 103, + 110, 2693, 6238, 2692, 12, 304, 149, 2691, 2688, 13, + 17, 20, 2686, 2681, 2680, 2678, 136, 2677, 2672, 2668, + 2663, 23, 49, 22, 18, 106, 139, 74, 2660, 2656, + 142, 2654, 2643, 2642, 0, 1038, 128, 2629, 198, } -//line sql.y:8764 +//line sql.y:8806 type yySymType struct { union any empty struct{} @@ -8490,6 +8374,11 @@ func (st *yySymType) tableSpecUnion() *TableSpec { return v } +func (st *yySymType) tableStmtUnion() TableStatement { + v, _ := st.union.(TableStatement) + return v +} + func (st *yySymType) trimTypeUnion() TrimType { v, _ := st.union.(TrimType) return v @@ -8576,235 +8465,236 @@ func (st *yySymType) withUnion() *With { } var yyR1 = [...]int{ - 0, 417, 418, 418, 7, 7, 7, 7, 7, 7, + 0, 422, 423, 423, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 261, 387, 259, 259, 28, 74, 36, 36, 35, - 35, 38, 38, 37, 31, 31, 31, 32, 32, 32, + 7, 266, 392, 264, 264, 28, 75, 37, 37, 36, + 36, 39, 39, 38, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, - 29, 29, 29, 29, 30, 30, 30, 30, 30, 15, - 16, 34, 34, 17, 17, 109, 109, 18, 19, 19, - 19, 19, 421, 421, 185, 185, 183, 183, 184, 184, - 264, 264, 20, 268, 268, 270, 270, 270, 270, 260, - 260, 260, 21, 21, 269, 269, 271, 271, 271, 274, - 274, 274, 274, 315, 315, 315, 22, 22, 22, 22, - 22, 129, 129, 389, 389, 388, 383, 383, 382, 382, - 381, 386, 386, 385, 385, 384, 40, 41, 50, 50, - 50, 50, 51, 52, 390, 390, 356, 57, 57, 56, - 56, 56, 56, 56, 56, 58, 58, 54, 54, 53, - 53, 55, 55, 358, 358, 344, 344, 357, 357, 357, - 357, 357, 357, 357, 343, 343, 140, 140, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 405, 405, 405, 404, 404, - 239, 239, 239, 239, 239, 239, 239, 239, 149, 149, - 161, 161, 161, 161, 161, 161, 147, 147, 148, 146, - 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 160, 160, 155, 155, 155, 157, 157, 156, 156, 156, - 158, 158, 406, 406, 406, 406, 321, 321, 321, 321, - 324, 324, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 323, 323, 323, 323, 323, 323, 323, 325, 325, - 325, 325, 325, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 327, 327, 327, 327, 327, 327, 327, 327, 342, 342, - 331, 331, 336, 336, 337, 337, 338, 338, 338, 339, - 339, 339, 340, 340, 333, 333, 333, 333, 333, 333, - 333, 333, 333, 335, 335, 334, 334, 334, 345, 370, - 370, 369, 369, 367, 367, 367, 367, 367, 367, 367, - 367, 354, 354, 364, 364, 364, 364, 364, 353, 353, - 349, 349, 349, 350, 350, 351, 351, 348, 348, 352, - 352, 366, 366, 365, 365, 346, 346, 347, 347, 372, - 407, 407, 407, 407, 407, 408, 408, 373, 397, 399, - 399, 399, 398, 398, 395, 396, 394, 394, 394, 394, - 394, 84, 84, 84, 287, 287, 288, 288, 362, 362, - 361, 361, 361, 363, 363, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 282, 282, 282, 393, - 393, 393, 393, 393, 393, 392, 392, 392, 359, 359, - 359, 359, 391, 391, 59, 59, 219, 219, 410, 410, - 412, 412, 412, 47, 47, 47, 47, 47, 47, 46, - 46, 46, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 48, 48, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 23, 23, 23, 23, 23, + 29, 29, 29, 29, 30, 30, 30, 30, 30, 35, + 35, 15, 16, 34, 34, 34, 17, 17, 110, 110, + 18, 19, 19, 19, 19, 426, 426, 186, 186, 184, + 184, 185, 185, 269, 269, 20, 273, 273, 275, 275, + 275, 275, 265, 265, 265, 21, 21, 274, 274, 276, + 276, 276, 279, 279, 279, 279, 320, 320, 320, 22, + 22, 22, 22, 22, 130, 130, 394, 394, 393, 388, + 388, 387, 387, 386, 391, 391, 390, 390, 389, 41, + 42, 51, 51, 51, 51, 52, 53, 395, 395, 361, + 58, 58, 57, 57, 57, 57, 57, 57, 59, 59, + 55, 55, 54, 54, 56, 56, 363, 363, 349, 349, + 362, 362, 362, 362, 362, 362, 362, 348, 348, 141, + 141, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 410, 410, + 410, 409, 409, 244, 244, 244, 244, 244, 244, 244, + 244, 150, 150, 162, 162, 162, 162, 162, 162, 148, + 148, 149, 147, 147, 147, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 161, 161, 156, 156, 156, 158, 158, + 157, 157, 157, 159, 159, 411, 411, 411, 411, 326, + 326, 326, 326, 329, 329, 327, 327, 327, 327, 327, + 327, 327, 327, 327, 328, 328, 328, 328, 328, 328, + 328, 330, 330, 330, 330, 330, 331, 331, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, + 331, 331, 331, 332, 332, 332, 332, 332, 332, 332, + 332, 347, 347, 336, 336, 341, 341, 342, 342, 343, + 343, 343, 344, 344, 344, 345, 345, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 340, 340, 339, 339, + 339, 350, 375, 375, 374, 374, 372, 372, 372, 372, + 372, 372, 372, 372, 359, 359, 369, 369, 369, 369, + 369, 358, 358, 354, 354, 354, 355, 355, 356, 356, + 353, 353, 357, 357, 371, 371, 370, 370, 351, 351, + 352, 352, 377, 412, 412, 412, 412, 412, 413, 413, + 378, 402, 404, 404, 404, 403, 403, 400, 401, 399, + 399, 399, 399, 399, 85, 85, 85, 292, 292, 293, + 293, 367, 367, 366, 366, 366, 368, 368, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 287, + 287, 287, 398, 398, 398, 398, 398, 398, 397, 397, + 397, 364, 364, 364, 364, 396, 396, 60, 60, 224, + 224, 415, 415, 417, 417, 417, 48, 48, 48, 48, + 48, 48, 47, 47, 47, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 49, 49, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 111, - 111, 112, 112, 112, 112, 114, 114, 114, 375, 375, - 60, 60, 3, 3, 173, 175, 176, 176, 174, 174, - 174, 174, 174, 174, 62, 62, 61, 61, 178, 177, - 179, 179, 179, 1, 1, 2, 2, 4, 4, 380, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 341, 341, 341, 374, 374, 376, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 117, 116, 116, - 115, 118, 118, 118, 118, 118, 118, 118, 118, 378, - 378, 378, 63, 63, 379, 328, 329, 330, 5, 6, - 355, 377, 125, 125, 24, 39, 39, 25, 25, 25, - 25, 26, 26, 64, 67, 67, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 292, 292, 281, 281, 290, 290, 280, 280, - 306, 306, 306, 283, 283, 283, 284, 284, 403, 403, - 403, 277, 277, 66, 66, 66, 307, 307, 307, 307, - 69, 69, 413, 413, 414, 414, 415, 415, 415, 70, - 71, 71, 310, 310, 311, 311, 72, 73, 85, 85, - 85, 85, 85, 86, 86, 86, 86, 86, 86, 110, - 110, 110, 10, 10, 10, 10, 81, 81, 81, 9, - 9, 11, 68, 68, 75, 400, 400, 401, 402, 402, - 402, 402, 76, 78, 27, 27, 27, 27, 27, 27, - 135, 135, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 130, 130, 130, 124, 124, 422, - 79, 80, 80, 128, 128, 128, 121, 121, 121, 127, - 127, 127, 12, 12, 13, 263, 263, 14, 14, 134, - 134, 133, 133, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 131, 131, 132, 132, 132, 132, - 299, 299, 299, 298, 298, 167, 167, 169, 168, 168, - 170, 170, 171, 171, 171, 171, 217, 217, 193, 193, - 256, 256, 257, 257, 255, 255, 262, 262, 258, 258, - 258, 258, 265, 265, 172, 172, 172, 172, 180, 180, - 181, 181, 182, 182, 309, 309, 304, 304, 304, 303, - 303, 186, 186, 186, 188, 187, 187, 187, 187, 189, - 189, 191, 191, 190, 190, 192, 197, 197, 196, 196, - 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, - 198, 198, 145, 145, 145, 145, 145, 145, 145, 145, - 411, 411, 159, 159, 159, 159, 159, 159, 159, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 246, 246, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 222, 222, 221, 221, 87, 87, 87, 88, - 88, 89, 89, 89, 89, 89, 90, 90, 90, 90, - 90, 90, 90, 92, 92, 91, 91, 212, 212, 296, - 296, 93, 94, 94, 95, 95, 98, 98, 97, 96, - 96, 102, 102, 99, 99, 101, 101, 100, 103, 103, - 104, 105, 105, 278, 278, 199, 199, 208, 208, 208, - 208, 200, 200, 201, 201, 201, 201, 201, 201, 209, - 209, 209, 216, 210, 210, 206, 206, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 164, 164, 164, 164, 227, 227, 151, 151, 151, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 112, 112, 113, 113, 113, 113, 115, 115, + 115, 380, 380, 61, 61, 3, 3, 174, 176, 177, + 177, 175, 175, 175, 175, 175, 175, 63, 63, 62, + 62, 179, 178, 180, 180, 180, 1, 1, 2, 2, + 4, 4, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 346, 346, 346, 379, 379, 381, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 118, 117, 117, 116, 119, 119, 119, 119, 119, 119, + 119, 119, 383, 383, 383, 64, 64, 384, 333, 334, + 335, 5, 6, 360, 382, 126, 126, 24, 40, 40, + 25, 25, 25, 25, 26, 26, 65, 68, 68, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 297, 297, 286, 286, 295, + 295, 285, 285, 311, 311, 311, 288, 288, 288, 289, + 289, 408, 408, 408, 282, 282, 67, 67, 67, 312, + 312, 312, 312, 70, 70, 418, 418, 419, 419, 420, + 420, 420, 71, 72, 72, 315, 315, 316, 316, 73, + 74, 86, 86, 86, 86, 86, 87, 87, 87, 87, + 87, 87, 111, 111, 111, 10, 10, 10, 10, 82, + 82, 82, 9, 9, 11, 69, 69, 76, 405, 405, + 406, 407, 407, 407, 407, 77, 79, 27, 27, 27, + 27, 27, 27, 136, 136, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 131, 131, 131, + 125, 125, 427, 80, 81, 81, 129, 129, 129, 122, + 122, 122, 128, 128, 128, 12, 12, 13, 268, 268, + 14, 14, 135, 135, 134, 134, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 132, 132, 133, + 133, 133, 133, 304, 304, 304, 303, 303, 168, 168, + 170, 169, 169, 171, 171, 172, 172, 172, 172, 222, + 222, 194, 194, 261, 261, 262, 262, 260, 260, 267, + 267, 263, 263, 263, 263, 270, 270, 173, 173, 173, + 173, 181, 181, 182, 182, 183, 183, 314, 314, 309, + 309, 309, 308, 308, 187, 187, 187, 189, 188, 188, + 188, 188, 190, 190, 192, 192, 191, 191, 193, 198, + 198, 197, 197, 195, 195, 195, 195, 195, 195, 196, + 196, 196, 196, 199, 199, 146, 146, 146, 146, 146, + 146, 146, 146, 416, 416, 160, 160, 160, 160, 160, + 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 251, 251, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 152, 152, 165, 165, 165, 165, 166, 166, - 166, 166, 166, 166, 166, 317, 317, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 227, 227, 226, 226, 88, + 88, 88, 89, 89, 90, 90, 90, 90, 90, 91, + 91, 91, 91, 91, 91, 91, 93, 93, 92, 92, + 213, 213, 301, 301, 94, 95, 95, 96, 96, 99, + 99, 98, 97, 97, 103, 103, 100, 100, 102, 102, + 101, 104, 104, 105, 106, 106, 283, 283, 200, 200, + 209, 209, 209, 209, 201, 201, 202, 202, 202, 202, + 202, 202, 210, 210, 210, 221, 211, 211, 207, 207, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 165, 165, 165, 165, 232, 232, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 153, 153, 166, 166, 166, + 166, 167, 167, 167, 167, 167, 167, 167, 322, 322, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 423, 423, 332, 332, 332, - 207, 207, 207, 207, 207, 126, 126, 126, 126, 126, - 314, 314, 314, 318, 318, 318, 316, 316, 316, 316, - 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, - 316, 319, 319, 225, 225, 122, 122, 223, 223, 224, - 226, 226, 218, 218, 218, 218, 220, 220, 203, 203, - 203, 228, 228, 320, 320, 229, 229, 106, 107, 107, - 108, 108, 230, 230, 232, 231, 231, 233, 234, 234, - 234, 235, 235, 236, 236, 236, 49, 49, 49, 49, - 49, 44, 44, 44, 44, 45, 45, 45, 45, 137, - 137, 137, 137, 139, 139, 138, 138, 82, 82, 83, - 83, 83, 143, 143, 144, 144, 144, 141, 141, 142, - 142, 253, 253, 253, 253, 253, 253, 253, 237, 237, - 237, 244, 244, 244, 240, 240, 242, 242, 242, 243, - 243, 243, 241, 250, 250, 252, 252, 251, 251, 247, - 247, 248, 248, 249, 249, 249, 245, 245, 202, 202, - 202, 202, 202, 254, 254, 254, 254, 308, 308, 308, - 266, 266, 213, 213, 215, 215, 214, 214, 163, 267, - 267, 275, 272, 272, 273, 273, 300, 300, 300, 276, - 276, 289, 289, 285, 285, 286, 286, 279, 279, 291, - 291, 291, 77, 211, 211, 371, 371, 368, 295, 295, - 297, 297, 301, 301, 305, 305, 302, 302, 8, 416, - 416, 416, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 294, 294, 419, 420, 312, 313, 313, 313, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 428, 428, + 337, 337, 337, 208, 208, 208, 208, 208, 127, 127, + 127, 127, 127, 319, 319, 319, 323, 323, 323, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 324, 324, 230, 230, 123, 123, + 228, 228, 229, 231, 231, 223, 223, 223, 223, 225, + 225, 204, 204, 204, 233, 233, 325, 325, 234, 234, + 107, 108, 108, 109, 109, 235, 235, 237, 236, 236, + 238, 239, 239, 239, 240, 240, 241, 241, 241, 50, + 50, 50, 50, 50, 45, 45, 45, 45, 46, 46, + 46, 46, 138, 138, 138, 138, 140, 140, 139, 139, + 83, 83, 84, 84, 84, 144, 144, 145, 145, 145, + 142, 142, 143, 143, 258, 258, 258, 258, 258, 258, + 258, 242, 242, 242, 249, 249, 249, 245, 245, 247, + 247, 247, 248, 248, 248, 246, 255, 255, 257, 257, + 256, 256, 252, 252, 253, 253, 254, 254, 254, 250, + 250, 203, 203, 203, 203, 203, 259, 259, 259, 259, + 313, 313, 313, 271, 271, 214, 214, 215, 215, 219, + 219, 218, 218, 216, 217, 220, 220, 164, 272, 272, + 280, 277, 277, 278, 278, 305, 305, 305, 281, 281, + 294, 294, 290, 290, 291, 291, 284, 284, 296, 296, + 296, 78, 212, 212, 376, 376, 373, 300, 300, 302, + 302, 306, 306, 310, 310, 307, 307, 8, 421, 421, + 421, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, + 299, 299, 424, 425, 317, 318, 318, 318, } var yyR2 = [...]int{ @@ -8815,164 +8705,165 @@ var yyR2 = [...]int{ 0, 1, 1, 1, 1, 2, 3, 2, 3, 0, 1, 3, 1, 4, 3, 3, 4, 3, 2, 3, 4, 3, 4, 2, 7, 1, 3, 3, 3, 3, - 1, 2, 1, 1, 3, 2, 3, 3, 2, 5, - 7, 10, 9, 7, 8, 1, 1, 10, 11, 9, - 8, 8, 1, 1, 1, 3, 1, 3, 1, 3, - 0, 4, 3, 1, 3, 3, 3, 3, 3, 1, - 1, 2, 5, 4, 1, 3, 3, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 2, 2, 6, 12, - 2, 0, 2, 0, 2, 1, 0, 2, 1, 3, - 3, 0, 1, 1, 3, 3, 6, 4, 7, 8, - 8, 8, 5, 3, 1, 1, 5, 0, 1, 1, - 1, 1, 2, 2, 2, 0, 1, 4, 4, 4, - 4, 4, 4, 2, 4, 1, 3, 1, 1, 3, - 4, 3, 3, 3, 5, 10, 0, 2, 0, 2, - 3, 5, 3, 4, 2, 3, 2, 3, 3, 3, - 3, 2, 2, 4, 4, 1, 1, 1, 1, 1, - 0, 2, 2, 3, 3, 2, 2, 2, 1, 1, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 3, 2, 3, 3, 2, 3, + 3, 5, 7, 10, 9, 1, 7, 8, 1, 1, + 10, 11, 9, 8, 8, 1, 1, 1, 3, 1, + 3, 1, 3, 0, 4, 3, 1, 3, 3, 3, + 3, 3, 1, 1, 2, 5, 4, 1, 3, 3, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, + 2, 6, 12, 2, 0, 2, 0, 2, 1, 0, + 2, 1, 3, 3, 0, 1, 1, 3, 3, 6, + 4, 7, 8, 8, 8, 5, 3, 1, 1, 5, + 0, 1, 1, 1, 1, 2, 2, 2, 0, 1, + 4, 4, 4, 4, 4, 4, 2, 4, 1, 3, + 1, 1, 3, 4, 3, 3, 3, 5, 10, 0, + 2, 0, 2, 3, 5, 3, 4, 2, 3, 2, + 3, 3, 3, 3, 2, 2, 4, 4, 1, 1, + 1, 1, 1, 0, 2, 2, 3, 3, 2, 2, + 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, - 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 5, 2, 5, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 3, 0, 5, 1, 3, 0, 3, 5, 0, - 1, 1, 0, 1, 0, 3, 3, 2, 2, 2, - 1, 2, 2, 0, 1, 0, 2, 2, 5, 0, - 1, 1, 2, 1, 3, 2, 1, 1, 3, 3, - 3, 0, 1, 4, 3, 3, 4, 2, 0, 2, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, - 1, 1, 3, 3, 4, 3, 1, 3, 1, 7, - 6, 7, 7, 8, 8, 0, 1, 5, 2, 1, - 1, 1, 0, 1, 3, 3, 1, 1, 2, 2, - 2, 0, 1, 1, 1, 2, 0, 1, 0, 1, - 1, 3, 2, 1, 2, 3, 3, 3, 4, 4, - 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 2, 1, 1, 2, 1, 2, 1, 3, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 5, 2, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 0, 3, 0, 5, 1, 3, 0, + 3, 5, 0, 1, 1, 0, 1, 0, 3, 3, + 2, 2, 2, 1, 2, 2, 0, 1, 0, 2, + 2, 5, 0, 1, 1, 2, 1, 3, 2, 1, + 1, 3, 3, 3, 0, 1, 4, 3, 3, 4, + 2, 0, 2, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 0, 1, 1, 3, 3, 4, 3, 1, + 3, 1, 7, 6, 7, 7, 8, 8, 0, 1, + 5, 2, 1, 1, 1, 0, 1, 3, 3, 1, + 1, 2, 2, 2, 0, 1, 1, 1, 2, 0, + 1, 0, 1, 1, 3, 2, 1, 2, 3, 3, + 3, 4, 4, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 5, 0, 2, 2, 1, + 3, 3, 3, 3, 3, 3, 3, 4, 5, 0, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 0, 1, 0, 1, 0, + 2, 0, 2, 0, 2, 2, 0, 1, 5, 1, + 3, 7, 1, 3, 3, 1, 2, 2, 2, 5, + 5, 5, 6, 8, 5, 5, 4, 4, 4, 6, + 5, 5, 5, 2, 2, 2, 2, 3, 3, 3, + 4, 3, 3, 1, 3, 5, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 3, 4, + 4, 2, 11, 3, 6, 8, 6, 6, 6, 13, + 8, 6, 6, 10, 7, 5, 5, 5, 5, 7, + 5, 5, 5, 5, 5, 7, 7, 5, 5, 5, + 5, 6, 0, 6, 5, 6, 4, 5, 0, 8, + 9, 0, 3, 0, 1, 0, 3, 8, 4, 1, + 3, 3, 6, 7, 7, 8, 4, 0, 1, 0, + 1, 3, 3, 1, 1, 2, 1, 1, 0, 2, + 0, 2, 5, 3, 7, 4, 4, 4, 4, 3, + 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 0, 2, 2, 1, 3, 2, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 3, 3, 0, 2, 2, 2, 2, 2, + 2, 2, 4, 4, 3, 0, 1, 4, 3, 4, + 4, 3, 3, 3, 2, 1, 3, 3, 3, 5, + 7, 7, 6, 5, 3, 2, 4, 5, 5, 3, + 3, 7, 3, 3, 3, 3, 4, 7, 5, 2, + 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, + 4, 4, 2, 3, 3, 3, 3, 3, 5, 2, + 3, 3, 2, 3, 4, 4, 4, 3, 4, 4, + 5, 3, 5, 3, 5, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 2, 2, 0, 2, 2, 0, + 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, + 1, 1, 1, 1, 3, 0, 1, 1, 3, 3, + 2, 2, 1, 1, 5, 0, 1, 0, 1, 2, + 3, 0, 3, 3, 3, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 4, 4, 4, 2, 2, 3, 1, 3, + 2, 1, 2, 1, 2, 2, 4, 3, 3, 6, + 4, 7, 6, 1, 3, 2, 2, 2, 2, 1, + 1, 1, 3, 2, 1, 1, 1, 0, 1, 1, + 0, 3, 0, 2, 0, 2, 1, 2, 2, 0, + 1, 1, 0, 1, 1, 5, 5, 4, 0, 2, + 4, 4, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 0, 1, 0, 1, 0, 2, 0, 2, - 0, 2, 2, 0, 1, 5, 1, 3, 7, 1, - 3, 3, 1, 2, 2, 2, 5, 5, 5, 6, - 8, 5, 5, 4, 4, 4, 6, 5, 5, 5, - 2, 2, 2, 2, 3, 3, 3, 4, 3, 3, - 1, 3, 5, 1, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 3, 4, 4, 2, 11, - 3, 6, 8, 6, 6, 6, 13, 8, 6, 6, - 10, 7, 5, 5, 5, 5, 7, 5, 5, 5, - 5, 5, 7, 7, 5, 5, 5, 5, 6, 0, - 6, 5, 6, 4, 5, 0, 8, 9, 0, 3, - 0, 1, 0, 3, 8, 4, 1, 3, 3, 6, - 7, 7, 8, 4, 0, 1, 0, 1, 3, 3, - 1, 1, 2, 1, 1, 0, 2, 0, 2, 5, - 3, 7, 4, 4, 4, 4, 3, 3, 3, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 0, 2, 2, 1, 3, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 1, 3, - 3, 0, 2, 2, 2, 2, 2, 2, 2, 4, - 4, 3, 0, 1, 4, 3, 4, 4, 3, 3, - 3, 2, 1, 3, 3, 3, 5, 7, 7, 6, - 5, 3, 2, 4, 5, 5, 3, 3, 7, 3, - 3, 3, 3, 4, 7, 5, 2, 4, 4, 4, - 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, - 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, - 3, 3, 3, 3, 3, 5, 2, 3, 3, 2, - 3, 4, 4, 4, 3, 4, 4, 5, 3, 5, - 3, 5, 0, 1, 0, 1, 0, 1, 1, 1, - 0, 2, 2, 0, 2, 2, 0, 2, 0, 1, - 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, - 1, 3, 0, 1, 1, 3, 3, 2, 2, 1, - 1, 5, 0, 1, 0, 1, 2, 3, 0, 3, - 3, 3, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, - 4, 4, 2, 2, 3, 1, 3, 2, 1, 2, - 1, 2, 2, 4, 3, 3, 6, 4, 7, 6, - 1, 3, 2, 2, 2, 2, 1, 1, 1, 3, - 2, 1, 1, 1, 0, 1, 1, 0, 3, 0, - 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, - 1, 1, 5, 5, 4, 0, 2, 4, 4, 0, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, - 0, 1, 2, 1, 1, 0, 1, 2, 1, 3, - 1, 1, 1, 4, 3, 1, 1, 2, 3, 7, - 0, 3, 0, 1, 1, 3, 1, 3, 1, 1, - 3, 3, 1, 3, 4, 4, 4, 3, 2, 4, - 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, - 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, - 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, - 6, 5, 6, 6, 5, 5, 0, 2, 3, 3, - 0, 2, 3, 3, 3, 2, 3, 1, 3, 6, - 1, 1, 3, 4, 3, 4, 4, 4, 1, 3, - 4, 5, 6, 3, 4, 5, 6, 3, 4, 1, - 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, - 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, - 1, 3, 1, 1, 1, 2, 2, 2, 2, 1, - 1, 2, 7, 7, 6, 6, 2, 2, 5, 6, - 3, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 4, 2, 4, 0, 1, 2, 5, 0, 3, 0, - 1, 4, 4, 2, 1, 0, 0, 1, 1, 2, - 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, - 5, 1, 3, 0, 3, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 4, 6, 4, 4, 8, - 8, 6, 8, 6, 5, 4, 10, 2, 2, 1, - 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, - 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 8, 4, 8, 8, 6, 5, 4, 4, 4, - 5, 7, 4, 4, 7, 4, 4, 6, 6, 6, - 8, 6, 6, 4, 4, 3, 4, 6, 6, 4, - 4, 6, 4, 6, 4, 4, 4, 4, 4, 4, - 6, 4, 6, 4, 4, 4, 6, 4, 6, 4, - 4, 6, 4, 6, 4, 6, 8, 4, 6, 8, + 2, 3, 5, 0, 1, 2, 1, 1, 0, 1, + 2, 1, 3, 1, 1, 1, 4, 3, 1, 1, + 2, 3, 7, 0, 3, 0, 1, 1, 3, 1, + 3, 1, 1, 3, 3, 1, 3, 4, 4, 4, + 3, 2, 4, 0, 1, 0, 2, 0, 1, 0, + 1, 2, 1, 1, 1, 2, 2, 1, 2, 3, + 2, 3, 2, 2, 2, 1, 1, 3, 3, 0, + 1, 1, 2, 6, 5, 6, 6, 5, 5, 0, + 2, 3, 3, 0, 2, 3, 3, 3, 2, 3, + 1, 3, 6, 1, 1, 3, 4, 3, 4, 4, + 4, 1, 3, 4, 5, 6, 3, 4, 5, 6, + 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, + 2, 2, 1, 1, 2, 7, 7, 6, 6, 2, + 2, 5, 6, 3, 3, 1, 3, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 4, 2, 4, 0, 1, 2, 5, + 0, 3, 0, 1, 4, 4, 2, 1, 0, 0, + 1, 1, 2, 2, 1, 1, 2, 2, 0, 1, + 1, 1, 1, 5, 1, 3, 0, 3, 1, 1, + 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 6, + 4, 4, 8, 8, 6, 8, 6, 5, 4, 10, + 2, 2, 1, 2, 2, 2, 2, 2, 5, 6, + 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 8, 4, 8, 8, 6, 5, + 4, 4, 4, 5, 7, 4, 4, 7, 4, 4, + 6, 6, 6, 8, 6, 6, 4, 4, 3, 4, + 6, 6, 4, 4, 6, 4, 6, 4, 4, 4, + 4, 4, 4, 6, 4, 6, 4, 4, 4, 6, + 4, 6, 4, 4, 6, 4, 6, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, - 6, 8, 4, 4, 4, 6, 4, 6, 4, 8, - 6, 4, 4, 6, 4, 6, 8, 4, 6, 8, - 4, 4, 6, 8, 6, 4, 6, 6, 8, 10, - 7, 8, 8, 9, 4, 4, 4, 4, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, - 4, 4, 4, 4, 6, 4, 6, 5, 9, 6, - 9, 8, 6, 8, 8, 8, 6, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 2, 6, 8, 10, - 12, 14, 6, 8, 8, 10, 12, 14, 6, 8, - 10, 12, 6, 8, 4, 4, 3, 4, 6, 6, - 4, 6, 4, 6, 8, 0, 2, 1, 1, 1, + 6, 8, 4, 6, 8, 4, 4, 4, 6, 4, + 6, 4, 8, 6, 4, 4, 6, 4, 6, 8, + 4, 6, 8, 4, 4, 6, 8, 6, 4, 6, + 6, 8, 10, 7, 8, 8, 9, 4, 4, 4, + 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, + 5, 9, 6, 9, 8, 6, 8, 8, 8, 6, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 6, 8, 10, 12, 14, 6, 8, 8, 10, 12, + 14, 6, 8, 10, 12, 6, 8, 4, 4, 3, + 4, 6, 6, 4, 6, 4, 6, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 2, 0, 2, 3, - 4, 4, 4, 4, 4, 0, 3, 4, 7, 3, - 1, 1, 1, 0, 5, 5, 2, 3, 1, 2, - 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, - 1, 0, 1, 0, 1, 0, 2, 1, 2, 4, - 0, 2, 1, 1, 3, 5, 1, 1, 1, 2, - 2, 0, 4, 0, 2, 0, 2, 2, 1, 3, - 0, 1, 0, 1, 3, 1, 3, 2, 0, 1, - 1, 0, 1, 2, 4, 4, 0, 2, 2, 1, - 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, - 3, 3, 3, 0, 3, 1, 1, 0, 4, 0, - 1, 1, 0, 3, 1, 3, 2, 1, 1, 0, - 1, 2, 3, 4, 2, 3, 4, 4, 9, 3, - 5, 0, 3, 3, 0, 1, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 1, 2, 3, 3, 0, - 2, 1, 2, 3, 4, 3, 0, 1, 3, 1, - 6, 5, 4, 1, 3, 3, 5, 0, 2, 5, - 0, 5, 1, 3, 1, 2, 3, 4, 1, 1, - 3, 3, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 2, 0, 3, 0, 1, 0, - 1, 1, 5, 0, 1, 0, 1, 2, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 3, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 2, 3, 4, 4, 4, 4, 4, 0, 3, + 4, 7, 3, 1, 1, 1, 0, 5, 5, 2, + 3, 1, 2, 2, 1, 2, 1, 2, 2, 1, + 2, 2, 1, 1, 0, 1, 0, 1, 0, 2, + 1, 2, 4, 0, 2, 1, 1, 3, 5, 1, + 1, 1, 2, 2, 0, 4, 0, 2, 0, 2, + 2, 1, 3, 0, 1, 0, 1, 3, 1, 3, + 2, 0, 1, 1, 0, 1, 2, 4, 4, 0, + 2, 2, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 0, 3, 1, 1, + 0, 4, 0, 1, 1, 0, 3, 1, 3, 2, + 1, 1, 0, 1, 2, 3, 4, 2, 3, 4, + 4, 9, 3, 5, 0, 3, 3, 0, 1, 0, + 2, 2, 0, 2, 2, 2, 0, 2, 1, 2, + 3, 3, 0, 2, 1, 2, 3, 4, 3, 0, + 1, 3, 1, 6, 5, 4, 1, 3, 3, 5, + 0, 2, 5, 0, 5, 1, 3, 1, 3, 1, + 3, 1, 2, 3, 4, 1, 1, 1, 1, 3, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 2, 0, 3, 0, 1, 0, 1, + 1, 5, 0, 1, 0, 1, 2, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -9036,863 +8927,865 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -417, -79, -422, -7, -29, -15, -16, -17, -18, - -19, -20, -21, -22, -23, -24, -25, -26, -64, -67, - -65, -66, -69, -70, -71, -72, -73, -9, -11, -68, - -27, -28, -74, -75, -76, -77, -78, -12, -13, -14, - -8, -32, -31, -30, 13, 14, -109, -35, 35, -40, - -50, 240, -51, -41, 241, -52, 243, 242, 280, 244, - 397, 273, 83, 330, 331, 333, 334, 335, 336, -110, + -1000, -422, -80, -427, -7, -29, -15, -16, -17, -18, + -19, -20, -21, -22, -23, -24, -25, -26, -65, -68, + -66, -67, -70, -71, -72, -73, -74, -9, -11, -69, + -27, -28, -75, -76, -77, -78, -79, -12, -13, -14, + -8, -32, -31, -30, 13, 14, -110, -36, 35, -41, + -51, 240, -52, -42, 241, -53, 243, 242, 280, 244, + 397, 273, 83, 330, 331, 333, 334, 335, 336, -111, 704, 278, 279, 246, 39, 51, 36, 37, 40, 250, - 286, 287, 249, 145, -33, -36, 12, -419, 15, 487, - 275, 274, 31, -34, 597, 95, -80, -418, 752, -253, - -237, 26, 36, 32, -236, -232, -128, -237, 24, 22, - 11, -79, -79, -79, 16, 17, -79, -356, -358, 95, - 173, 95, -79, -57, -56, -54, -53, -55, -58, 34, - -47, -48, -380, -46, -43, 245, 242, 290, 135, 136, - 280, 281, 282, 244, 264, 279, 283, 278, 299, -42, - 90, 36, 597, 600, -363, 241, 247, 248, 243, 488, - 138, 137, 84, -360, 392, 631, 722, -58, 724, 110, - 113, 723, 50, 254, 725, 726, 727, 638, 728, 263, - 729, 730, 731, 732, 738, 679, 739, 740, 741, 139, - 11, -79, -305, -301, 100, -294, 594, 266, 629, 441, - 630, 315, 90, 47, 42, 533, 604, 388, 392, 631, - 518, 722, 398, 330, 348, 342, 523, 524, 525, 371, - 363, 595, 632, 605, 318, 267, 303, 716, 361, 149, - 724, 322, 633, 281, 399, 400, 634, 401, 110, 333, - 438, 737, 321, 635, 735, 113, 723, 338, 88, 517, - 57, 719, 326, 50, 276, 446, 447, 359, 249, 355, - 725, 304, 636, 607, 297, 138, 135, 744, 39, 351, - 56, 33, 734, 137, 55, 726, 164, 637, 727, 638, - 403, 378, 710, 54, 404, 282, 639, 93, 287, 599, - 327, 718, 405, 538, 352, 406, 314, 733, 246, 640, - 325, 699, 691, 692, 407, 408, 711, 383, 379, 384, - 540, 641, 430, 522, 409, 695, 696, 751, 58, 642, - 643, 712, 136, 644, 87, 728, 89, 346, 347, 645, - 312, 265, 543, 544, 432, 375, 500, 127, 507, 508, - 120, 121, 503, 122, 509, 123, 128, 510, 511, 512, - 501, 124, 117, 502, 513, 514, 376, 377, 125, 515, - 119, 118, 504, 506, 126, 516, 263, 38, 410, 596, - 316, 64, 320, 291, 433, 52, 381, 748, 51, 706, - 545, 646, 709, 374, 370, 497, 59, 647, 648, 649, - 650, 519, 729, 373, 345, 369, 743, 4, 309, 492, - 520, 730, 68, 248, 386, 385, 387, 298, 429, 366, - 651, 652, 653, 270, 91, 654, 356, 25, 655, 656, - 411, 305, 657, 62, 658, 659, 436, 279, 660, 60, - 731, 45, 661, 284, 745, 732, 662, 663, 664, 705, - 665, 286, 666, 413, 667, 693, 694, 412, 380, 382, - 546, 293, 414, 397, 251, 598, 668, 328, 350, 283, - 736, 669, 271, 534, 535, 536, 537, 717, 542, 541, - 285, 290, 278, 437, 272, 670, 671, 672, 673, 674, - 319, 690, 675, 676, 334, 602, 738, 498, 49, 677, - 678, 679, 680, 681, 313, 308, 431, 440, 67, 92, - 394, 682, 683, 715, 344, 339, 43, 306, 99, 478, - 480, 481, 482, 483, 484, 479, 486, 684, 331, 61, - 739, 740, 741, 300, 742, 526, 527, 528, 529, 13, - 580, 563, 591, 564, 581, 565, 574, 566, 582, 590, - 592, 547, 555, 548, 556, 586, 569, 583, 575, 568, - 567, 589, 572, 576, 549, 557, 587, 573, 550, 558, - 551, 559, 552, 560, 585, 584, 577, 588, 553, 561, - 579, 554, 562, 578, 570, 571, 449, 749, 750, 521, - 416, 139, 310, 311, 53, 367, 292, 685, 323, 686, - 357, 358, 494, 495, 372, 343, 368, 146, 702, 332, - 341, 700, 294, 417, 499, 280, 687, 439, 307, 389, - 131, 340, 395, 324, 603, 539, 299, 418, 714, 601, - 530, 531, 365, 362, 301, 532, 688, 390, 704, 419, - 255, 295, 296, 689, 701, 420, 421, 317, 422, 423, - 424, 425, 426, 428, 329, 427, 703, 697, 698, 302, - 477, 600, 337, 360, 396, 459, 460, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, - 474, 475, 476, 496, 253, -79, 253, -190, -301, -130, - 706, 708, 192, -272, 400, -290, 402, 415, 410, 420, - 408, -281, 411, 413, 293, -403, 430, 253, 417, 240, - 403, 412, 421, 422, 317, 428, 423, 329, 427, 302, - 424, 425, 426, -387, 192, 727, 742, 332, 340, 149, - 364, 407, 405, 431, 706, 100, -307, 100, 101, 102, - -294, 332, -310, 337, -295, -387, -294, 335, -79, -79, - -312, -312, -130, -210, -145, 157, -159, -261, -162, 101, - -150, -153, -204, -205, -206, -207, -160, -220, -259, 181, - 182, 189, 158, -216, -163, 29, 593, 489, 488, 192, - 34, 235, 77, 78, 491, 492, 160, 63, 15, 454, - 455, -161, 444, 445, 456, 450, 451, 517, 519, 520, - 521, 518, 523, 524, 525, 526, 527, 528, 529, 530, - 531, 532, 522, 533, 494, 495, 129, 496, 117, 119, - 118, 127, 128, 497, 498, 499, 361, 545, 546, 540, - 543, 544, 542, 541, 376, 377, 500, 563, 564, 568, - 567, 565, 566, 569, 572, 573, 574, 575, 576, 577, - 579, 578, 570, 571, 548, 547, 549, 550, 551, 552, - 553, 554, 556, 555, 557, 558, 559, 560, 561, 562, - 580, 581, 582, 583, 584, 586, 585, 590, 589, 587, - 588, 592, 591, 501, 502, 120, 121, 122, 123, 124, - 125, 126, 503, 506, 504, 505, 507, 508, 509, 514, - 515, 510, 511, 512, 513, 516, 387, 385, 386, 382, - 381, 380, -89, -102, 620, 619, -103, 441, 446, 447, - 449, -151, -152, -165, -166, -295, -301, 258, 443, 252, - 187, 487, -154, -148, -218, 116, 102, -31, -214, 442, - 452, 453, 457, 448, 458, 606, 608, 623, 624, 626, - 611, 616, 615, 618, 534, 535, 536, 537, 538, 539, - 691, 692, 693, 694, 695, 696, 697, 698, -387, -294, - 100, -157, -155, -199, 103, 108, 111, 112, 114, -409, - 276, 357, 358, 130, -419, 720, -156, 105, 106, 107, - 132, 133, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 98, 104, 50, 416, 416, -190, - -79, -79, -79, -79, -416, 723, 598, -230, -128, -232, - -33, -31, -419, 12, -79, -31, -32, -30, -36, -38, - 625, -37, -301, 109, -237, -253, 16, 67, 176, 48, - 56, -235, -236, -34, -31, -145, 23, 41, 27, -132, - 183, -145, -301, -132, -279, 257, -79, -79, -268, -315, - 332, -270, 431, 706, 430, -260, -273, 100, -259, -272, - 429, 101, -357, 173, -343, -347, -295, 268, -373, 264, - -190, -366, -365, -295, -419, -129, -289, 254, 262, 261, - 150, -390, 153, 310, 443, 252, -53, -54, -55, -272, - 191, 726, -111, 285, 289, 96, 96, -347, -346, -345, - -391, 289, 268, -372, -364, 260, 269, -353, 261, 262, - -348, 254, 151, -391, -348, 259, 269, 264, 268, 289, - 289, 139, 289, 139, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 284, -354, 165, -354, 601, 601, -360, - -391, 264, 254, -391, -391, 260, -291, -348, 256, 28, - 256, 38, 38, -354, -354, -354, -272, 191, -354, -354, - -354, -354, 297, 297, -354, -354, -354, -354, -354, -354, - -354, -354, -354, -354, -354, -354, -354, -354, -354, -354, - -354, 253, -390, -137, 427, 317, 90, -56, 299, -39, - -190, -289, 254, 255, -390, 286, -190, 236, 253, 709, - -283, 173, 19, -283, -280, 416, 414, 401, 406, -283, - -283, -283, -283, 300, 399, -349, 254, 38, 265, 416, - 300, 399, 300, 301, 300, 301, 409, 419, 300, -306, - 18, 176, 443, 404, 408, 293, 253, 294, 255, 418, - 301, -306, 98, -284, 173, 300, 416, 410, 296, -283, - -283, -313, -419, -297, -295, -293, 245, 41, 156, 28, - 30, 159, 192, 142, 23, 160, 40, 247, 364, 264, - 191, 260, 488, 240, 81, 606, 444, 451, 442, 450, - 454, 490, 491, 443, 402, 34, 17, 608, 31, 274, - 27, 44, 185, 242, 163, 609, 277, 29, 275, 129, - 133, 611, 26, 84, 269, 18, 262, 46, 20, 612, - 613, 21, 74, 258, 257, 176, 254, 79, 15, 235, - 32, 172, 75, 614, 151, 145, 615, 616, 617, 618, - 143, 77, 173, 24, 746, 452, 453, 36, 707, 593, - 288, 187, 82, 65, 708, 157, 448, 619, 620, 130, - 621, 134, 85, 713, 153, 22, 80, 48, 622, 289, - 623, 259, 747, 624, 434, 625, 174, 243, 487, 78, - 175, 720, 626, 721, 252, 415, 12, 493, 35, 273, - 261, 73, 72, 141, 76, 458, 627, 253, 162, 256, - 144, 132, 11, 150, 37, 16, 83, 86, 455, 456, - 457, 63, 140, 597, 161, 19, 628, 435, 155, -387, - 709, -313, -313, 300, 341, 35, 101, -413, -414, -415, - 597, 434, 256, -295, -190, -85, 699, 244, -86, 705, - 41, 251, 146, 38, -135, 416, -123, 192, 727, 710, - 711, 712, 709, 413, 717, 715, 713, 300, 714, 96, - 153, 155, 156, 4, -145, 172, -200, -201, 171, 165, - 166, 167, 168, 169, 170, 177, 176, 157, 159, 173, - -246, 154, 178, 179, 180, 181, 182, 183, 184, 186, - 185, 187, 188, 174, 175, 191, 238, 239, -153, -153, - -153, -153, -216, -222, -221, -419, -218, -387, -294, -301, - -419, -419, -153, -278, -419, -150, -419, -419, -419, -419, - -419, -225, -145, -419, -419, -423, -419, -423, -423, -423, - -332, -419, -332, -332, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, 236, - -419, -419, -419, -419, -419, -332, -332, -332, -332, -332, - -332, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, 98, 112, 108, 111, 103, - 114, 98, 98, 98, 98, -31, -32, -210, -419, -312, - -400, -401, -193, -190, -419, 317, -295, -295, 286, 105, - -235, -34, -31, -230, -236, -232, -31, -79, -121, -134, - 69, 70, -133, -136, 27, 44, 74, 76, 99, 72, - 73, 71, 41, -420, 97, -420, -253, -420, 96, -38, - -256, 95, 653, 683, 653, 683, 67, 49, 98, 98, - 96, 25, -231, -233, -145, 18, -299, 4, -298, 28, - -295, 98, 236, 18, -191, 32, -190, -279, -279, 96, - 100, 332, -269, -271, 432, 434, 165, -300, -295, 98, - 34, 97, 96, -190, -321, -324, -326, -325, -327, -322, - -323, 361, 362, 192, 365, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 378, 390, 35, 276, 357, 358, - 359, 360, 379, 380, 381, 382, 384, 385, 386, 387, - 342, 363, 595, 343, 344, 345, 346, 347, 348, 350, - 351, 354, 352, 353, 355, 356, -296, -295, 95, 97, - 96, -331, 95, -145, -137, 253, -295, 254, 254, 254, - -286, 258, 487, -354, -354, -354, 284, 23, -46, -43, - -380, 22, -42, -43, 245, 135, 136, 242, 95, -343, - 95, -352, -296, -295, 95, 151, 259, 150, -351, -348, - -351, -352, -295, -218, -295, 151, 151, -295, -295, -265, - -295, -265, -265, 41, -265, 41, -265, 41, 105, -295, - -265, 41, -265, 41, -265, 41, -265, 41, -265, 41, - 34, 87, 88, 89, 34, 91, 92, 93, -218, -295, - -295, -218, -343, -218, -190, -295, -272, 105, 105, 105, - -354, -354, 105, 98, 98, 98, -354, -354, 105, 98, - -303, -301, 98, 98, -392, 270, 314, 316, 105, 105, - 105, 105, 34, 98, -393, 34, 734, 733, 735, 736, - 737, 98, 105, 34, 105, 34, 105, -295, 95, -190, - -143, 304, 240, 242, 245, 85, 98, 322, 320, 321, - 318, 323, 324, 325, 165, 50, 96, 256, 253, -295, - -285, 258, -285, -295, -302, -301, -293, -190, 256, 398, - 98, -145, -350, 18, 176, -306, -306, -283, -190, -350, - -306, -283, -190, -283, -283, -283, -283, -306, -306, -306, - -283, -301, -301, -190, -190, -190, -190, -190, -190, -190, - -313, -284, -283, 709, 98, -277, 18, 85, -313, -313, - -292, 26, 26, 96, 338, 435, 436, -311, 335, -81, - -295, 98, -10, -29, -18, -17, -19, 165, -10, 96, - 597, -183, -190, 709, 709, 709, 709, 709, 709, -145, - -145, -145, -145, 621, -208, -411, 157, 132, 133, 130, - 131, -162, 42, 43, 41, -145, -209, -214, -216, 115, - 176, 159, 173, -246, -150, -153, -150, -150, -150, -150, - -150, -150, 235, -150, 235, -150, -150, -150, -150, -150, - -150, -314, -295, 98, 192, -158, -157, 114, -409, -158, - 594, 96, -221, 236, -145, -145, -387, -119, 460, 461, - 462, 463, 465, 466, 467, 470, 471, 475, 476, 459, - 477, 464, 469, 472, 473, 474, 468, 360, -145, -211, - -210, -211, -145, -145, -223, -224, 161, -218, -145, -420, - -420, 105, 183, -127, 27, 44, -127, -127, -127, -127, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -127, -145, -120, 459, 477, 464, 469, 472, 473, 474, - 468, 360, 478, 479, 480, 481, 482, 483, 484, 485, - 486, -120, -119, -145, -145, -145, -145, -145, -145, -145, - -145, -87, -145, 142, 143, 144, -210, -145, -150, -145, - -145, -145, -420, -145, -145, -145, -211, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -386, -385, -384, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -210, - -210, -210, -210, -210, -145, -420, -145, -164, -148, 105, - -261, 114, 101, -145, -145, -145, -145, -145, -145, -211, - -297, -302, -293, -294, -210, -211, -211, -210, -210, -145, - -145, -145, -145, -145, -145, -145, -145, -420, -145, -145, - -145, -145, -145, -253, -420, -210, 96, -402, 434, 435, - 707, -304, 289, -303, 28, -211, 98, 18, -263, 86, - -295, -235, -235, 69, 70, 65, -131, -132, -136, -420, - -37, 28, -255, -295, 646, 646, 68, 98, -333, -272, - 388, 389, 192, -145, -145, 96, -234, 30, 31, -190, - -298, 183, -302, -190, -264, 289, -190, -168, -170, -171, - -172, -193, -217, -419, -173, -31, 617, 614, 18, -183, - -184, -192, -301, -270, -315, -269, 96, 433, 435, 436, - 85, 134, -145, -334, 191, -362, -361, -360, -343, -345, - -346, -347, 97, -334, -339, 395, 394, -331, -331, -331, - -331, -331, -333, -333, -333, -333, 95, -331, 95, -331, - -331, -331, -331, -336, 95, -336, -336, -337, -336, 95, - -337, -338, 95, -338, -373, -145, -370, -369, -367, -368, - 263, 110, 689, 645, 597, 638, 679, 86, -365, -234, - 105, -420, -143, -286, -371, -368, -295, -295, -295, -301, - 157, 100, 98, 100, 98, 100, 98, -112, -60, -1, - 746, 747, 748, 96, 23, -344, -343, -59, 314, -376, - -377, 289, -372, -366, -352, 151, -351, -352, -352, -295, - 96, 32, 139, 139, 139, 139, 597, 242, 35, -287, - 637, 157, 689, 645, -343, -59, 256, 256, -314, -314, - -314, 98, 98, -282, 742, -183, -139, 306, 165, 295, - 295, 253, 308, 253, 308, -190, 319, 322, 320, 321, - 318, 323, 324, 325, 326, 41, 41, 41, 41, 41, - 41, 41, 307, 309, 311, 297, -190, -190, -285, 85, - -185, -190, 29, -301, 98, 98, -190, -283, -283, -190, - -283, -283, -190, 98, -301, -415, 339, -295, 375, 700, - 702, -123, 434, 96, 597, 26, -124, 26, -419, -411, - 132, 133, -216, -216, -216, -209, -150, -153, -150, 156, - 277, -150, -150, -419, -218, -420, -297, 28, 96, 86, - -420, 181, 96, -420, -420, 96, 18, 96, -226, -224, - 163, -145, -420, 96, -420, -420, -210, -145, -145, -145, - -145, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, -210, -420, 96, 96, 18, -318, 28, -420, -420, - -420, -420, 96, -420, -420, -225, -420, 18, -420, 86, - 96, 176, 96, -420, -420, -420, 96, 96, -420, -420, - 96, -420, 96, -420, -420, -420, -420, -420, -420, 96, - -420, 96, -420, -420, -420, 96, -420, 96, -420, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, -420, -420, 96, -420, - 96, -420, 96, -420, -420, 96, -420, 96, -420, 96, - -420, 96, 96, -420, 96, 96, 96, -420, 96, 96, - 96, 96, -420, -420, -420, -420, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, -420, -420, -420, -420, - -420, -420, 96, -94, 622, -420, -420, 96, -420, 96, - 96, 96, 96, 96, -420, -419, 236, -420, -420, -420, - -420, -420, 96, 96, 96, 96, 96, 96, -420, -420, - -420, 96, 96, -420, 96, -420, 96, -420, -401, 706, - 435, -197, -196, -194, 83, 257, 84, -419, -303, -420, - -158, -261, -262, -261, -203, -295, 105, 114, -237, -167, - 96, -169, 18, -216, 97, 96, -333, -241, -247, -280, - -295, 98, 192, -335, 192, -335, 388, 389, -233, 236, - -198, 19, -202, 35, 63, -29, -419, -419, 35, 96, - -186, -188, -187, -189, 75, 79, 81, 76, 77, 78, - 82, -309, 28, -31, -168, -31, -419, -190, -183, -421, - 18, 86, -421, 96, 236, -271, -274, 437, 434, 440, - -387, 98, -111, 96, -360, -347, -238, -140, 46, -340, - 396, -333, 605, -333, -342, 98, -342, 105, 105, 105, - 97, -49, -44, -45, 36, 90, -367, -354, 98, 45, - -354, -354, -295, 97, -234, -139, -190, 85, -371, -371, - -371, 29, -2, 745, 751, 151, 95, 401, 22, -255, - 96, 97, -219, 315, 97, -113, -295, 97, 95, -352, - -352, -295, -419, 253, 34, 34, 689, 645, 637, -59, - -219, -218, -295, -334, 744, 743, 97, 255, 313, -144, - 454, -141, 98, 100, -190, -190, -190, -190, -190, -190, - 245, 242, 424, -410, 327, 98, -410, 298, 256, -183, - -190, 96, -84, 272, 267, -306, -306, 36, -190, 434, - 718, 716, -145, 156, 277, -162, -153, -119, -119, -150, - -316, 192, 361, 276, 359, 355, 375, 366, 394, 357, - 395, 352, 351, 350, -316, -314, -150, -210, -145, -145, - -145, 164, -145, 162, -145, -95, -94, -420, -420, -420, - -420, -420, -95, -95, -95, -95, -95, -95, -95, -95, - -95, -95, -230, -145, -145, -145, -420, 192, 361, -95, - -145, 18, -145, -314, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -384, - -145, -210, -145, -210, -145, -145, -145, -145, -145, -385, - -385, -385, -385, -385, -210, -210, -210, -210, -145, -419, - -295, -98, -97, -96, 672, 257, -94, -164, -98, -164, - 235, -145, 235, 235, 235, -145, -211, -297, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -194, -348, - 295, -348, 295, -348, -265, 96, -276, 26, 18, 63, - 63, -167, -198, -132, -168, -295, -244, 699, -250, 52, - -248, -249, 53, -245, 54, 62, -335, -335, 183, -235, - -145, -266, 85, -267, -275, -218, -213, -215, -214, -419, - -254, -420, -295, -265, -267, -170, -171, -171, -170, -171, - 75, 75, 75, 80, 75, 80, 75, -187, -301, -420, - -145, -304, 86, -168, -168, -192, -301, 183, 434, 438, - 439, -360, -408, 130, 157, 34, 85, 392, 110, -406, - 191, 634, 684, 689, 645, 638, 679, -407, 259, 150, - 151, 271, 28, 47, 97, 96, 97, 96, 97, 97, - 96, -288, -287, -45, -44, -354, -354, 105, -387, 98, - 98, 255, -190, 85, 85, 85, -114, 749, 105, 95, - -3, 90, -145, 95, 23, -343, -218, -378, -328, -379, - -329, -330, -5, -6, -355, -117, 63, 110, -63, 50, - 254, 729, 730, 139, -419, 742, -370, -255, -374, -376, - -190, -149, -419, -161, -147, -146, -148, -154, 181, 182, - 276, 357, 358, -219, -190, -138, 304, 312, 95, -142, - 101, -389, 86, 295, 392, 295, 392, 98, -412, 328, - 98, -412, -190, -84, -49, -190, -283, -283, 36, -387, - -420, -162, -153, -126, 176, 597, -319, 604, -331, -331, - -331, -338, -331, 347, -331, 347, -331, -420, -420, -420, - 96, -420, 26, -420, 96, -145, 96, -95, -95, -95, - -95, -95, -122, 493, 96, 96, -420, 95, 95, -420, - -145, -420, -420, -420, 96, -420, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, - -420, 96, -420, -420, -420, 96, -420, 96, -420, 96, - -420, -420, -420, 96, -317, 690, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -93, -296, -94, - 654, 654, -420, -94, -227, 96, -150, -420, -150, -150, - -150, -420, -420, -420, 96, -420, 96, 96, -420, 96, - -420, 96, -420, -420, -420, -420, 96, -195, 26, -419, - -195, -419, -195, -420, -261, -190, -198, -228, 20, -241, - 57, 367, -252, -251, 61, 53, -249, 23, 55, 23, - 33, -266, 96, 165, -308, 96, 28, -420, -420, 96, - 63, 236, -420, -198, -181, -180, 85, 86, -182, 85, - -180, 75, 75, -256, 96, -264, -168, -198, -198, 236, - 130, -419, -149, 16, 98, 98, -387, -405, 733, 734, - 34, 105, -354, -354, 151, 151, -190, 95, -333, 98, - -333, 105, 105, 34, 91, 92, 93, 34, 87, 88, - 89, -190, -190, -190, -190, -375, 95, 23, -145, 95, - 165, 97, -255, -255, 291, 176, -354, 727, 297, 297, - -354, -354, -354, -116, -115, 749, 97, -420, 96, -341, - 597, 600, -145, -155, -155, -256, 97, -383, 597, -388, - -295, -295, -295, -295, 105, 107, -420, 595, 82, 598, - -420, -333, -145, -145, -145, -145, -235, 98, -145, -145, - 105, 105, -95, -420, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -210, -145, -420, -178, -177, -179, - 710, 130, 34, -316, -420, -212, 289, -101, -100, -99, - 18, -420, -145, -119, -119, -119, -119, -145, -145, -145, - -145, -145, -145, -419, 75, 22, 20, -258, -295, 259, - -419, -258, -419, -304, -228, -229, 21, 23, -242, 59, - -240, 58, -240, -251, 23, 23, 98, 23, 98, 151, - -275, -145, -215, -303, 63, -29, -295, -213, -295, -230, - -145, 95, -145, -158, -198, -198, -145, -205, 517, 519, - 520, 521, 518, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 522, 533, 494, 495, 496, 117, 119, - 118, 127, 128, 497, 498, 499, 361, 545, 546, 540, - 543, 544, 542, 541, 376, 377, 500, 563, 564, 568, - 567, 565, 566, 569, 572, 573, 574, 575, 576, 577, - 579, 578, 570, 571, 548, 547, 549, 550, 551, 552, - 553, 554, 556, 555, 557, 558, 559, 560, 561, 562, - 580, 581, 582, 583, 584, 586, 585, 590, 589, 587, - 588, 592, 591, 501, 502, 120, 121, 122, 123, 124, - 125, 126, 503, 506, 504, 507, 508, 509, 514, 515, - 510, 511, 512, 513, 516, 387, 385, 386, 382, 381, - 380, 441, 446, 447, 449, 534, 535, 536, 537, 538, - 539, 691, 692, 693, 694, 695, 696, 697, 698, 98, - 98, 95, -145, 97, 97, -256, -374, -60, 97, -257, - -255, 105, 97, 292, -214, -419, 98, -354, -354, -354, - 105, 105, -303, -420, 96, -295, -407, -376, 601, 601, - -420, 28, -382, -381, -297, 95, 86, 68, 596, 599, - -420, -420, -420, 96, -420, -420, -420, 97, 97, -420, - -420, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, -420, -420, -420, -420, -420, -420, -420, -420, -420, - -420, 96, -420, -177, -179, -420, 85, -158, -230, 23, - -98, 314, 316, -98, -420, -420, -420, -420, -420, 96, - -420, -420, 96, -420, 96, -420, -420, -258, -420, 23, - 23, 96, -420, -258, -420, -258, -197, -229, -108, -107, - -106, 628, -145, -210, -243, 60, 85, 134, 98, 98, - 98, 16, -419, -213, 236, -308, -235, -255, -175, 401, - -230, -420, -255, 97, 28, 97, 751, 151, 97, -214, - -125, -419, 288, -303, 98, 98, -115, -118, -29, 96, - 165, -255, -190, 68, -145, -210, -420, 85, 609, 710, - -92, -91, -88, 721, 747, -210, -94, -94, -145, -145, - -145, -420, -295, 259, -420, -420, -108, 96, -105, -104, - -295, -320, 597, 85, 134, -267, -255, -308, -295, 97, - -420, -419, -235, 97, -239, -29, 95, -3, 288, -328, - -379, -329, -330, -5, -6, -355, -82, 597, -381, -359, - -301, -297, 98, 105, 97, 597, -420, -420, -90, 159, - 719, 687, -155, 235, -420, 96, -420, 96, -420, 96, - -106, 96, 28, 602, -420, -304, -176, -174, -295, 651, - -398, -397, 593, -408, -404, 130, 157, 110, -406, 689, - 645, 140, 141, -82, -145, 95, -420, -83, 303, 706, - 236, -389, 598, -90, 720, 665, 640, 665, 640, -150, - -145, -145, -145, -104, -419, -420, 96, 26, -321, -62, - 662, -395, -396, 85, -399, 407, 661, 682, 130, 98, - 97, -255, 264, -302, -383, 599, 156, -119, -420, 96, - -420, 96, -420, -93, -174, 658, -334, -158, -396, 85, - -395, 85, 17, 16, -4, 750, 97, 305, -90, 665, - 640, -145, -145, -420, -61, 29, -175, -394, 272, 267, - 270, 35, -394, 105, -4, -420, -420, 662, 266, 34, - 130, -158, -178, -177, -177, + 286, 287, 249, 145, -33, -37, 12, -424, 15, 487, + 275, 274, 31, -34, 597, 95, -35, 63, -81, -423, + 752, -258, -242, 26, 36, 32, -241, -237, -129, -242, + 24, 22, 11, -80, -80, -80, 16, 17, -80, -361, + -363, 95, 173, 95, -80, -58, -57, -55, -54, -56, + -59, 34, -48, -49, -385, -47, -44, 245, 242, 290, + 135, 136, 280, 281, 282, 244, 264, 279, 283, 278, + 299, -43, 90, 36, 597, 600, -368, 241, 247, 248, + 243, 488, 138, 137, 84, -365, 392, 631, 722, -59, + 724, 110, 113, 723, 50, 254, 725, 726, 727, 638, + 728, 263, 729, 730, 731, 732, 738, 679, 739, 740, + 741, 139, 11, -80, -310, -306, 100, -299, 594, 266, + 629, 441, 630, 315, 90, 47, 42, 533, 604, 388, + 392, 631, 518, 722, 398, 330, 348, 342, 523, 524, + 525, 371, 363, 595, 632, 605, 318, 267, 303, 716, + 361, 149, 724, 322, 633, 281, 399, 400, 634, 401, + 110, 333, 438, 737, 321, 635, 735, 113, 723, 338, + 88, 517, 57, 719, 326, 50, 276, 446, 447, 359, + 249, 355, 725, 304, 636, 607, 297, 138, 135, 744, + 39, 351, 56, 33, 734, 137, 55, 726, 164, 637, + 727, 638, 403, 378, 710, 54, 404, 282, 639, 93, + 287, 599, 327, 718, 405, 538, 352, 406, 314, 733, + 246, 640, 325, 699, 691, 692, 407, 408, 711, 383, + 379, 384, 540, 641, 430, 522, 409, 695, 696, 751, + 58, 642, 643, 712, 136, 644, 87, 728, 89, 346, + 347, 645, 312, 265, 543, 544, 432, 375, 500, 127, + 507, 508, 120, 121, 503, 122, 509, 123, 128, 510, + 511, 512, 501, 124, 117, 502, 513, 514, 376, 377, + 125, 515, 119, 118, 504, 506, 126, 516, 263, 38, + 410, 596, 316, 64, 320, 291, 433, 52, 381, 748, + 51, 706, 545, 646, 709, 374, 370, 497, 59, 647, + 648, 649, 650, 519, 729, 373, 345, 369, 743, 4, + 309, 492, 520, 730, 68, 248, 386, 385, 387, 298, + 429, 366, 651, 652, 653, 270, 91, 654, 356, 25, + 655, 656, 411, 305, 657, 62, 658, 659, 436, 279, + 660, 60, 731, 45, 661, 284, 745, 732, 662, 663, + 664, 705, 665, 286, 666, 413, 667, 693, 694, 412, + 380, 382, 546, 293, 414, 397, 251, 598, 668, 328, + 350, 283, 736, 669, 271, 534, 535, 536, 537, 717, + 542, 541, 285, 290, 278, 437, 272, 670, 671, 672, + 673, 674, 319, 690, 675, 676, 334, 602, 738, 498, + 49, 677, 678, 679, 680, 681, 313, 308, 431, 440, + 67, 92, 394, 682, 683, 715, 344, 339, 43, 306, + 99, 478, 480, 481, 482, 483, 484, 479, 486, 684, + 331, 61, 739, 740, 741, 300, 742, 526, 527, 528, + 529, 13, 580, 563, 591, 564, 581, 565, 574, 566, + 582, 590, 592, 547, 555, 548, 556, 586, 569, 583, + 575, 568, 567, 589, 572, 576, 549, 557, 587, 573, + 550, 558, 551, 559, 552, 560, 585, 584, 577, 588, + 553, 561, 579, 554, 562, 578, 570, 571, 449, 749, + 750, 521, 416, 139, 310, 311, 53, 367, 292, 685, + 323, 686, 357, 358, 494, 495, 372, 343, 368, 146, + 702, 332, 341, 700, 294, 417, 499, 280, 687, 439, + 307, 389, 131, 340, 395, 324, 603, 539, 299, 418, + 714, 601, 530, 531, 365, 362, 301, 532, 688, 390, + 704, 419, 255, 295, 296, 689, 701, 420, 421, 317, + 422, 423, 424, 425, 426, 428, 329, 427, 703, 697, + 698, 302, 477, 600, 337, 360, 396, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 496, 253, -80, 253, -191, + -306, -131, 706, 708, 192, -277, 400, -295, 402, 415, + 410, 420, 408, -286, 411, 413, 293, -408, 430, 253, + 417, 240, 403, 412, 421, 422, 317, 428, 423, 329, + 427, 302, 424, 425, 426, -392, 192, 727, 742, 332, + 340, 149, 364, 407, 405, 431, 706, 100, -312, 100, + 101, 102, -299, 332, -315, 337, -300, -392, -299, 335, + -80, -80, -317, -317, -131, -211, -146, 157, -160, -266, + -163, 101, -151, -154, -205, -206, -207, -208, -161, -225, + -264, 181, 182, 189, 158, -221, -164, 29, 593, 489, + 488, 192, 34, 235, 77, 78, 491, 492, 160, 63, + 15, 454, 455, -162, 444, 445, 456, 450, 451, 517, + 519, 520, 521, 518, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 522, 533, 494, 495, 129, 496, + 117, 119, 118, 127, 128, 497, 498, 499, 361, 545, + 546, 540, 543, 544, 542, 541, 376, 377, 500, 563, + 564, 568, 567, 565, 566, 569, 572, 573, 574, 575, + 576, 577, 579, 578, 570, 571, 548, 547, 549, 550, + 551, 552, 553, 554, 556, 555, 557, 558, 559, 560, + 561, 562, 580, 581, 582, 583, 584, 586, 585, 590, + 589, 587, 588, 592, 591, 501, 502, 120, 121, 122, + 123, 124, 125, 126, 503, 506, 504, 505, 507, 508, + 509, 514, 515, 510, 511, 512, 513, 516, 387, 385, + 386, 382, 381, 380, -90, -103, 620, 619, -104, 441, + 446, 447, 449, -152, -153, -166, -167, -300, -306, 258, + 443, 252, 187, 487, -155, -149, -223, 116, 102, -31, + -220, 442, 452, 453, 457, 448, 458, 606, 608, 623, + 624, 626, 611, 616, 615, 618, 534, 535, 536, 537, + 538, 539, 691, 692, 693, 694, 695, 696, 697, 698, + -392, -299, 100, -158, -156, -200, 103, 108, 111, 112, + 114, -414, 276, 357, 358, 130, -424, -216, -217, -157, + 105, 106, 107, 132, 133, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 720, 98, 104, + 50, 416, 416, -191, -80, -80, -80, -80, -421, 723, + 598, -235, -129, -237, -33, -31, -424, 12, -80, -31, + -32, -30, -37, -39, 625, -38, -306, -80, 109, -242, + -258, 16, 67, 176, 48, 56, -240, -241, -34, -31, + -146, 23, 41, 27, -133, 183, -146, -306, -133, -284, + 257, -80, -80, -273, -320, 332, -275, 431, 706, 430, + -265, -278, 100, -264, -277, 429, 101, -362, 173, -348, + -352, -300, 268, -378, 264, -191, -371, -370, -300, -424, + -130, -294, 254, 262, 261, 150, -395, 153, 310, 443, + 252, -54, -55, -56, -277, 191, 726, -112, 285, 289, + 96, 96, -352, -351, -350, -396, 289, 268, -377, -369, + 260, 269, -358, 261, 262, -353, 254, 151, -396, -353, + 259, 269, 264, 268, 289, 289, 139, 289, 139, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 284, -359, + 165, -359, 601, 601, -365, -396, 264, 254, -396, -396, + 260, -296, -353, 256, 28, 256, 38, 38, -359, -359, + -359, -277, 191, -359, -359, -359, -359, 297, 297, -359, + -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, + -359, -359, -359, -359, -359, -359, 253, -395, -138, 427, + 317, 90, -57, 299, -40, -191, -294, 254, 255, -395, + 286, -191, 236, 253, 709, -288, 173, 19, -288, -285, + 416, 414, 401, 406, -288, -288, -288, -288, 300, 399, + -354, 254, 38, 265, 416, 300, 399, 300, 301, 300, + 301, 409, 419, 300, -311, 18, 176, 443, 404, 408, + 293, 253, 294, 255, 418, 301, -311, 98, -289, 173, + 300, 416, 410, 296, -288, -288, -318, -424, -302, -300, + -298, 245, 41, 156, 28, 30, 159, 192, 142, 23, + 160, 40, 247, 364, 264, 191, 260, 488, 240, 81, + 606, 444, 451, 442, 450, 454, 490, 491, 443, 402, + 34, 17, 608, 31, 274, 27, 44, 185, 242, 163, + 609, 277, 29, 275, 129, 133, 611, 26, 84, 269, + 18, 262, 46, 20, 612, 613, 21, 74, 258, 257, + 176, 254, 79, 15, 235, 32, 172, 75, 614, 151, + 145, 615, 616, 617, 618, 143, 77, 173, 24, 746, + 452, 453, 36, 707, 593, 288, 187, 82, 65, 708, + 157, 448, 619, 620, 130, 621, 134, 85, 713, 153, + 22, 80, 48, 622, 289, 623, 259, 747, 624, 434, + 625, 174, 243, 487, 78, 175, 720, 626, 721, 252, + 415, 12, 493, 35, 273, 261, 73, 72, 141, 76, + 458, 627, 253, 162, 256, 144, 132, 11, 150, 37, + 16, 83, 86, 455, 456, 457, 63, 140, 597, 161, + 19, 628, 435, 155, -392, 709, -318, -318, 300, 341, + 35, 101, -418, -419, -420, 597, 434, 256, -300, -191, + -86, 699, 244, -87, 705, 41, 251, 146, 38, -136, + 416, -124, 192, 727, 710, 711, 712, 709, 413, 717, + 715, 713, 300, 714, 96, 153, 155, 156, 4, -146, + 172, -201, -202, 171, 165, 166, 167, 168, 169, 170, + 177, 176, 157, 159, 173, -251, 154, 178, 179, 180, + 181, 182, 183, 184, 186, 185, 187, 188, 174, 175, + 191, 238, 239, -154, -154, -154, -154, -221, -227, -226, + -424, -223, -392, -299, -306, -424, -424, -154, -283, -424, + -151, -424, -424, -424, -424, -424, -230, -146, -424, -424, + -428, -424, -428, -428, -428, -337, -424, -337, -337, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, 236, -424, -424, -424, -424, -424, + -337, -337, -337, -337, -337, -337, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + 98, 112, 108, 111, 103, 114, 98, 98, 98, 98, + -31, -32, -211, 63, -424, -317, -405, -406, -194, -191, + -424, 317, -300, -300, 286, 105, -240, -34, -31, -235, + -241, -237, -31, -80, -122, -135, 69, 70, -134, -137, + 27, 44, 74, 76, 99, 72, 73, 71, 41, -425, + 97, -425, -258, -425, 96, -39, -261, 95, 115, -214, + -219, -217, 720, 653, 683, 653, 683, 67, 49, 98, + 98, 96, 25, -236, -238, -146, 18, -304, 4, -303, + 28, -300, 98, 236, 18, -192, 32, -191, -284, -284, + 96, 100, 332, -274, -276, 432, 434, 165, -305, -300, + 98, 34, 97, 96, -191, -326, -329, -331, -330, -332, + -327, -328, 361, 362, 192, 365, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 378, 390, 35, 276, 357, + 358, 359, 360, 379, 380, 381, 382, 384, 385, 386, + 387, 342, 363, 595, 343, 344, 345, 346, 347, 348, + 350, 351, 354, 352, 353, 355, 356, -301, -300, 95, + 97, 96, -336, 95, -146, -138, 253, -300, 254, 254, + 254, -291, 258, 487, -359, -359, -359, 284, 23, -47, + -44, -385, 22, -43, -44, 245, 135, 136, 242, 95, + -348, 95, -357, -301, -300, 95, 151, 259, 150, -356, + -353, -356, -357, -300, -223, -300, 151, 151, -300, -300, + -270, -300, -270, -270, 41, -270, 41, -270, 41, 105, + -300, -270, 41, -270, 41, -270, 41, -270, 41, -270, + 41, 34, 87, 88, 89, 34, 91, 92, 93, -223, + -300, -300, -223, -348, -223, -191, -300, -277, 105, 105, + 105, -359, -359, 105, 98, 98, 98, -359, -359, 105, + 98, -308, -306, 98, 98, -397, 270, 314, 316, 105, + 105, 105, 105, 34, 98, -398, 34, 734, 733, 735, + 736, 737, 98, 105, 34, 105, 34, 105, -300, 95, + -191, -144, 304, 240, 242, 245, 85, 98, 322, 320, + 321, 318, 323, 324, 325, 165, 50, 96, 256, 253, + -300, -290, 258, -290, -300, -307, -306, -298, -191, 256, + 398, 98, -146, -355, 18, 176, -311, -311, -288, -191, + -355, -311, -288, -191, -288, -288, -288, -288, -311, -311, + -311, -288, -306, -306, -191, -191, -191, -191, -191, -191, + -191, -318, -289, -288, 709, 98, -282, 18, 85, -318, + -318, -297, 26, 26, 96, 338, 435, 436, -316, 335, + -82, -300, 98, -10, -29, -18, -17, -19, 165, -10, + 96, 597, -184, -191, 709, 709, 709, 709, 709, 709, + -146, -146, -146, -146, 621, -209, -416, 157, 132, 133, + 130, 131, -163, 42, 43, 41, -146, -210, -216, -221, + 115, 176, 159, 173, -251, -151, -154, -151, -151, -151, + -151, -151, -151, 235, -151, 235, -151, -151, -151, -151, + -151, -151, -319, -300, 98, 192, -159, -158, 114, -414, + -159, 594, 96, -226, 236, -146, -146, -392, -120, 460, + 461, 462, 463, 465, 466, 467, 470, 471, 475, 476, + 459, 477, 464, 469, 472, 473, 474, 468, 360, -146, + -212, -211, -212, -146, -146, -228, -229, 161, -223, -146, + -425, -425, 105, 183, -128, 27, 44, -128, -128, -128, + -128, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -128, -146, -121, 459, 477, 464, 469, 472, 473, + 474, 468, 360, 478, 479, 480, 481, 482, 483, 484, + 485, 486, -121, -120, -146, -146, -146, -146, -146, -146, + -146, -146, -88, -146, 142, 143, 144, -211, -146, -151, + -146, -146, -146, -425, -146, -146, -146, -212, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -391, -390, -389, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -211, -211, -211, -211, -211, -146, -425, -146, -165, -149, + 105, -266, 114, 101, -146, -146, -146, -146, -146, -146, + -212, -302, -307, -298, -299, -211, -212, -212, -211, -211, + -146, -146, -146, -146, -146, -146, -146, -146, -425, -146, + -146, -146, -146, -146, -258, -425, -211, 96, -407, 434, + 435, 707, -309, 289, -308, 28, -212, 98, 18, -268, + 86, -300, -240, -240, 69, 70, 65, -132, -133, -137, + -425, -38, 28, -260, -300, 96, -424, 646, 646, 68, + 98, -338, -277, 388, 389, 192, -146, -146, 96, -239, + 30, 31, -191, -303, 183, -307, -191, -269, 289, -191, + -169, -171, -172, -173, -194, -222, -424, -174, -31, 617, + 614, 18, -184, -185, -193, -306, -275, -320, -274, 96, + 433, 435, 436, 85, 134, -146, -339, 191, -367, -366, + -365, -348, -350, -351, -352, 97, -339, -344, 395, 394, + -336, -336, -336, -336, -336, -338, -338, -338, -338, 95, + -336, 95, -336, -336, -336, -336, -341, 95, -341, -341, + -342, -341, 95, -342, -343, 95, -343, -378, -146, -375, + -374, -372, -373, 263, 110, 689, 645, 597, 638, 679, + 86, -370, -239, 105, -425, -144, -291, -376, -373, -300, + -300, -300, -306, 157, 100, 98, 100, 98, 100, 98, + -113, -61, -1, 746, 747, 748, 96, 23, -349, -348, + -60, 314, -381, -382, 289, -377, -371, -357, 151, -356, + -357, -357, -300, 96, 32, 139, 139, 139, 139, 597, + 242, 35, -292, 637, 157, 689, 645, -348, -60, 256, + 256, -319, -319, -319, 98, 98, -287, 742, -184, -140, + 306, 165, 295, 295, 253, 308, 253, 308, -191, 319, + 322, 320, 321, 318, 323, 324, 325, 326, 41, 41, + 41, 41, 41, 41, 41, 307, 309, 311, 297, -191, + -191, -290, 85, -186, -191, 29, -306, 98, 98, -191, + -288, -288, -191, -288, -288, -191, 98, -306, -420, 339, + -300, 375, 700, 702, -124, 434, 96, 597, 26, -125, + 26, -424, -416, 132, 133, -221, -221, -221, -210, -151, + -154, -151, 156, 277, -151, -151, -424, -223, -425, -302, + 28, 96, 86, -425, 181, 96, -425, -425, 96, 18, + 96, -231, -229, 163, -146, -425, 96, -425, -425, -211, + -146, -146, -146, -146, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -211, -425, 96, 96, 18, -323, + 28, -425, -425, -425, -425, 96, -425, -425, -230, -425, + 18, -425, 86, 96, 176, 96, -425, -425, -425, 96, + 96, -425, -425, 96, -425, 96, -425, -425, -425, -425, + -425, -425, 96, -425, 96, -425, -425, -425, 96, -425, + 96, -425, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, -425, + -425, 96, -425, 96, -425, 96, -425, -425, 96, -425, + 96, -425, 96, -425, 96, 96, -425, 96, 96, 96, + -425, 96, 96, 96, 96, -425, -425, -425, -425, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, -425, + -425, -425, -425, -425, -425, 96, -95, 622, -425, -425, + 96, -425, 96, 96, 96, 96, 96, -425, -424, 236, + -425, -425, -425, -425, -425, 96, 96, 96, 96, 96, + 96, -425, -425, -425, 96, 96, -425, 96, -425, 96, + -425, -406, 706, 435, -198, -197, -195, 83, 257, 84, + -424, -308, -425, -159, -266, -267, -266, -204, -300, 105, + 114, -242, -168, 96, -170, 18, -221, 97, 96, -219, + -425, -338, -246, -252, -285, -300, 98, 192, -340, 192, + -340, 388, 389, -238, 236, -199, 19, -203, 35, 63, + -29, -424, -424, 35, 96, -187, -189, -188, -190, 75, + 79, 81, 76, 77, 78, 82, -314, 28, -31, -169, + -31, -424, -191, -184, -426, 18, 86, -426, 96, 236, + -276, -279, 437, 434, 440, -392, 98, -112, 96, -365, + -352, -243, -141, 46, -345, 396, -338, 605, -338, -347, + 98, -347, 105, 105, 105, 97, -50, -45, -46, 36, + 90, -372, -359, 98, 45, -359, -359, -300, 97, -239, + -140, -191, 85, -376, -376, -376, 29, -2, 745, 751, + 151, 95, 401, 22, -260, 96, 97, -224, 315, 97, + -114, -300, 97, 95, -357, -357, -300, -424, 253, 34, + 34, 689, 645, 637, -60, -224, -223, -300, -339, 744, + 743, 97, 255, 313, -145, 454, -142, 98, 100, -191, + -191, -191, -191, -191, -191, 245, 242, 424, -415, 327, + 98, -415, 298, 256, -184, -191, 96, -85, 272, 267, + -311, -311, 36, -191, 434, 718, 716, -146, 156, 277, + -163, -154, -120, -120, -151, -321, 192, 361, 276, 359, + 355, 375, 366, 394, 357, 395, 352, 351, 350, -321, + -319, -151, -211, -146, -146, -146, 164, -146, 162, -146, + -96, -95, -425, -425, -425, -425, -425, -96, -96, -96, + -96, -96, -96, -96, -96, -96, -96, -235, -146, -146, + -146, -425, 192, 361, -96, -146, 18, -146, -319, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -389, -146, -211, -146, -211, -146, + -146, -146, -146, -146, -390, -390, -390, -390, -390, -211, + -211, -211, -211, -146, -424, -300, -99, -98, -97, 672, + 257, -95, -165, -99, -165, 235, -146, 235, 235, 235, + -146, -212, -302, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -195, -353, 295, -353, 295, -353, -270, + 96, -281, 26, 18, 63, 63, -168, -199, -133, -169, + -300, -249, 699, -255, 52, -253, -254, 53, -250, 54, + 62, -340, -340, 183, -240, -146, -271, 85, -272, -280, + -223, -215, -218, -216, -424, -259, -425, -300, -270, -272, + -171, -172, -172, -171, -172, 75, 75, 75, 80, 75, + 80, 75, -188, -306, -425, -146, -309, 86, -169, -169, + -193, -306, 183, 434, 438, 439, -365, -413, 130, 157, + 34, 85, 392, 110, -411, 191, 634, 684, 689, 645, + 638, 679, -412, 259, 150, 151, 271, 28, 47, 97, + 96, 97, 96, 97, 97, 96, -293, -292, -46, -45, + -359, -359, 105, -392, 98, 98, 255, -191, 85, 85, + 85, -115, 749, 105, 95, -3, 90, -146, 95, 23, + -348, -223, -383, -333, -384, -334, -335, -5, -6, -360, + -118, 63, 110, -64, 50, 254, 729, 730, 139, -424, + 742, -375, -260, -379, -381, -191, -150, -424, -162, -148, + -147, -149, -155, 181, 182, 276, 357, 358, -224, -191, + -139, 304, 312, 95, -143, 101, -394, 86, 295, 392, + 295, 392, 98, -417, 328, 98, -417, -191, -85, -50, + -191, -288, -288, 36, -392, -425, -163, -154, -127, 176, + 597, -324, 604, -336, -336, -336, -343, -336, 347, -336, + 347, -336, -425, -425, -425, 96, -425, 26, -425, 96, + -146, 96, -96, -96, -96, -96, -96, -123, 493, 96, + 96, -425, 95, 95, -425, -146, -425, -425, -425, 96, + -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, + -425, -425, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, 96, -425, -425, 96, -425, -425, -425, + 96, -425, 96, -425, 96, -425, -425, -425, 96, -322, + 690, -425, -425, -425, -425, -425, -425, -425, -425, -425, + -425, -425, -94, -301, -95, 654, 654, -425, -95, -232, + 96, -151, -425, -151, -151, -151, -425, -425, -425, 96, + -425, 96, 96, -425, 96, -425, 96, -425, -425, -425, + -425, 96, -196, 26, -424, -196, -424, -196, -425, -266, + -191, -199, -233, 20, -246, 57, 367, -257, -256, 61, + 53, -254, 23, 55, 23, 33, -271, 96, 165, -313, + 96, 28, -425, -425, 96, 63, 236, -425, -199, -182, + -181, 85, 86, -183, 85, -181, 75, 75, -261, 96, + -269, -169, -199, -199, 236, 130, -424, -150, 16, 98, + 98, -392, -410, 733, 734, 34, 105, -359, -359, 151, + 151, -191, 95, -338, 98, -338, 105, 105, 34, 91, + 92, 93, 34, 87, 88, 89, -191, -191, -191, -191, + -380, 95, 23, -146, 95, 165, 97, -260, -260, 291, + 176, -359, 727, 297, 297, -359, -359, -359, -117, -116, + 749, 97, -425, 96, -346, 597, 600, -146, -156, -156, + -261, 97, -388, 597, -393, -300, -300, -300, -300, 105, + 107, -425, 595, 82, 598, -425, -338, -146, -146, -146, + -146, -240, 98, -146, -146, 105, 105, -96, -425, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -146, -211, + -146, -425, -179, -178, -180, 710, 130, 34, -321, -425, + -213, 289, -102, -101, -100, 18, -425, -146, -120, -120, + -120, -120, -146, -146, -146, -146, -146, -146, -424, 75, + 22, 20, -263, -300, 259, -424, -263, -424, -309, -233, + -234, 21, 23, -247, 59, -245, 58, -245, -256, 23, + 23, 98, 23, 98, 151, -280, -146, -218, -308, 63, + -29, -300, -215, -300, -235, -146, 95, -146, -159, -199, + -199, -146, -206, 517, 519, 520, 521, 518, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 522, 533, + 494, 495, 496, 117, 119, 118, 127, 128, 497, 498, + 499, 361, 545, 546, 540, 543, 544, 542, 541, 376, + 377, 500, 563, 564, 568, 567, 565, 566, 569, 572, + 573, 574, 575, 576, 577, 579, 578, 570, 571, 548, + 547, 549, 550, 551, 552, 553, 554, 556, 555, 557, + 558, 559, 560, 561, 562, 580, 581, 582, 583, 584, + 586, 585, 590, 589, 587, 588, 592, 591, 501, 502, + 120, 121, 122, 123, 124, 125, 126, 503, 506, 504, + 507, 508, 509, 514, 515, 510, 511, 512, 513, 516, + 387, 385, 386, 382, 381, 380, 441, 446, 447, 449, + 534, 535, 536, 537, 538, 539, 691, 692, 693, 694, + 695, 696, 697, 698, 98, 98, 95, -146, 97, 97, + -261, -379, -61, 97, -262, -260, 105, 97, 292, -216, + -424, 98, -359, -359, -359, 105, 105, -308, -425, 96, + -300, -412, -381, 601, 601, -425, 28, -387, -386, -302, + 95, 86, 68, 596, 599, -425, -425, -425, 96, -425, + -425, -425, 97, 97, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, 96, -425, -178, -180, + -425, 85, -159, -235, 23, -99, 314, 316, -99, -425, + -425, -425, -425, -425, 96, -425, -425, 96, -425, 96, + -425, -425, -263, -425, 23, 23, 96, -425, -263, -425, + -263, -198, -234, -109, -108, -107, 628, -146, -211, -248, + 60, 85, 134, 98, 98, 98, 16, -424, -215, 236, + -313, -240, -260, -176, 401, -235, -425, -260, 97, 28, + 97, 751, 151, 97, -216, -126, -424, 288, -308, 98, + 98, -116, -119, -29, 96, 165, -260, -191, 68, -146, + -211, -425, 85, 609, 710, -93, -92, -89, 721, 747, + -211, -95, -95, -146, -146, -146, -425, -300, 259, -425, + -425, -109, 96, -106, -105, -300, -325, 597, 85, 134, + -272, -260, -313, -300, 97, -425, -424, -240, 97, -244, + -29, 95, -3, 288, -333, -384, -334, -335, -5, -6, + -360, -83, 597, -386, -364, -306, -302, 98, 105, 97, + 597, -425, -425, -91, 159, 719, 687, -156, 235, -425, + 96, -425, 96, -425, 96, -107, 96, 28, 602, -425, + -309, -177, -175, -300, 651, -403, -402, 593, -413, -409, + 130, 157, 110, -411, 689, 645, 140, 141, -83, -146, + 95, -425, -84, 303, 706, 236, -394, 598, -91, 720, + 665, 640, 665, 640, -151, -146, -146, -146, -105, -424, + -425, 96, 26, -326, -63, 662, -400, -401, 85, -404, + 407, 661, 682, 130, 98, 97, -260, 264, -307, -388, + 599, 156, -120, -425, 96, -425, 96, -425, -94, -175, + 658, -339, -159, -401, 85, -400, 85, 17, 16, -4, + 750, 97, 305, -91, 665, 640, -146, -146, -425, -62, + 29, -176, -399, 272, 267, 270, 35, -399, 105, -4, + -425, -425, 662, 266, 34, 130, -159, -179, -178, -178, } var yyDef = [...]int{ - 889, -2, -2, 891, 2, 4, 5, 6, 7, 8, + 892, -2, -2, 894, 2, 4, 5, 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, 37, 38, - 39, 70, 72, 73, 889, 889, 889, 0, 889, 0, - 0, 889, -2, -2, 889, 1644, 0, 889, 0, 884, - 0, -2, 804, 810, 0, 819, -2, 0, 0, 889, - 889, 2285, 2285, 884, 0, 0, 0, 0, 0, 889, - 889, 889, 889, 1649, 1502, 50, 889, 0, 85, 86, - 839, 840, 841, 65, 0, 2283, 890, 1, 3, 71, - 75, 0, 0, 0, 58, 1511, 0, 78, 0, 0, - 893, 0, 0, 1627, 889, 889, 0, 126, 127, 0, - 0, 0, -2, 130, -2, 159, 160, 161, 0, 166, - 609, 526, 578, 524, 563, -2, 512, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, - 401, 401, 0, 0, -2, 512, 512, 512, 1629, 0, - 0, 0, 560, 463, 401, 401, 401, 0, 401, 401, - 401, 401, 0, 0, 401, 401, 401, 401, 401, 401, - 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, - 401, 1529, 165, 1645, 1642, 1643, 1805, 1806, 1807, 1808, - 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, - 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, - 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, - 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, - 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, - 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, - 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, - 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, - 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, - 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, - 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, - 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, - 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, - 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, - 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, - 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, - 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, - 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, - 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, - 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, - 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, - 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, - 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, - 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, - 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, - 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, - 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, - 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, - 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, - 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, - 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, - 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, - 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, - 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, - 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, - 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, - 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, - 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, - 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, - 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, - 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, - 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, - 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, - 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, - 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, - 2279, 2280, 2281, 2282, 0, 1621, 0, 722, 993, 0, - 885, 886, 0, 793, 793, 0, 793, 793, 793, 793, - 0, 0, 0, 736, 0, 0, 0, 0, 790, 0, - 752, 753, 0, 790, 0, 759, 796, 0, 0, 766, - 793, 793, 769, 2286, 0, 2286, 2286, 0, 0, 1612, - 0, 787, 785, 799, 800, 42, 803, 806, 807, 808, - 809, 812, 0, 823, 826, 1638, 1639, 0, 828, 833, - 852, 853, 0, 45, 1153, 0, 1017, 0, 1028, -2, - 1039, 1056, 1057, 1058, 1059, 1060, 1062, 1063, 1064, 0, - 0, 0, 0, 1069, 1070, 0, 0, 0, 0, 0, - 1133, 0, 0, 0, 0, 2008, 1473, 0, 0, 1435, - 1435, 1169, 1435, 1435, 1437, 1437, 1437, 1858, 2000, 2009, - 2188, 1819, 1825, 1826, 1827, 2134, 2135, 2136, 2137, 2229, - 2230, 2234, 1922, 1814, 2201, 2202, 0, 2282, 1961, 1969, - 1970, 1946, 1955, 1994, 2096, 2213, 1837, 1989, 2059, 1919, - 1941, 1942, 2077, 2078, 1965, 1966, 1945, 2140, 2142, 2158, - 2159, 2144, 2146, 2155, 2161, 2166, 2145, 2157, 2162, 2175, - 2179, 2182, 2183, 2184, 2152, 2150, 2163, 2167, 2169, 2171, - 2177, 2180, 2153, 2151, 2164, 2168, 2170, 2172, 2178, 2181, - 2139, 2143, 2147, 2156, 2174, 2154, 2173, 2148, 2160, 2165, - 2176, 2149, 2141, 1959, 1962, 1949, 1950, 1952, 1954, 1960, - 1967, 1973, 1951, 1972, 1971, 0, 1947, 1948, 1953, 1964, - 1968, 1956, 1957, 1958, 1963, 1974, 2015, 2014, 2013, 2058, - 1985, 2057, 0, 0, 0, 0, 0, 1808, 1864, 1865, - 2185, 1357, 1358, 1359, 1360, 0, 0, 0, 0, 0, - 0, 0, 290, 291, 1486, 1487, 44, 1152, 1608, 1437, - 1437, 1437, 1437, 1437, 1437, 1091, 1092, 1093, 1094, 1095, - 1121, 1122, 1128, 1129, 2072, 2073, 2074, 2075, 1902, 2224, - 1911, 1912, 2054, 2055, 1924, 1925, 2256, 2257, -2, -2, - -2, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 1863, 2199, 2200, 228, 0, 0, 295, 292, 293, 294, - 1135, 1136, 248, 249, 250, 251, 252, 253, 254, 255, + 39, 70, 72, 73, 892, 892, 892, 0, 892, 0, + 0, 892, -2, -2, 892, 1653, 0, 892, 0, 887, + 0, -2, 807, 813, 0, 822, -2, 0, 0, 892, + 892, 2294, 2294, 887, 0, 0, 0, 0, 0, 892, + 892, 892, 892, 1658, 1505, 50, 892, 0, 88, 89, + 842, 843, 844, 65, 0, 2292, 85, 892, 893, 1, + 3, 71, 75, 0, 0, 0, 58, 1514, 0, 78, + 0, 0, 896, 0, 0, 1636, 892, 892, 0, 129, + 130, 0, 0, 0, -2, 133, -2, 162, 163, 164, + 0, 169, 612, 529, 581, 527, 566, -2, 515, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 532, 404, 404, 0, 0, -2, 515, 515, 515, + 1638, 0, 0, 0, 563, 466, 404, 404, 404, 0, + 404, 404, 404, 404, 0, 0, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 1532, 168, 1654, 1651, 1652, 1814, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, + 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, + 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, + 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, + 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, + 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, + 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, + 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, + 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, + 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, + 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, + 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, + 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, + 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, + 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, + 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, + 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, + 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, + 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, + 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, + 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, + 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, + 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, + 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, + 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, + 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, + 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, + 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, + 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, + 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, + 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, + 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, + 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, + 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, + 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, + 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, + 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, + 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, + 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, + 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, + 2286, 2287, 2288, 2289, 2290, 2291, 0, 1630, 0, 725, + 996, 0, 888, 889, 0, 796, 796, 0, 796, 796, + 796, 796, 0, 0, 0, 739, 0, 0, 0, 0, + 793, 0, 755, 756, 0, 793, 0, 762, 799, 0, + 0, 769, 796, 796, 772, 2295, 0, 2295, 2295, 0, + 0, 1621, 0, 790, 788, 802, 803, 42, 806, 809, + 810, 811, 812, 815, 0, 826, 829, 1647, 1648, 0, + 831, 836, 855, 856, 0, 45, 1156, 0, 1020, 0, + 1031, -2, 1042, 1059, 1060, 1061, 1062, 1063, 1065, 1066, + 1067, 0, 0, 0, 0, 1072, 1073, 0, 0, 0, + 0, 0, 1136, 0, 0, 0, 0, 2017, 1476, 0, + 0, 1438, 1438, 1172, 1438, 1438, 1440, 1440, 1440, 1867, + 2009, 2018, 2197, 1828, 1834, 1835, 1836, 2143, 2144, 2145, + 2146, 2238, 2239, 2243, 1931, 1823, 2210, 2211, 0, 2291, + 1970, 1978, 1979, 1955, 1964, 2003, 2105, 2222, 1846, 1998, + 2068, 1928, 1950, 1951, 2086, 2087, 1974, 1975, 1954, 2149, + 2151, 2167, 2168, 2153, 2155, 2164, 2170, 2175, 2154, 2166, + 2171, 2184, 2188, 2191, 2192, 2193, 2161, 2159, 2172, 2176, + 2178, 2180, 2186, 2189, 2162, 2160, 2173, 2177, 2179, 2181, + 2187, 2190, 2148, 2152, 2156, 2165, 2183, 2163, 2182, 2157, + 2169, 2174, 2185, 2158, 2150, 1968, 1971, 1958, 1959, 1961, + 1963, 1969, 1976, 1982, 1960, 1981, 1980, 0, 1956, 1957, + 1962, 1973, 1977, 1965, 1966, 1967, 1972, 1983, 2024, 2023, + 2022, 2067, 1994, 2066, 0, 0, 0, 0, 0, 1817, + 1873, 1874, 2194, 1360, 1361, 1362, 1363, 0, 0, 0, + 0, 0, 0, 0, 293, 294, 1489, 1490, 44, 1155, + 1617, 1440, 1440, 1440, 1440, 1440, 1440, 1094, 1095, 1096, + 1097, 1098, 1124, 1125, 1131, 1132, 2081, 2082, 2083, 2084, + 1911, 2233, 1920, 1921, 2063, 2064, 1933, 1934, 2265, 2266, + -2, -2, -2, 235, 236, 237, 238, 239, 240, 241, + 242, 0, 1872, 2208, 2209, 231, 0, 1615, 1616, 298, + 295, 296, 297, 1138, 1139, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 297, 298, 2285, 0, 862, 0, - 0, 0, 0, 0, 0, 1650, 1651, 1511, 0, 1503, - 1502, 63, 0, 889, -2, 0, 0, 0, 0, 47, - 0, 52, 950, 892, 77, 76, 1551, 1554, 0, 0, - 0, 59, 1512, 67, 69, 1513, 0, 894, 895, 0, - 926, 930, 0, 0, 0, 1628, 1627, 1627, 102, 0, - 0, 103, 123, 124, 125, 0, 0, 109, 110, 1614, - 1615, 43, 0, 0, 177, 178, 0, 1109, 428, 0, - 173, 0, 421, 360, 0, 1529, 0, 0, 0, 0, - 0, 1625, 0, 1622, 154, 155, 162, 163, 164, 401, - 401, 401, 575, 0, 0, 165, 165, 533, 534, 535, - 0, 0, -2, 426, 0, 513, 0, 0, 415, 415, - 419, 417, 418, 0, 0, 0, 0, 0, 0, 0, - 0, 552, 0, 553, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 670, 0, 402, 0, 573, 574, 464, - 0, 0, 0, 0, 0, 0, 0, 0, 1630, 1631, - 0, 550, 551, 0, 0, 0, 401, 401, 0, 0, - 0, 0, 401, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 153, 1542, 0, 0, 0, -2, 0, 714, - 0, 0, 0, 1623, 1623, 0, 721, 0, 0, 0, - 726, 0, 0, 727, 0, 790, 790, 788, 789, 729, - 730, 731, 732, 793, 0, 0, 410, 411, 412, 790, - 793, 0, 793, 793, 793, 793, 790, 790, 790, 793, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2286, - 796, 793, 0, 760, 0, 761, 762, 763, 764, 767, - 768, 770, 2287, 2288, 1640, 1641, 1652, 1653, 1654, 1655, - 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, - 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, - 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, - 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, - 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, - 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, - 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, - 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, - 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, - 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, - 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, - 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, - 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, - 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, - 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 2286, - 2286, 774, 778, 782, 780, 1613, 805, 811, 813, 814, - 0, 0, 824, 827, 846, 49, 1910, 832, 49, 834, - 835, 836, 837, 838, 864, 865, 870, 0, 0, 0, - 0, 876, 877, 878, 0, 0, 881, 882, 883, 0, - 0, 0, 0, 0, 1015, 0, 0, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1040, 1041, 0, 0, 0, 1065, 1066, - 1067, 1068, 1071, 0, 1082, 0, 1084, 1482, -2, 0, - 0, 0, 1076, 1077, 0, 0, 0, 1633, 1633, 0, - 0, 0, 1474, 0, 0, 1167, 0, 1168, 1170, 1171, - 1172, 0, 1173, 1174, 899, 899, 899, 899, 899, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 899, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, - 0, 1633, 1633, 0, 0, 220, 221, 222, 223, 224, - 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 240, 241, 242, 243, - 244, 299, 245, 246, 247, 1152, 0, 0, 0, 46, - 854, 855, 0, 976, 1633, 0, 0, 905, 0, 1648, - 57, 66, 68, 1511, 61, 1511, 0, 909, 0, 0, - -2, -2, 910, 911, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 54, 2284, 55, 0, 74, 0, 48, - 0, 0, 1552, 0, 1555, 0, 0, 0, 374, 1559, - 0, 0, 1504, 1505, 1508, 0, 927, 2006, 931, 0, - 933, 934, 0, 0, 100, 0, 992, 0, 0, 0, - 111, 0, 113, 114, 0, 0, 0, 385, 1616, 1617, - 1618, -2, 408, 0, 385, 369, 307, 308, 309, 360, - 311, 360, 360, 360, 360, 374, 374, 374, 374, 342, - 343, 344, 345, 346, 0, 360, 0, 328, 360, 360, - 360, 360, 350, 351, 352, 353, 354, 355, 356, 357, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 362, - 362, 362, 362, 362, 366, 366, 0, 1110, 0, 389, - 0, 1508, 0, 0, 1542, 1625, 1635, 0, 0, 0, - 0, 0, 132, 0, 0, 0, 576, 620, 527, 564, - 577, 0, 530, 531, -2, 0, 0, 512, 0, 514, - 0, 409, 0, -2, 0, 419, 0, 415, 419, 416, - 419, 407, 420, 554, 555, 556, 0, 558, 559, 650, - 962, 0, 0, 0, 0, 0, 656, 657, 658, 0, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 565, 566, 567, 568, 569, 570, 571, 572, 0, 0, - 0, 0, 514, 0, 561, 0, 0, 465, 466, 467, - 0, 0, 470, 471, 472, 473, 0, 0, 476, 477, - 478, 979, 980, 479, 480, 505, 506, 507, 481, 482, - 483, 484, 485, 486, 487, 499, 500, 501, 502, 503, - 504, 488, 489, 490, 491, 492, 493, 496, 0, 147, - 1533, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1623, 0, - 0, 0, 0, 908, 994, 1646, 1647, 723, 0, 0, - 794, 795, 0, 413, 414, 793, 793, 733, 775, 0, - 793, 737, 776, 738, 740, 739, 741, 754, 755, 793, - 744, 791, 792, 745, 746, 747, 748, 749, 750, 751, - 771, 756, 757, 758, 797, 0, 801, 802, 772, 773, - 0, 783, 0, 0, 0, 817, 818, 0, 825, 849, - 847, 848, 850, 842, 843, 844, 845, 0, 851, 0, - 0, 867, 96, 872, 873, 874, 875, 887, 880, 1154, - 1012, 1013, 1014, 0, 1016, 1022, 0, 1137, 1139, 1020, - 1021, 1024, 0, 0, 0, 1018, 1029, 1149, 1150, 1151, - 0, 0, 0, 0, 0, 1033, 1037, 1042, 1043, 1044, - 1045, 1046, 0, 1047, 0, 1050, 1051, 1052, 1053, 1054, - 1055, 1061, 1450, 1451, 1452, 1080, 300, 301, 0, 1081, - 0, 0, 0, 0, 0, 0, 0, 0, 1397, 1398, - 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, - 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1153, 0, - 1634, 0, 0, 0, 1480, 1477, 0, 0, 0, 1436, - 1438, 0, 0, 0, 900, 901, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1417, 1418, 1419, 1420, 1421, 1422, 1423, - 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, - 1434, 0, 0, 1453, 0, 0, 0, 0, 0, 0, - 0, 1473, 0, 1086, 1087, 1088, 0, 0, 0, 0, - 0, 0, 1215, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 142, 143, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1361, 1362, - 1363, 1364, 41, 0, 0, 0, 0, 0, 0, 0, - 1484, 0, -2, -2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1386, 0, 0, - 0, 0, 0, 0, 1606, 0, 0, 857, 858, 860, - 0, 996, 0, 977, 0, 0, 863, 0, 904, 0, - 907, 60, 62, 913, 914, 0, 935, 924, 912, 56, - 51, 0, 0, 954, 1553, 1556, 1557, 374, 1579, 0, - 383, 383, 380, 1514, 1515, 0, 1507, 1509, 1510, 79, - 932, 928, 0, 1010, 0, 0, 991, 0, 938, 940, - 941, 942, 974, 0, 945, 946, 0, 0, 0, 0, - 0, 98, 993, 104, 0, 112, 0, 0, 117, 118, - 105, 106, 107, 108, 0, 609, -2, 460, 179, 181, - 182, 183, 174, -2, 372, 370, 371, 310, 374, 374, - 336, 337, 338, 339, 340, 341, 0, 348, 0, 329, - 330, 331, 332, 321, 0, 322, 323, 324, 364, 0, - 325, 326, 0, 327, 427, 0, 1516, 390, 391, 393, - 401, 0, 396, 397, 0, 401, 401, 0, 422, 423, - 0, 1508, 1533, 0, 0, 1636, 1635, 1635, 1635, 152, - 0, 167, 168, 169, 170, 171, 172, 645, 0, 0, - 621, 643, 644, 165, 0, 0, 175, 516, 515, 0, - 677, 0, 425, 0, 0, 419, 419, 404, 405, 557, - 0, 0, 652, 653, 654, 655, 0, 0, 0, 543, - 454, 0, 544, 545, 514, 516, 0, 0, 385, 468, - 469, 474, 475, 494, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 592, 593, 595, 598, - 600, 518, 604, 606, 0, 594, 597, 599, 601, 518, - 605, 607, 1530, 1531, 1532, 0, 0, 715, 0, 0, - 451, 94, 1624, 720, 724, 725, 790, 743, 777, 790, - 735, 742, 765, 779, 781, 815, 816, 821, 829, 830, - 831, 871, 0, 0, 0, 0, 879, 0, 0, 1023, - 1138, 1140, 1025, 1026, 1027, 1030, 0, 1034, 1038, 0, - 0, 0, 0, 0, 1085, 1083, 1484, 0, 0, 0, - 1134, 0, 0, 1157, 1158, 0, 0, 0, 0, 1478, - 0, 0, 1165, 0, 1439, 1115, 0, 0, 0, 0, - 0, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, - 1115, 1502, 1192, 0, 0, 0, 0, 0, 1197, 1198, - 1199, 1115, 0, 1202, 1203, 0, 1205, 0, 1206, 0, - 0, 0, 0, 1213, 1214, 1216, 0, 0, 1219, 1220, - 0, 1222, 0, 1224, 1225, 1226, 1227, 1228, 1229, 0, - 1231, 0, 1233, 1234, 1235, 0, 1237, 0, 1239, 1240, - 0, 1242, 0, 1244, 0, 1247, 0, 1250, 0, 1253, - 0, 1256, 0, 1259, 0, 1262, 0, 1265, 0, 1268, - 0, 1271, 0, 1274, 0, 1277, 0, 1280, 0, 1283, - 0, 1286, 0, 1289, 0, 1292, 1293, 1294, 0, 1296, - 0, 1298, 0, 1301, 1302, 0, 1304, 0, 1307, 0, - 1310, 0, 0, 1311, 0, 0, 0, 1315, 0, 0, - 0, 0, 1324, 1325, 1326, 1327, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1338, 1339, 1340, 1341, - 1342, 1343, 0, 1345, 0, 1116, 0, 0, 1116, 0, - 0, 0, 0, 0, 1155, 1633, 0, 1440, 1441, 1442, - 1443, 1444, 0, 0, 0, 0, 0, 0, 1384, 1385, - 1387, 0, 0, 1390, 0, 1392, 0, 1607, 856, 859, - 861, 948, 997, 998, 0, 0, 0, 0, 978, 1632, - 902, 903, 906, 956, 0, 1488, 0, 0, 935, 1010, - 0, 936, 0, 53, 951, 0, 1561, 1560, 1573, 1586, - 383, 383, 377, 378, 384, 379, 381, 382, 1506, 0, - 1511, 0, 1600, 0, 0, 1589, 0, 0, 0, 0, - 0, 0, 0, 0, 981, 0, 0, 984, 0, 0, - 0, 0, 975, 946, 0, 947, 0, -2, 0, 0, - 92, 93, 0, 0, 0, 115, 116, 0, 0, 122, - 386, 387, 156, 165, 462, 180, 435, 0, 0, 306, - 373, 333, 334, 335, 0, 358, 0, 0, 0, 0, - 456, 128, 1520, 1519, 401, 401, 392, 0, 395, 0, - 0, 0, 1637, 361, 424, 0, 146, 0, 0, 0, - 0, 1626, 615, 0, 0, 622, 0, 0, 0, 525, - 0, 536, 537, 0, 649, -2, 711, 389, 0, 403, - 406, 963, 0, 0, 538, 0, 541, 542, 455, 516, - 547, 548, 562, 549, 497, 498, 495, 0, 0, 1543, - 1544, 1549, 1547, 1548, 133, 583, 585, 589, 584, 588, - 0, 0, 0, 520, 0, 608, 520, 581, 0, 451, - 1516, 0, 719, 452, 453, 793, 793, 866, 97, 0, - 869, 0, 0, 0, 0, 1031, 1035, 1048, 1049, 1445, - 1471, 360, 360, 1458, 360, 366, 1461, 360, 1463, 360, - 1466, 360, 1469, 1470, 0, 0, 1078, 0, 0, 0, - 0, 1164, 1481, 0, 0, 1175, 1114, 1115, 1115, 1115, - 1115, 1115, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, - 1189, 1190, 1475, 0, 0, 0, 1196, 0, 0, 1200, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 145, 0, 0, 0, 0, 0, 0, 1395, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1109, - 1113, 0, 1117, 1118, 0, 0, 1347, 0, 0, 1365, - 0, 0, 0, 0, 0, 0, 0, 1485, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 999, 1006, - 0, 1006, 0, 1006, 0, 0, 0, 1619, 1620, 1489, - 1490, 1010, 1491, 925, 937, 955, 1579, 0, 1572, 0, - -2, 1581, 0, 0, 0, 1587, 375, 376, 929, 80, - 1011, 83, 0, 1600, 1609, 0, 1597, 1602, 1604, 0, - 0, 0, 1593, 0, 1010, 939, 970, 972, 0, 967, - 982, 983, 985, 0, 987, 0, 989, 990, 950, 944, - 0, 100, 0, 1010, 1010, 99, 0, 995, 119, 120, - 121, 461, 184, 189, 0, 0, 0, 194, 0, 196, - 0, 0, 0, 201, 202, 401, 401, 436, 0, 303, - 305, 0, 0, 187, 374, 0, 374, 0, 365, 367, - 0, 437, 457, 1517, 1518, 0, 0, 394, 398, 399, - 400, 0, 148, 0, 0, 0, 618, 0, 646, 0, - 0, 0, 0, 0, 0, 176, 517, 678, 679, 680, - 681, 682, 683, 684, 685, 686, 0, 401, 0, 0, - 0, 401, 401, 401, 0, 703, 388, 0, 0, 674, - 671, 539, 0, 218, 219, 226, 227, 229, 0, 0, - 0, 0, 0, 546, 950, 1534, 1535, 1536, 0, 1546, - 1550, 136, 0, 0, 0, 0, 591, 596, 602, 0, - 519, 603, 716, 717, 718, 95, 728, 734, 868, 888, - 1019, 1032, 1036, 0, 0, 0, 0, 1472, 1456, 374, - 1459, 1460, 1462, 1464, 1465, 1467, 1468, 1074, 1075, 1079, - 0, 1161, 0, 1163, 0, 1479, 0, 1176, 1177, 1178, - 1179, 1180, 1511, 0, 0, 0, 1195, 0, 0, 1115, - 0, 1208, 1207, 1209, 0, 1211, 1212, 1217, 1218, 1221, - 1223, 1230, 1232, 1236, 1238, 1241, 1243, 1245, 0, 1248, - 0, 1251, 0, 1254, 0, 1257, 0, 1260, 0, 1263, - 0, 1266, 0, 1269, 0, 1272, 0, 1275, 0, 1278, - 0, 1281, 0, 1284, 0, 1287, 0, 1290, 0, 1295, - 1297, 0, 1300, 1303, 1305, 0, 1308, 0, 1312, 0, - 1314, 1316, 1317, 0, 0, 0, 1328, 1329, 1330, 1331, - 1332, 1333, 1334, 1335, 1336, 1337, 1344, 0, 1107, 1346, - 1119, 1120, 1125, 1349, 0, 0, 0, 1352, 0, 0, - 0, 1356, 1156, 1367, 0, 1372, 0, 0, 1378, 0, - 1382, 0, 1388, 1389, 1391, 1393, 0, 0, 0, 0, - 0, 0, 0, 976, 957, 64, 1491, 1495, 0, 1566, - 1564, 1564, 1574, 1575, 0, 0, 1582, 0, 0, 0, - 0, 84, 0, 0, 1588, 0, 0, 1605, 0, 0, - 0, 0, 101, 1502, 964, 971, 0, 0, 965, 0, - 966, 986, 988, 943, 0, 1010, 1010, 90, 91, 0, - 190, 0, 192, 0, 195, 197, 198, 199, 205, 206, - 207, 200, 0, 0, 302, 304, 0, 0, 347, 359, - 349, 0, 0, 1521, 1522, 1523, 1524, 1525, 1526, 1527, - 1528, 950, 149, 150, 151, 610, 0, 620, 0, 952, - 0, 613, 0, 528, 0, 0, 0, 401, 401, 401, - 0, 0, 0, 0, 688, 0, 0, 651, 0, 659, - 0, 0, 0, 230, 231, 0, 1545, 582, 0, 134, - 135, 0, 0, 587, 521, 522, 1072, 0, 0, 0, - 1073, 1457, 0, 0, 0, 0, 0, 1476, 0, 0, - 0, 0, 1201, 1204, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1320, 0, 0, 0, - 640, 641, 0, 1396, 1112, 1502, 0, 1116, 1126, 1127, - 0, 1116, 1366, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1007, 0, 0, 0, 958, 959, - 0, 0, 0, 996, 1495, 1500, 0, 0, 1569, 0, - 1562, 1565, 1563, 1576, 0, 0, 1583, 0, 1585, 0, - 1610, 1611, 1603, 1598, 0, 1592, 1595, 1597, 1594, 1511, - 968, 0, 973, 0, 1502, 89, 0, 193, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, - 204, 0, 0, 363, 368, 0, 0, 0, 611, 0, - 953, 623, 614, 0, 701, 0, 705, 0, 0, 0, - 708, 709, 710, 687, 0, 691, 429, 675, 672, 673, - 540, 0, 137, 138, 0, 0, 0, 1446, 0, 1449, - 1159, 1162, 1160, 0, 1191, 1193, 1194, 1454, 1455, 1210, - 1246, 1249, 1252, 1255, 1258, 1261, 1264, 1267, 1270, 1273, - 1276, 1279, 1282, 1285, 1288, 1291, 1299, 1306, 1309, 1313, - 1318, 0, 1321, 0, 0, 1322, 0, 642, 1103, 0, - 0, 1123, 1124, 0, 1351, 1353, 1354, 1355, 1368, 0, - 1373, 1374, 0, 1379, 0, 1383, 1394, 0, 1001, 1008, - 1009, 0, 1004, 0, 1005, 0, 949, 1500, 82, 1501, - 1498, 0, 1496, 1493, 1558, 0, 1567, 1568, 1577, 1578, - 1584, 0, 0, 1597, 0, 1591, 87, 0, 0, 0, - 1511, 191, 0, 210, 0, 619, 0, 622, 612, 699, - 700, 0, 712, 704, 706, 707, 689, -2, 1537, 0, - 0, 0, 590, 1447, 0, 0, 1323, 0, 638, 639, - 1111, 1104, 0, 1089, 1090, 1108, 1348, 1350, 0, 0, - 0, 1000, 960, 961, 1002, 1003, 81, 0, 1497, 1131, - 0, 1492, 0, 1570, 1571, 1601, 0, 1590, 1596, 969, - 976, 0, 88, 442, 435, 1537, 0, 0, 0, 692, - 693, 694, 695, 696, 697, 698, 579, 1539, 139, 140, - 0, 509, 510, 511, 133, 0, 1166, 1319, 1105, 0, - 0, 0, 0, 0, 1369, 0, 1375, 0, 1380, 0, - 1499, 0, 0, 1494, 1599, 624, 0, 626, 0, -2, - 430, 443, 0, 185, 211, 212, 0, 0, 215, 216, - 217, 208, 209, 129, 0, 0, 713, 0, 1540, 1541, - 0, 136, 0, 0, 1096, 1097, 1098, 1099, 1101, 0, - 0, 0, 0, 1132, 1109, 625, 0, 0, 385, 0, - 635, 431, 432, 0, 438, 439, 440, 441, 213, 214, - 647, 0, 0, 508, 586, 1448, 0, 0, 1370, 0, - 1376, 0, 1381, 0, 627, 628, 636, 0, 433, 0, - 434, 0, 0, 0, 616, 0, 647, 1538, 1106, 1100, - 1102, 0, 0, 1130, 0, 637, 633, 444, 446, 447, - 0, 0, 445, 648, 617, 1371, 1377, 0, 448, 449, - 450, 629, 630, 631, 632, + 286, 287, 288, 289, 290, 291, 292, 0, 300, 301, + 2294, 0, 865, 0, 0, 0, 0, 0, 0, 1659, + 1660, 1514, 0, 1506, 1505, 63, 0, 892, -2, 0, + 0, 0, 0, 47, 0, 52, 953, 0, 895, 77, + 76, 1554, 1557, 0, 0, 0, 59, 1515, 67, 69, + 1516, 0, 897, 898, 0, 929, 933, 0, 0, 0, + 1637, 1636, 1636, 105, 0, 0, 106, 126, 127, 128, + 0, 0, 112, 113, 1623, 1624, 43, 0, 0, 180, + 181, 0, 1112, 431, 0, 176, 0, 424, 363, 0, + 1532, 0, 0, 0, 0, 0, 1634, 0, 1631, 157, + 158, 165, 166, 167, 404, 404, 404, 578, 0, 0, + 168, 168, 536, 537, 538, 0, 0, -2, 429, 0, + 516, 0, 0, 418, 418, 422, 420, 421, 0, 0, + 0, 0, 0, 0, 0, 0, 555, 0, 556, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 673, 0, + 405, 0, 576, 577, 467, 0, 0, 0, 0, 0, + 0, 0, 0, 1639, 1640, 0, 553, 554, 0, 0, + 0, 404, 404, 0, 0, 0, 0, 404, 404, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 156, 1545, 0, + 0, 0, -2, 0, 717, 0, 0, 0, 1632, 1632, + 0, 724, 0, 0, 0, 729, 0, 0, 730, 0, + 793, 793, 791, 792, 732, 733, 734, 735, 796, 0, + 0, 413, 414, 415, 793, 796, 0, 796, 796, 796, + 796, 793, 793, 793, 796, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2295, 799, 796, 0, 763, 0, + 764, 765, 766, 767, 770, 771, 773, 2296, 2297, 1649, + 1650, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, + 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, + 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, + 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, + 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, + 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, + 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, + 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, + 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, + 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, + 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, + 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, + 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, + 1810, 1811, 1812, 1813, 2295, 2295, 777, 781, 785, 783, + 1622, 808, 814, 816, 817, 0, 0, 827, 830, 849, + 49, 1919, 835, 49, 837, 838, 839, 840, 841, 867, + 868, 873, 0, 0, 0, 0, 879, 880, 881, 0, + 0, 884, 885, 886, 0, 0, 0, 0, 0, 1018, + 0, 0, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1043, 1044, + 0, 0, 0, 1068, 1069, 1070, 1071, 1074, 0, 1085, + 0, 1087, 1485, -2, 0, 0, 0, 1079, 1080, 0, + 0, 0, 1642, 1642, 0, 0, 0, 1477, 0, 0, + 1170, 0, 1171, 1173, 1174, 1175, 0, 1176, 1177, 902, + 902, 902, 902, 902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1642, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1642, 0, 0, 1642, 1642, 0, 0, + 223, 224, 225, 226, 227, 228, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 299, 243, 244, 245, 246, 247, 302, 248, 249, 250, + 1155, 0, 0, 892, 0, 46, 857, 858, 0, 979, + 1642, 0, 0, 908, 0, 1657, 57, 66, 68, 1514, + 61, 1514, 0, 912, 0, 0, -2, -2, 913, 914, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 54, + 2293, 55, 0, 74, 0, 48, 0, 0, 79, 80, + 1605, 1609, 0, 1555, 0, 1558, 0, 0, 0, 377, + 1562, 0, 0, 1507, 1508, 1511, 0, 930, 2015, 934, + 0, 936, 937, 0, 0, 103, 0, 995, 0, 0, + 0, 114, 0, 116, 117, 0, 0, 0, 388, 1625, + 1626, 1627, -2, 411, 0, 388, 372, 310, 311, 312, + 363, 314, 363, 363, 363, 363, 377, 377, 377, 377, + 345, 346, 347, 348, 349, 0, 363, 0, 331, 363, + 363, 363, 363, 353, 354, 355, 356, 357, 358, 359, + 360, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 365, 365, 365, 365, 365, 369, 369, 0, 1113, 0, + 392, 0, 1511, 0, 0, 1545, 1634, 1644, 0, 0, + 0, 0, 0, 135, 0, 0, 0, 579, 623, 530, + 567, 580, 0, 533, 534, -2, 0, 0, 515, 0, + 517, 0, 412, 0, -2, 0, 422, 0, 418, 422, + 419, 422, 410, 423, 557, 558, 559, 0, 561, 562, + 653, 965, 0, 0, 0, 0, 0, 659, 660, 661, + 0, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 568, 569, 570, 571, 572, 573, 574, 575, 0, + 0, 0, 0, 517, 0, 564, 0, 0, 468, 469, + 470, 0, 0, 473, 474, 475, 476, 0, 0, 479, + 480, 481, 982, 983, 482, 483, 508, 509, 510, 484, + 485, 486, 487, 488, 489, 490, 502, 503, 504, 505, + 506, 507, 491, 492, 493, 494, 495, 496, 499, 0, + 150, 1536, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, + 0, 0, 0, 0, 911, 997, 1655, 1656, 726, 0, + 0, 797, 798, 0, 416, 417, 796, 796, 736, 778, + 0, 796, 740, 779, 741, 743, 742, 744, 757, 758, + 796, 747, 794, 795, 748, 749, 750, 751, 752, 753, + 754, 774, 759, 760, 761, 800, 0, 804, 805, 775, + 776, 0, 786, 0, 0, 0, 820, 821, 0, 828, + 852, 850, 851, 853, 845, 846, 847, 848, 0, 854, + 0, 0, 870, 99, 875, 876, 877, 878, 890, 883, + 1157, 1015, 1016, 1017, 0, 1019, 1025, 0, 1140, 1142, + 1023, 1024, 1027, 0, 0, 0, 1021, 1032, 1152, 1153, + 1154, 0, 0, 0, 0, 0, 1036, 1040, 1045, 1046, + 1047, 1048, 1049, 0, 1050, 0, 1053, 1054, 1055, 1056, + 1057, 1058, 1064, 1453, 1454, 1455, 1083, 303, 304, 0, + 1084, 0, 0, 0, 0, 0, 0, 0, 0, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, + 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1156, + 0, 1643, 0, 0, 0, 1483, 1480, 0, 0, 0, + 1439, 1441, 0, 0, 0, 903, 904, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1420, 1421, 1422, 1423, 1424, 1425, + 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, + 1436, 1437, 0, 0, 1456, 0, 0, 0, 0, 0, + 0, 0, 1476, 0, 1089, 1090, 1091, 0, 0, 0, + 0, 0, 0, 1218, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 146, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1364, + 1365, 1366, 1367, 41, 0, 0, 0, 0, 0, 0, + 0, 1487, 0, -2, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1389, 0, + 0, 0, 0, 0, 0, 1613, 0, 0, 860, 861, + 863, 0, 999, 0, 980, 0, 0, 866, 0, 907, + 0, 910, 60, 62, 916, 917, 0, 938, 927, 915, + 56, 51, 0, 0, 957, 0, 0, 1556, 1559, 1560, + 377, 1582, 0, 386, 386, 383, 1517, 1518, 0, 1510, + 1512, 1513, 81, 935, 931, 0, 1013, 0, 0, 994, + 0, 941, 943, 944, 945, 977, 0, 948, 949, 0, + 0, 0, 0, 0, 101, 996, 107, 0, 115, 0, + 0, 120, 121, 108, 109, 110, 111, 0, 612, -2, + 463, 182, 184, 185, 186, 177, -2, 375, 373, 374, + 313, 377, 377, 339, 340, 341, 342, 343, 344, 0, + 351, 0, 332, 333, 334, 335, 324, 0, 325, 326, + 327, 367, 0, 328, 329, 0, 330, 430, 0, 1519, + 393, 394, 396, 404, 0, 399, 400, 0, 404, 404, + 0, 425, 426, 0, 1511, 1536, 0, 0, 1645, 1644, + 1644, 1644, 155, 0, 170, 171, 172, 173, 174, 175, + 648, 0, 0, 624, 646, 647, 168, 0, 0, 178, + 519, 518, 0, 680, 0, 428, 0, 0, 422, 422, + 407, 408, 560, 0, 0, 655, 656, 657, 658, 0, + 0, 0, 546, 457, 0, 547, 548, 517, 519, 0, + 0, 388, 471, 472, 477, 478, 497, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, + 596, 598, 601, 603, 521, 607, 609, 0, 597, 600, + 602, 604, 521, 608, 610, 1533, 1534, 1535, 0, 0, + 718, 0, 0, 454, 97, 1633, 723, 727, 728, 793, + 746, 780, 793, 738, 745, 768, 782, 784, 818, 819, + 824, 832, 833, 834, 874, 0, 0, 0, 0, 882, + 0, 0, 1026, 1141, 1143, 1028, 1029, 1030, 1033, 0, + 1037, 1041, 0, 0, 0, 0, 0, 1088, 1086, 1487, + 0, 0, 0, 1137, 0, 0, 1160, 1161, 0, 0, + 0, 0, 1481, 0, 0, 1168, 0, 1442, 1118, 0, + 0, 0, 0, 0, 1118, 1118, 1118, 1118, 1118, 1118, + 1118, 1118, 1118, 1118, 1505, 1195, 0, 0, 0, 0, + 0, 1200, 1201, 1202, 1118, 0, 1205, 1206, 0, 1208, + 0, 1209, 0, 0, 0, 0, 1216, 1217, 1219, 0, + 0, 1222, 1223, 0, 1225, 0, 1227, 1228, 1229, 1230, + 1231, 1232, 0, 1234, 0, 1236, 1237, 1238, 0, 1240, + 0, 1242, 1243, 0, 1245, 0, 1247, 0, 1250, 0, + 1253, 0, 1256, 0, 1259, 0, 1262, 0, 1265, 0, + 1268, 0, 1271, 0, 1274, 0, 1277, 0, 1280, 0, + 1283, 0, 1286, 0, 1289, 0, 1292, 0, 1295, 1296, + 1297, 0, 1299, 0, 1301, 0, 1304, 1305, 0, 1307, + 0, 1310, 0, 1313, 0, 0, 1314, 0, 0, 0, + 1318, 0, 0, 0, 0, 1327, 1328, 1329, 1330, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1341, + 1342, 1343, 1344, 1345, 1346, 0, 1348, 0, 1119, 0, + 0, 1119, 0, 0, 0, 0, 0, 1158, 1642, 0, + 1443, 1444, 1445, 1446, 1447, 0, 0, 0, 0, 0, + 0, 1387, 1388, 1390, 0, 0, 1393, 0, 1395, 0, + 1614, 859, 862, 864, 951, 1000, 1001, 0, 0, 0, + 0, 981, 1641, 905, 906, 909, 959, 0, 1491, 0, + 0, 938, 1013, 0, 939, 0, 53, 954, 0, 1606, + 1610, 1564, 1563, 1576, 1589, 386, 386, 380, 381, 387, + 382, 384, 385, 1509, 0, 1514, 0, 1603, 0, 892, + 1592, 0, 0, 0, 0, 0, 0, 0, 0, 984, + 0, 0, 987, 0, 0, 0, 0, 978, 949, 0, + 950, 0, -2, 0, 0, 95, 96, 0, 0, 0, + 118, 119, 0, 0, 125, 389, 390, 159, 168, 465, + 183, 438, 0, 0, 309, 376, 336, 337, 338, 0, + 361, 0, 0, 0, 0, 459, 131, 1523, 1522, 404, + 404, 395, 0, 398, 0, 0, 0, 1646, 364, 427, + 0, 149, 0, 0, 0, 0, 1635, 618, 0, 0, + 625, 0, 0, 0, 528, 0, 539, 540, 0, 652, + -2, 714, 392, 0, 406, 409, 966, 0, 0, 541, + 0, 544, 545, 458, 519, 550, 551, 565, 552, 500, + 501, 498, 0, 0, 1546, 1547, 1552, 1550, 1551, 136, + 586, 588, 592, 587, 591, 0, 0, 0, 523, 0, + 611, 523, 584, 0, 454, 1519, 0, 722, 455, 456, + 796, 796, 869, 100, 0, 872, 0, 0, 0, 0, + 1034, 1038, 1051, 1052, 1448, 1474, 363, 363, 1461, 363, + 369, 1464, 363, 1466, 363, 1469, 363, 1472, 1473, 0, + 0, 1081, 0, 0, 0, 0, 1167, 1484, 0, 0, + 1178, 1117, 1118, 1118, 1118, 1118, 1118, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1478, 0, 0, + 0, 1199, 0, 0, 1203, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 147, 148, 0, 0, 0, 0, + 0, 0, 1398, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1112, 1116, 0, 1120, 1121, 0, + 0, 1350, 0, 0, 1368, 0, 0, 0, 0, 0, + 0, 0, 1488, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1002, 1009, 0, 1009, 0, 1009, 0, + 0, 0, 1628, 1629, 1492, 1493, 1013, 1494, 928, 940, + 958, 1582, 0, 1575, 0, -2, 1584, 0, 0, 0, + 1590, 378, 379, 932, 82, 1014, 86, 0, 1603, 1618, + 0, 1600, 1607, 1611, 0, 0, 0, 1596, 0, 1013, + 942, 973, 975, 0, 970, 985, 986, 988, 0, 990, + 0, 992, 993, 953, 947, 0, 103, 0, 1013, 1013, + 102, 0, 998, 122, 123, 124, 464, 187, 192, 0, + 0, 0, 197, 0, 199, 0, 0, 0, 204, 205, + 404, 404, 439, 0, 306, 308, 0, 0, 190, 377, + 0, 377, 0, 368, 370, 0, 440, 460, 1520, 1521, + 0, 0, 397, 401, 402, 403, 0, 151, 0, 0, + 0, 621, 0, 649, 0, 0, 0, 0, 0, 0, + 179, 520, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 0, 404, 0, 0, 0, 404, 404, 404, 0, + 706, 391, 0, 0, 677, 674, 542, 0, 221, 222, + 229, 230, 232, 0, 0, 0, 0, 0, 549, 953, + 1537, 1538, 1539, 0, 1549, 1553, 139, 0, 0, 0, + 0, 594, 599, 605, 0, 522, 606, 719, 720, 721, + 98, 731, 737, 871, 891, 1022, 1035, 1039, 0, 0, + 0, 0, 1475, 1459, 377, 1462, 1463, 1465, 1467, 1468, + 1470, 1471, 1077, 1078, 1082, 0, 1164, 0, 1166, 0, + 1482, 0, 1179, 1180, 1181, 1182, 1183, 1514, 0, 0, + 0, 1198, 0, 0, 1118, 0, 1211, 1210, 1212, 0, + 1214, 1215, 1220, 1221, 1224, 1226, 1233, 1235, 1239, 1241, + 1244, 1246, 1248, 0, 1251, 0, 1254, 0, 1257, 0, + 1260, 0, 1263, 0, 1266, 0, 1269, 0, 1272, 0, + 1275, 0, 1278, 0, 1281, 0, 1284, 0, 1287, 0, + 1290, 0, 1293, 0, 1298, 1300, 0, 1303, 1306, 1308, + 0, 1311, 0, 1315, 0, 1317, 1319, 1320, 0, 0, + 0, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, + 1340, 1347, 0, 1110, 1349, 1122, 1123, 1128, 1352, 0, + 0, 0, 1355, 0, 0, 0, 1359, 1159, 1370, 0, + 1375, 0, 0, 1381, 0, 1385, 0, 1391, 1392, 1394, + 1396, 0, 0, 0, 0, 0, 0, 0, 979, 960, + 64, 1494, 1498, 0, 1569, 1567, 1567, 1577, 1578, 0, + 0, 1585, 0, 0, 0, 0, 87, 0, 0, 1591, + 0, 0, 1612, 0, 0, 0, 0, 104, 1505, 967, + 974, 0, 0, 968, 0, 969, 989, 991, 946, 0, + 1013, 1013, 93, 94, 0, 193, 0, 195, 0, 198, + 200, 201, 202, 208, 209, 210, 203, 0, 0, 305, + 307, 0, 0, 350, 362, 352, 0, 0, 1524, 1525, + 1526, 1527, 1528, 1529, 1530, 1531, 953, 152, 153, 154, + 613, 0, 623, 0, 955, 0, 616, 0, 531, 0, + 0, 0, 404, 404, 404, 0, 0, 0, 0, 691, + 0, 0, 654, 0, 662, 0, 0, 0, 233, 234, + 0, 1548, 585, 0, 137, 138, 0, 0, 590, 524, + 525, 1075, 0, 0, 0, 1076, 1460, 0, 0, 0, + 0, 0, 1479, 0, 0, 0, 0, 1204, 1207, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1323, 0, 0, 0, 643, 644, 0, 1399, 1115, + 1505, 0, 1119, 1129, 1130, 0, 1119, 1369, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1010, + 0, 0, 0, 961, 962, 0, 0, 0, 999, 1498, + 1503, 0, 0, 1572, 0, 1565, 1568, 1566, 1579, 0, + 0, 1586, 0, 1588, 0, 1619, 1620, 1608, 1601, 892, + 1595, 1598, 1600, 1597, 1514, 971, 0, 976, 0, 1505, + 92, 0, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 206, 207, 0, 0, 366, 371, + 0, 0, 0, 614, 0, 956, 626, 617, 0, 704, + 0, 708, 0, 0, 0, 711, 712, 713, 690, 0, + 694, 432, 678, 675, 676, 543, 0, 140, 141, 0, + 0, 0, 1449, 0, 1452, 1162, 1165, 1163, 0, 1194, + 1196, 1197, 1457, 1458, 1213, 1249, 1252, 1255, 1258, 1261, + 1264, 1267, 1270, 1273, 1276, 1279, 1282, 1285, 1288, 1291, + 1294, 1302, 1309, 1312, 1316, 1321, 0, 1324, 0, 0, + 1325, 0, 645, 1106, 0, 0, 1126, 1127, 0, 1354, + 1356, 1357, 1358, 1371, 0, 1376, 1377, 0, 1382, 0, + 1386, 1397, 0, 1004, 1011, 1012, 0, 1007, 0, 1008, + 0, 952, 1503, 84, 1504, 1501, 0, 1499, 1496, 1561, + 0, 1570, 1571, 1580, 1581, 1587, 0, 0, 1600, 0, + 1594, 90, 0, 0, 0, 1514, 194, 0, 213, 0, + 622, 0, 625, 615, 702, 703, 0, 715, 707, 709, + 710, 692, -2, 1540, 0, 0, 0, 593, 1450, 0, + 0, 1326, 0, 641, 642, 1114, 1107, 0, 1092, 1093, + 1111, 1351, 1353, 0, 0, 0, 1003, 963, 964, 1005, + 1006, 83, 0, 1500, 1134, 0, 1495, 0, 1573, 1574, + 1604, 0, 1593, 1599, 972, 979, 0, 91, 445, 438, + 1540, 0, 0, 0, 695, 696, 697, 698, 699, 700, + 701, 582, 1542, 142, 143, 0, 512, 513, 514, 136, + 0, 1169, 1322, 1108, 0, 0, 0, 0, 0, 1372, + 0, 1378, 0, 1383, 0, 1502, 0, 0, 1497, 1602, + 627, 0, 629, 0, -2, 433, 446, 0, 188, 214, + 215, 0, 0, 218, 219, 220, 211, 212, 132, 0, + 0, 716, 0, 1543, 1544, 0, 139, 0, 0, 1099, + 1100, 1101, 1102, 1104, 0, 0, 0, 0, 1135, 1112, + 628, 0, 0, 388, 0, 638, 434, 435, 0, 441, + 442, 443, 444, 216, 217, 650, 0, 0, 511, 589, + 1451, 0, 0, 1373, 0, 1379, 0, 1384, 0, 630, + 631, 639, 0, 436, 0, 437, 0, 0, 0, 619, + 0, 650, 1541, 1109, 1103, 1105, 0, 0, 1133, 0, + 640, 636, 447, 449, 450, 0, 0, 448, 651, 620, + 1374, 1380, 0, 451, 452, 453, 632, 633, 634, 635, } var yyTok1 = [...]int{ @@ -10386,7 +10279,7 @@ yydefault: case 1: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:631 +//line sql.y:632 { stmt := yyDollar[2].statementUnion() // If the statement is empty and we have comments @@ -10400,46 +10293,46 @@ yydefault: } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:644 +//line sql.y:645 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:645 +//line sql.y:646 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:649 +//line sql.y:650 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 40: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:688 +//line sql.y:689 { setParseTree(yylex, nil) } case 41: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:694 +//line sql.y:695 { yyLOCAL = NewVariableExpression(yyDollar[1].str, SingleAt) } yyVAL.union = yyLOCAL case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:700 +//line sql.y:701 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 43: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:706 +//line sql.y:707 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), SingleAt) } @@ -10447,7 +10340,7 @@ yydefault: case 44: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:710 +//line sql.y:711 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), DoubleAt) } @@ -10455,7 +10348,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:716 +//line sql.y:717 { yyLOCAL = &OtherAdmin{} } @@ -10463,7 +10356,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:722 +//line sql.y:723 { yyLOCAL = &Load{} } @@ -10471,7 +10364,7 @@ yydefault: case 47: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:728 +//line sql.y:729 { yyLOCAL = &With{CTEs: yyDollar[2].ctesUnion(), Recursive: false} } @@ -10479,7 +10372,7 @@ yydefault: case 48: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:732 +//line sql.y:733 { yyLOCAL = &With{CTEs: yyDollar[3].ctesUnion(), Recursive: true} } @@ -10487,7 +10380,7 @@ yydefault: case 49: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:737 +//line sql.y:738 { yyLOCAL = nil } @@ -10495,14 +10388,14 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:741 +//line sql.y:742 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 51: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:747 +//line sql.y:748 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -10510,7 +10403,7 @@ yydefault: case 52: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:751 +//line sql.y:752 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -10518,266 +10411,290 @@ yydefault: case 53: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:757 +//line sql.y:758 { yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion().Select} } yyVAL.union = yyLOCAL case 54: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:763 + var yyLOCAL TableStatement +//line sql.y:764 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 55: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:767 + var yyLOCAL TableStatement +//line sql.y:768 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 56: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:771 + var yyLOCAL TableStatement +//line sql.y:772 { - setLockInSelect(yyDollar[2].selStmtUnion(), yyDollar[3].lockUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + setLockIfPossible(yylex, yyDollar[2].tableStmtUnion(), yyDollar[3].lockUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 57: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:794 + var yyLOCAL TableStatement +//line sql.y:795 { - yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) - yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 58: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:800 + var yyLOCAL TableStatement +//line sql.y:801 { - yyDollar[1].selStmtUnion().SetLimit(yyDollar[2].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[2].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 59: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:805 + var yyLOCAL TableStatement +//line sql.y:806 { - yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) - yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) + yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 60: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:811 + var yyLOCAL TableStatement +//line sql.y:812 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[4].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[4].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 61: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:818 + var yyLOCAL TableStatement +//line sql.y:819 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 62: yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:824 + var yyLOCAL TableStatement +//line sql.y:825 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) - yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) - yyDollar[2].selStmtUnion().SetLimit(yyDollar[4].limitUnion()) - yyLOCAL = yyDollar[2].selStmtUnion() + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) + yyDollar[2].tableStmtUnion().SetLimit(yyDollar[4].limitUnion()) + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:831 +//line sql.y:832 { - yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) + yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) } case 64: yyDollar = yyS[yypt-7 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:835 + var yyLOCAL TableStatement +//line sql.y:836 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/, nil) } yyVAL.union = yyLOCAL case 65: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:841 + var yyLOCAL TableStatement +//line sql.y:842 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 66: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:845 + var yyLOCAL TableStatement +//line sql.y:846 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 67: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:849 + var yyLOCAL TableStatement +//line sql.y:850 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 68: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:853 + var yyLOCAL TableStatement +//line sql.y:854 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 69: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:857 + var yyLOCAL TableStatement +//line sql.y:858 { - yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} + yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } yyVAL.union = yyLOCAL case 70: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:863 + var yyLOCAL TableStatement +//line sql.y:864 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 71: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:867 + var yyLOCAL TableStatement +//line sql.y:868 { - setLockInSelect(yyDollar[1].selStmtUnion(), yyDollar[2].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 72: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:872 + var yyLOCAL TableStatement +//line sql.y:873 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 73: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:876 + var yyLOCAL TableStatement +//line sql.y:877 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 74: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:882 + var yyLOCAL TableStatement +//line sql.y:883 { - yyLOCAL = yyDollar[2].selStmtUnion() + yyLOCAL = yyDollar[2].tableStmtUnion() } yyVAL.union = yyLOCAL case 75: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:886 + var yyLOCAL TableStatement +//line sql.y:887 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 76: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:891 + var yyLOCAL TableStatement +//line sql.y:892 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyDollar[1].selStmtUnion().SetLock(yyDollar[3].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].lockUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 77: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:897 + var yyLOCAL TableStatement +//line sql.y:898 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[3].selectIntoUnion()) - yyDollar[1].selStmtUnion().SetLock(yyDollar[2].lockUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 78: yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:903 + var yyLOCAL TableStatement +//line sql.y:904 { - yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) - yyLOCAL = yyDollar[1].selStmtUnion() + setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 79: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:911 + { + yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), ListArg: ListArg(yyDollar[3].str[2:])} + } + yyVAL.union = yyLOCAL + case 80: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:915 + { + yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), Rows: yyDollar[3].valuesUnion()} + } + yyVAL.union = yyLOCAL + case 81: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:910 +//line sql.y:921 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } yyVAL.union = yyLOCAL - case 80: + case 82: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:916 +//line sql.y:927 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 81: + case 83: yyDollar = yyS[yypt-10 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:924 + var yyLOCAL TableStatement +//line sql.y:935 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), yyDollar[8].groupByUnion(), NewWhere(HavingClause, yyDollar[9].exprUnion()), yyDollar[10].namedWindowsUnion()) } yyVAL.union = yyLOCAL - case 82: + case 84: yyDollar = yyS[yypt-9 : yypt+1] - var yyLOCAL SelectStatement -//line sql.y:928 + var yyLOCAL TableStatement +//line sql.y:939 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), yyDollar[7].groupByUnion(), NewWhere(HavingClause, yyDollar[8].exprUnion()), yyDollar[9].namedWindowsUnion()) } yyVAL.union = yyLOCAL - case 83: + case 85: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL TableStatement +//line sql.y:943 + { + yyLOCAL = yyDollar[1].tableStmtUnion() + } + yyVAL.union = yyLOCAL + case 86: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:934 +//line sql.y:949 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -10790,10 +10707,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 84: + case 87: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:946 +//line sql.y:961 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -10804,329 +10721,329 @@ yydefault: yyLOCAL = &Insert{Action: yyDollar[1].insertActionUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Ignore: yyDollar[3].ignoreUnion(), Table: getAliasedTableExprFromTableName(yyDollar[4].tableName), Partitions: yyDollar[5].partitionsUnion(), Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[8].updateExprsUnion())} } yyVAL.union = yyLOCAL - case 85: + case 88: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:958 +//line sql.y:973 { yyLOCAL = InsertAct } yyVAL.union = yyLOCAL - case 86: + case 89: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:962 +//line sql.y:977 { yyLOCAL = ReplaceAct } yyVAL.union = yyLOCAL - case 87: + case 90: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:968 +//line sql.y:983 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } yyVAL.union = yyLOCAL - case 88: + case 91: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:974 +//line sql.y:989 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].identifierCS}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } yyVAL.union = yyLOCAL - case 89: + case 92: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:978 +//line sql.y:993 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } yyVAL.union = yyLOCAL - case 90: + case 93: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:982 +//line sql.y:997 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL - case 91: + case 94: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:986 +//line sql.y:1001 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL - case 92: + case 95: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:991 +//line sql.y:1006 { } - case 93: + case 96: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:992 +//line sql.y:1007 { } - case 94: + case 97: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:996 +//line sql.y:1011 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 95: + case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1000 +//line sql.y:1015 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 96: + case 99: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1006 +//line sql.y:1021 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 97: + case 100: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1010 +//line sql.y:1025 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 98: + case 101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1016 +//line sql.y:1031 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL - case 99: + case 102: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1020 +//line sql.y:1035 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) } - case 100: + case 103: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:1025 +//line sql.y:1040 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 101: + case 104: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:1029 +//line sql.y:1044 { yyLOCAL = yyDollar[3].partitionsUnion() } yyVAL.union = yyLOCAL - case 102: + case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:1035 +//line sql.y:1050 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[3].setExprsUnion()) } yyVAL.union = yyLOCAL - case 103: + case 106: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1041 +//line sql.y:1056 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 104: + case 107: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1045 +//line sql.y:1060 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 105: + case 108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1051 +//line sql.y:1066 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 106: + case 109: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1055 +//line sql.y:1070 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 107: + case 110: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1059 +//line sql.y:1074 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 108: + case 111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1063 +//line sql.y:1078 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 109: + case 112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1069 +//line sql.y:1084 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } yyVAL.union = yyLOCAL - case 110: + case 113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1073 +//line sql.y:1088 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 111: + case 114: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:1077 +//line sql.y:1092 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } yyVAL.union = yyLOCAL - case 112: + case 115: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:1083 +//line sql.y:1098 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), UpdateSetExprsScope(yyDollar[5].setExprsUnion(), yyDollar[3].scopeUnion())) } yyVAL.union = yyLOCAL - case 113: + case 116: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:1087 +//line sql.y:1102 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[4].setExprsUnion()) } yyVAL.union = yyLOCAL - case 114: + case 117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1093 +//line sql.y:1108 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 115: + case 118: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1097 +//line sql.y:1112 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 116: + case 119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1103 +//line sql.y:1118 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionIsolationStr, NextTxScope), Expr: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 117: + case 120: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1107 +//line sql.y:1122 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 118: + case 121: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1111 +//line sql.y:1126 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 119: + case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1117 +//line sql.y:1132 { yyVAL.str = RepeatableReadStr } - case 120: + case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1121 +//line sql.y:1136 { yyVAL.str = ReadCommittedStr } - case 121: + case 124: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1125 +//line sql.y:1140 { yyVAL.str = ReadUncommittedStr } - case 122: + case 125: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1129 +//line sql.y:1144 { yyVAL.str = SerializableStr } - case 123: + case 126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1135 +//line sql.y:1150 { yyLOCAL = SessionScope } yyVAL.union = yyLOCAL - case 124: + case 127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1139 +//line sql.y:1154 { yyLOCAL = SessionScope } yyVAL.union = yyLOCAL - case 125: + case 128: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1143 +//line sql.y:1158 { yyLOCAL = GlobalScope } yyVAL.union = yyLOCAL - case 126: + case 129: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1149 +//line sql.y:1164 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true yyLOCAL = yyDollar[1].createTableUnion() } yyVAL.union = yyLOCAL - case 127: + case 130: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1155 +//line sql.y:1170 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -11134,10 +11051,10 @@ yydefault: yyLOCAL = yyDollar[1].createTableUnion() } yyVAL.union = yyLOCAL - case 128: + case 131: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:1162 +//line sql.y:1177 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -11147,413 +11064,413 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 129: + case 132: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:1171 +//line sql.y:1186 { - yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].selStmtUnion(), CheckOption: yyDollar[12].str} + yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].tableStmtUnion(), CheckOption: yyDollar[12].str} } yyVAL.union = yyLOCAL - case 130: + case 133: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1175 +//line sql.y:1190 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].databaseOptionsUnion() yyLOCAL = yyDollar[1].createDatabaseUnion() } yyVAL.union = yyLOCAL - case 131: + case 134: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1182 +//line sql.y:1197 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 132: + case 135: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1186 +//line sql.y:1201 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 133: + case 136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1191 +//line sql.y:1206 { yyVAL.identifierCI = NewIdentifierCI("") } - case 134: + case 137: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1195 +//line sql.y:1210 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 135: + case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1201 +//line sql.y:1216 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 136: + case 139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1206 +//line sql.y:1221 { var v []VindexParam yyLOCAL = v } yyVAL.union = yyLOCAL - case 137: + case 140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1211 +//line sql.y:1226 { yyLOCAL = yyDollar[2].vindexParamsUnion() } yyVAL.union = yyLOCAL - case 138: + case 141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1217 +//line sql.y:1232 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) } yyVAL.union = yyLOCAL - case 139: + case 142: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1222 +//line sql.y:1237 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } - case 140: + case 143: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1228 +//line sql.y:1243 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].identifierCI, Val: yyDollar[3].str} } - case 141: + case 144: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1233 +//line sql.y:1248 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 142: + case 145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1237 +//line sql.y:1252 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } yyVAL.union = yyLOCAL - case 143: + case 146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1243 +//line sql.y:1258 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL - case 144: + case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1247 +//line sql.y:1262 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } - case 145: + case 148: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1253 +//line sql.y:1268 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } - case 146: + case 149: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1259 +//line sql.y:1274 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 147: + case 150: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1266 +//line sql.y:1281 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 148: + case 151: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1273 +//line sql.y:1288 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 149: + case 152: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1278 +//line sql.y:1293 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeFullText}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 150: + case 153: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1283 +//line sql.y:1298 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeSpatial}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 151: + case 154: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1288 +//line sql.y:1303 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeUnique}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 152: + case 155: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1295 +//line sql.y:1310 { yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfNotExists: yyDollar[4].booleanUnion()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 153: + case 156: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1302 +//line sql.y:1317 { yyLOCAL = &AlterDatabase{Comments: Comments(yyDollar[2].strs).Parsed()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL - case 156: + case 159: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1313 +//line sql.y:1328 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() yyLOCAL.PartitionOption = yyDollar[5].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 157: + case 160: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1320 +//line sql.y:1335 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 158: + case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1324 +//line sql.y:1339 { yyLOCAL = yyDollar[1].databaseOptionsUnion() } yyVAL.union = yyLOCAL - case 159: + case 162: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1330 +//line sql.y:1345 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 160: + case 163: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1334 +//line sql.y:1349 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 161: + case 164: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1338 +//line sql.y:1353 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL - case 162: + case 165: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1342 +//line sql.y:1357 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 163: + case 166: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1346 +//line sql.y:1361 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 164: + case 167: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1350 +//line sql.y:1365 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } - case 165: + case 168: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1356 +//line sql.y:1371 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 166: + case 169: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1360 +//line sql.y:1375 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 167: + case 170: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1366 +//line sql.y:1381 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 168: + case 171: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1370 +//line sql.y:1385 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 169: + case 172: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1376 +//line sql.y:1391 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 170: + case 173: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1380 +//line sql.y:1395 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 171: + case 174: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1386 +//line sql.y:1401 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 172: + case 175: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1390 +//line sql.y:1405 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } - case 173: + case 176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1396 +//line sql.y:1411 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 174: + case 177: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1400 +//line sql.y:1415 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 175: + case 178: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1406 +//line sql.y:1421 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 176: + case 179: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1410 +//line sql.y:1425 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) } - case 177: + case 180: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1416 +//line sql.y:1431 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) } yyVAL.union = yyLOCAL - case 178: + case 181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1421 +//line sql.y:1436 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) } yyVAL.union = yyLOCAL - case 179: + case 182: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1426 +//line sql.y:1441 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } - case 180: + case 183: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1430 +//line sql.y:1445 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } - case 181: + case 184: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1435 +//line sql.y:1450 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } - case 182: + case 185: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1439 +//line sql.y:1454 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } - case 183: + case 186: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1443 +//line sql.y:1458 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } - case 184: + case 187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1454 +//line sql.y:1469 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -11563,10 +11480,10 @@ yydefault: yyLOCAL = &ColumnDefinition{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType} } yyVAL.union = yyLOCAL - case 185: + case 188: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1463 +//line sql.y:1478 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -11575,2725 +11492,2725 @@ yydefault: yyLOCAL = &ColumnDefinition{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType} } yyVAL.union = yyLOCAL - case 186: + case 189: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1472 +//line sql.y:1487 { yyVAL.str = "" } - case 187: + case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1476 +//line sql.y:1491 { yyVAL.str = "" } - case 188: + case 191: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1485 +//line sql.y:1500 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: ColKeyNone, Comment: nil, As: nil, Invisible: nil, Format: UnspecifiedFormat, EngineAttribute: nil, SecondaryEngineAttribute: nil} } yyVAL.union = yyLOCAL - case 189: + case 192: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1489 +//line sql.y:1504 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 190: + case 193: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1494 +//line sql.y:1509 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 191: + case 194: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1499 +//line sql.y:1514 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 192: + case 195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1504 +//line sql.y:1519 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyDollar[1].columnTypeOptionsUnion().DefaultLiteral = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 193: + case 196: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1510 +//line sql.y:1525 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 194: + case 197: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1515 +//line sql.y:1530 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 195: + case 198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1520 +//line sql.y:1535 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 196: + case 199: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1525 +//line sql.y:1540 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 197: + case 200: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1530 +//line sql.y:1545 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } - case 198: + case 201: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1534 +//line sql.y:1549 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].identifierCI.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 199: + case 202: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1539 +//line sql.y:1554 { yyDollar[1].columnTypeOptionsUnion().Format = yyDollar[3].columnFormatUnion() } - case 200: + case 203: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1543 +//line sql.y:1558 { yyDollar[1].columnTypeOptionsUnion().SRID = NewIntLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 201: + case 204: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1548 +//line sql.y:1563 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 202: + case 205: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1553 +//line sql.y:1568 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 203: + case 206: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1558 +//line sql.y:1573 { yyDollar[1].columnTypeOptionsUnion().EngineAttribute = NewStrLiteral(yyDollar[4].str) } - case 204: + case 207: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1562 +//line sql.y:1577 { yyDollar[1].columnTypeOptionsUnion().SecondaryEngineAttribute = NewStrLiteral(yyDollar[4].str) } - case 205: + case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1568 +//line sql.y:1583 { yyLOCAL = FixedFormat } yyVAL.union = yyLOCAL - case 206: + case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1572 +//line sql.y:1587 { yyLOCAL = DynamicFormat } yyVAL.union = yyLOCAL - case 207: + case 210: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1576 +//line sql.y:1591 { yyLOCAL = DefaultFormat } yyVAL.union = yyLOCAL - case 208: + case 211: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1582 +//line sql.y:1597 { yyLOCAL = VirtualStorage } yyVAL.union = yyLOCAL - case 209: + case 212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1586 +//line sql.y:1601 { yyLOCAL = StoredStorage } yyVAL.union = yyLOCAL - case 210: + case 213: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1591 +//line sql.y:1606 { yyLOCAL = &ColumnTypeOptions{} } yyVAL.union = yyLOCAL - case 211: + case 214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1595 +//line sql.y:1610 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 212: + case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1600 +//line sql.y:1615 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 213: + case 216: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1605 +//line sql.y:1620 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 214: + case 217: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1610 +//line sql.y:1625 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 215: + case 218: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1615 +//line sql.y:1630 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 216: + case 219: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1620 +//line sql.y:1635 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 217: + case 220: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1625 +//line sql.y:1640 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() } yyVAL.union = yyLOCAL - case 218: + case 221: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1632 +//line sql.y:1647 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 220: + case 223: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1639 +//line sql.y:1654 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_timestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 221: + case 224: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1643 +//line sql.y:1658 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 222: + case 225: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1647 +//line sql.y:1662 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtimestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 223: + case 226: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1651 +//line sql.y:1666 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_timestamp"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 224: + case 227: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1655 +//line sql.y:1670 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("now"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 225: + case 228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1659 +//line sql.y:1674 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("sysdate"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 228: + case 231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1669 +//line sql.y:1684 { yyLOCAL = &NullVal{} } yyVAL.union = yyLOCAL - case 230: + case 233: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1676 +//line sql.y:1691 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 231: + case 234: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1680 +//line sql.y:1695 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 232: + case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1686 +//line sql.y:1701 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 233: + case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1690 +//line sql.y:1705 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 234: + case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1694 +//line sql.y:1709 { yyLOCAL = yyDollar[1].boolValUnion() } yyVAL.union = yyLOCAL - case 235: + case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1698 +//line sql.y:1713 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 236: + case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1702 +//line sql.y:1717 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 237: + case 240: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1706 +//line sql.y:1721 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 238: + case 241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1710 +//line sql.y:1725 { yyLOCAL = NewBitLiteral("0b" + yyDollar[1].str) } yyVAL.union = yyLOCAL - case 239: + case 242: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1714 +//line sql.y:1729 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 240: + case 243: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1718 +//line sql.y:1733 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral("0b" + yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 241: + case 244: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1722 +//line sql.y:1737 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 242: + case 245: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1726 +//line sql.y:1741 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 243: + case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1730 +//line sql.y:1745 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 244: + case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1734 +//line sql.y:1749 { arg := parseBindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: arg} } yyVAL.union = yyLOCAL - case 245: + case 248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1739 +//line sql.y:1754 { yyLOCAL = NewDateLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 246: + case 249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1743 +//line sql.y:1758 { yyLOCAL = NewTimeLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 247: + case 250: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1747 +//line sql.y:1762 { yyLOCAL = NewTimestampLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 248: + case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1753 +//line sql.y:1768 { yyVAL.str = Armscii8Str } - case 249: + case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1757 +//line sql.y:1772 { yyVAL.str = ASCIIStr } - case 250: + case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1761 +//line sql.y:1776 { yyVAL.str = Big5Str } - case 251: + case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1765 +//line sql.y:1780 { yyVAL.str = UBinaryStr } - case 252: + case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1769 +//line sql.y:1784 { yyVAL.str = Cp1250Str } - case 253: + case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1773 +//line sql.y:1788 { yyVAL.str = Cp1251Str } - case 254: + case 257: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1777 +//line sql.y:1792 { yyVAL.str = Cp1256Str } - case 255: + case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1781 +//line sql.y:1796 { yyVAL.str = Cp1257Str } - case 256: + case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1785 +//line sql.y:1800 { yyVAL.str = Cp850Str } - case 257: + case 260: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1789 +//line sql.y:1804 { yyVAL.str = Cp852Str } - case 258: + case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1793 +//line sql.y:1808 { yyVAL.str = Cp866Str } - case 259: + case 262: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1797 +//line sql.y:1812 { yyVAL.str = Cp932Str } - case 260: + case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1801 +//line sql.y:1816 { yyVAL.str = Dec8Str } - case 261: + case 264: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1805 +//line sql.y:1820 { yyVAL.str = EucjpmsStr } - case 262: + case 265: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1809 +//line sql.y:1824 { yyVAL.str = EuckrStr } - case 263: + case 266: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1813 +//line sql.y:1828 { yyVAL.str = Gb18030Str } - case 264: + case 267: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1817 +//line sql.y:1832 { yyVAL.str = Gb2312Str } - case 265: + case 268: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1821 +//line sql.y:1836 { yyVAL.str = GbkStr } - case 266: + case 269: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1825 +//line sql.y:1840 { yyVAL.str = Geostd8Str } - case 267: + case 270: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1829 +//line sql.y:1844 { yyVAL.str = GreekStr } - case 268: + case 271: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1833 +//line sql.y:1848 { yyVAL.str = HebrewStr } - case 269: + case 272: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1837 +//line sql.y:1852 { yyVAL.str = Hp8Str } - case 270: + case 273: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1841 +//line sql.y:1856 { yyVAL.str = Keybcs2Str } - case 271: + case 274: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1845 +//line sql.y:1860 { yyVAL.str = Koi8rStr } - case 272: + case 275: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1849 +//line sql.y:1864 { yyVAL.str = Koi8uStr } - case 273: + case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1853 +//line sql.y:1868 { yyVAL.str = Latin1Str } - case 274: + case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1857 +//line sql.y:1872 { yyVAL.str = Latin2Str } - case 275: + case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1861 +//line sql.y:1876 { yyVAL.str = Latin5Str } - case 276: + case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1865 +//line sql.y:1880 { yyVAL.str = Latin7Str } - case 277: + case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1869 +//line sql.y:1884 { yyVAL.str = MacceStr } - case 278: + case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1873 +//line sql.y:1888 { yyVAL.str = MacromanStr } - case 279: + case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1877 +//line sql.y:1892 { yyVAL.str = SjisStr } - case 280: + case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1881 +//line sql.y:1896 { yyVAL.str = Swe7Str } - case 281: + case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1885 +//line sql.y:1900 { yyVAL.str = Tis620Str } - case 282: + case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1889 +//line sql.y:1904 { yyVAL.str = Ucs2Str } - case 283: + case 286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1893 +//line sql.y:1908 { yyVAL.str = UjisStr } - case 284: + case 287: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1897 +//line sql.y:1912 { yyVAL.str = Utf16Str } - case 285: + case 288: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1901 +//line sql.y:1916 { yyVAL.str = Utf16leStr } - case 286: + case 289: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1905 +//line sql.y:1920 { yyVAL.str = Utf32Str } - case 287: + case 290: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1909 +//line sql.y:1924 { yyVAL.str = Utf8mb3Str } - case 288: + case 291: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1913 +//line sql.y:1928 { yyVAL.str = Utf8mb4Str } - case 289: + case 292: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1917 +//line sql.y:1932 { yyVAL.str = Utf8mb3Str } - case 292: + case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1927 +//line sql.y:1942 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 293: + case 296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1931 +//line sql.y:1946 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 294: + case 297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1935 +//line sql.y:1950 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 295: + case 298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1941 +//line sql.y:1956 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 296: + case 299: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1945 +//line sql.y:1960 { yyLOCAL = AppendString(yyDollar[1].exprUnion(), yyDollar[2].str) } yyVAL.union = yyLOCAL - case 297: + case 300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1951 +//line sql.y:1966 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 298: + case 301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1955 +//line sql.y:1970 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 299: + case 302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1959 +//line sql.y:1974 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 300: + case 303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1965 +//line sql.y:1980 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 301: + case 304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1969 +//line sql.y:1984 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 302: + case 305: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1975 +//line sql.y:1990 { yyLOCAL = ColKeyPrimary } yyVAL.union = yyLOCAL - case 303: + case 306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1979 +//line sql.y:1994 { yyLOCAL = ColKeyUnique } yyVAL.union = yyLOCAL - case 304: + case 307: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1983 +//line sql.y:1998 { yyLOCAL = ColKeyUniqueKey } yyVAL.union = yyLOCAL - case 305: + case 308: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1987 +//line sql.y:2002 { yyLOCAL = ColKey } yyVAL.union = yyLOCAL - case 306: + case 309: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1993 +//line sql.y:2008 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() yyVAL.columnType.Zerofill = yyDollar[3].booleanUnion() } - case 310: + case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2004 +//line sql.y:2019 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].intPtrUnion() } - case 311: + case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2009 +//line sql.y:2024 { yyVAL.columnType = yyDollar[1].columnType } - case 312: + case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2015 +//line sql.y:2030 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 313: + case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2019 +//line sql.y:2034 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 314: + case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2023 +//line sql.y:2038 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 315: + case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2027 +//line sql.y:2042 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 316: + case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2031 +//line sql.y:2046 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 317: + case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2035 +//line sql.y:2050 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 318: + case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2039 +//line sql.y:2054 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 319: + case 322: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2043 +//line sql.y:2058 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 320: + case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2047 +//line sql.y:2062 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 321: + case 324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2053 +//line sql.y:2068 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 322: + case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2059 +//line sql.y:2074 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 323: + case 326: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2065 +//line sql.y:2080 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 324: + case 327: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2071 +//line sql.y:2086 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 325: + case 328: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2077 +//line sql.y:2092 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 326: + case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2083 +//line sql.y:2098 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 327: + case 330: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2089 +//line sql.y:2104 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 328: + case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2097 +//line sql.y:2112 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 329: + case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2101 +//line sql.y:2116 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 330: + case 333: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2105 +//line sql.y:2120 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 331: + case 334: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2109 +//line sql.y:2124 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 332: + case 335: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2113 +//line sql.y:2128 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 333: + case 336: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2119 +//line sql.y:2134 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } - case 334: + case 337: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2123 +//line sql.y:2138 { // CHAR BYTE is an alias for binary. See also: // https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html yyVAL.columnType = &ColumnType{Type: "binary", Length: yyDollar[2].intPtrUnion()} } - case 335: + case 338: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2129 +//line sql.y:2144 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } - case 336: + case 339: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2133 +//line sql.y:2148 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 337: + case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2137 +//line sql.y:2152 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 338: + case 341: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2141 +//line sql.y:2156 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 339: + case 342: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2145 +//line sql.y:2160 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 340: + case 343: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2149 +//line sql.y:2164 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 341: + case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2153 +//line sql.y:2168 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } - case 342: + case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2157 +//line sql.y:2172 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 343: + case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2161 +//line sql.y:2176 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 344: + case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2165 +//line sql.y:2180 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 345: + case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2169 +//line sql.y:2184 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 346: + case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2173 +//line sql.y:2188 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 347: + case 350: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2177 +//line sql.y:2192 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } - case 348: + case 351: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2181 +//line sql.y:2196 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } - case 349: + case 352: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2186 +//line sql.y:2201 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } - case 350: + case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2192 +//line sql.y:2207 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 351: + case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2196 +//line sql.y:2211 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 352: + case 355: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2200 +//line sql.y:2215 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 353: + case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2204 +//line sql.y:2219 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 354: + case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2208 +//line sql.y:2223 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 355: + case 358: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2212 +//line sql.y:2227 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 356: + case 359: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2216 +//line sql.y:2231 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 357: + case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2220 +//line sql.y:2235 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } - case 358: + case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2226 +//line sql.y:2241 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } - case 359: + case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2231 +//line sql.y:2246 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } - case 360: + case 363: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *int -//line sql.y:2236 +//line sql.y:2251 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 361: + case 364: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *int -//line sql.y:2240 +//line sql.y:2255 { yyLOCAL = ptr.Of(convertStringToInt(yyDollar[2].str)) } yyVAL.union = yyLOCAL - case 362: + case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2245 +//line sql.y:2260 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 363: + case 366: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2249 +//line sql.y:2264 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), Scale: ptr.Of(convertStringToInt(yyDollar[4].str)), } } - case 364: + case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2258 +//line sql.y:2273 { yyVAL.LengthScaleOption = yyDollar[1].LengthScaleOption } - case 365: + case 368: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2262 +//line sql.y:2277 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), } } - case 366: + case 369: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2269 +//line sql.y:2284 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 367: + case 370: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2273 +//line sql.y:2288 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), } } - case 368: + case 371: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2279 +//line sql.y:2294 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), Scale: ptr.Of(convertStringToInt(yyDollar[4].str)), } } - case 369: + case 372: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2287 +//line sql.y:2302 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 370: + case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2291 +//line sql.y:2306 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 371: + case 374: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2295 +//line sql.y:2310 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 372: + case 375: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2300 +//line sql.y:2315 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 373: + case 376: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2304 +//line sql.y:2319 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 374: + case 377: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2309 +//line sql.y:2324 { yyVAL.columnCharset = ColumnCharset{} } - case 375: + case 378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2313 +//line sql.y:2328 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].identifierCI.String()), Binary: yyDollar[3].booleanUnion()} } - case 376: + case 379: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2317 +//line sql.y:2332 { yyVAL.columnCharset = ColumnCharset{Name: encodeSQLString(yyDollar[2].str), Binary: yyDollar[3].booleanUnion()} } - case 377: + case 380: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2321 +//line sql.y:2336 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].str)} } - case 378: + case 381: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2325 +//line sql.y:2340 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: yyDollar[2].booleanUnion()} } - case 379: + case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2330 +//line sql.y:2345 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: yyDollar[2].booleanUnion()} } - case 380: + case 383: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2335 +//line sql.y:2350 { // BINARY: Shorthand for default CHARACTER SET but with binary collation yyVAL.columnCharset = ColumnCharset{Name: "", Binary: true} } - case 381: + case 384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2340 +//line sql.y:2355 { // BINARY ASCII: Shorthand for CHARACTER SET latin1 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: true} } - case 382: + case 385: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2345 +//line sql.y:2360 { // BINARY UNICODE: Shorthand for CHARACTER SET ucs2 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: true} } - case 383: + case 386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2351 +//line sql.y:2366 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 384: + case 387: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2355 +//line sql.y:2370 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 385: + case 388: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2360 +//line sql.y:2375 { yyVAL.str = "" } - case 386: + case 389: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2364 +//line sql.y:2379 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 387: + case 390: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2368 +//line sql.y:2383 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 388: + case 391: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2374 +//line sql.y:2389 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } yyVAL.union = yyLOCAL - case 389: + case 392: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2379 +//line sql.y:2394 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 390: + case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2383 +//line sql.y:2398 { yyLOCAL = yyDollar[1].indexOptionsUnion() } yyVAL.union = yyLOCAL - case 391: + case 394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2389 +//line sql.y:2404 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 392: + case 395: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2393 +//line sql.y:2408 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) } - case 393: + case 396: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2399 +//line sql.y:2414 { yyLOCAL = yyDollar[1].indexOptionUnion() } yyVAL.union = yyLOCAL - case 394: + case 397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2403 +//line sql.y:2418 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 395: + case 398: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2408 +//line sql.y:2423 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 396: + case 399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2412 +//line sql.y:2427 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 397: + case 400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2416 +//line sql.y:2431 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 398: + case 401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2420 +//line sql.y:2435 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].identifierCI.String()} } yyVAL.union = yyLOCAL - case 399: + case 402: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2424 +//line sql.y:2439 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 400: + case 403: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2428 +//line sql.y:2443 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 401: + case 404: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2434 +//line sql.y:2449 { yyVAL.str = "" } - case 402: + case 405: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2438 +//line sql.y:2453 { yyVAL.str = string(yyDollar[1].str) } - case 403: + case 406: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2444 +//line sql.y:2459 { yyLOCAL = &IndexInfo{Type: IndexTypePrimary, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI("PRIMARY")} } yyVAL.union = yyLOCAL - case 404: + case 407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2448 +//line sql.y:2463 { yyLOCAL = &IndexInfo{Type: IndexTypeSpatial, Name: NewIdentifierCI(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 405: + case 408: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2452 +//line sql.y:2467 { yyLOCAL = &IndexInfo{Type: IndexTypeFullText, Name: NewIdentifierCI(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 406: + case 409: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2456 +//line sql.y:2471 { yyLOCAL = &IndexInfo{Type: IndexTypeUnique, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 407: + case 410: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2460 +//line sql.y:2475 { yyLOCAL = &IndexInfo{Type: IndexTypeDefault, Name: NewIdentifierCI(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 408: + case 411: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2465 +//line sql.y:2480 { yyVAL.str = "" } - case 409: + case 412: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2469 +//line sql.y:2484 { yyVAL.str = yyDollar[2].str } - case 410: + case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2475 +//line sql.y:2490 { yyVAL.str = string(yyDollar[1].str) } - case 411: + case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2479 +//line sql.y:2494 { yyVAL.str = string(yyDollar[1].str) } - case 412: + case 415: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2483 +//line sql.y:2498 { yyVAL.str = string(yyDollar[1].str) } - case 413: + case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2489 +//line sql.y:2504 { yyVAL.str = string(yyDollar[1].str) } - case 414: + case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2493 +//line sql.y:2508 { yyVAL.str = string(yyDollar[1].str) } - case 415: + case 418: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2498 +//line sql.y:2513 { yyVAL.str = "" } - case 416: + case 419: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2502 +//line sql.y:2517 { yyVAL.str = yyDollar[1].str } - case 417: + case 420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2508 +//line sql.y:2523 { yyVAL.str = string(yyDollar[1].str) } - case 418: + case 421: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2512 +//line sql.y:2527 { yyVAL.str = string(yyDollar[1].str) } - case 419: + case 422: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2517 +//line sql.y:2532 { yyVAL.str = "" } - case 420: + case 423: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2521 +//line sql.y:2536 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } - case 421: + case 424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2527 +//line sql.y:2542 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL - case 422: + case 425: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2531 +//line sql.y:2546 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) } - case 423: + case 426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2537 +//line sql.y:2552 { yyLOCAL = &IndexColumn{Column: yyDollar[1].identifierCI, Length: yyDollar[2].intPtrUnion(), Direction: yyDollar[3].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 424: + case 427: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2541 +//line sql.y:2556 { yyLOCAL = &IndexColumn{Expression: yyDollar[2].exprUnion(), Direction: yyDollar[4].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 425: + case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2547 +//line sql.y:2562 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 426: + case 429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2551 +//line sql.y:2566 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 427: + case 430: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2557 +//line sql.y:2572 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 428: + case 431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2561 +//line sql.y:2576 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } yyVAL.union = yyLOCAL - case 429: + case 432: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2567 +//line sql.y:2582 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewIdentifierCI(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } yyVAL.union = yyLOCAL - case 430: + case 433: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2573 +//line sql.y:2588 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion()} } yyVAL.union = yyLOCAL - case 431: + case 434: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2577 +//line sql.y:2592 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 432: + case 435: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2581 +//line sql.y:2596 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 433: + case 436: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2585 +//line sql.y:2600 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion(), OnUpdate: yyDollar[8].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 434: + case 437: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2589 +//line sql.y:2604 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion(), OnDelete: yyDollar[8].referenceActionUnion()} } yyVAL.union = yyLOCAL - case 435: + case 438: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2594 +//line sql.y:2609 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 436: + case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2598 +//line sql.y:2613 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } yyVAL.union = yyLOCAL - case 437: + case 440: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2604 +//line sql.y:2619 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } yyVAL.union = yyLOCAL - case 438: + case 441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2610 +//line sql.y:2625 { yyLOCAL = yyDollar[2].matchActionUnion() } yyVAL.union = yyLOCAL - case 439: + case 442: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2616 +//line sql.y:2631 { yyLOCAL = Full } yyVAL.union = yyLOCAL - case 440: + case 443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2620 +//line sql.y:2635 { yyLOCAL = Partial } yyVAL.union = yyLOCAL - case 441: + case 444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2624 +//line sql.y:2639 { yyLOCAL = Simple } yyVAL.union = yyLOCAL - case 442: + case 445: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2629 +//line sql.y:2644 { yyLOCAL = DefaultMatch } yyVAL.union = yyLOCAL - case 443: + case 446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2633 +//line sql.y:2648 { yyLOCAL = yyDollar[1].matchActionUnion() } yyVAL.union = yyLOCAL - case 444: + case 447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2639 +//line sql.y:2654 { yyLOCAL = yyDollar[3].referenceActionUnion() } yyVAL.union = yyLOCAL - case 445: + case 448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2645 +//line sql.y:2660 { yyLOCAL = yyDollar[3].referenceActionUnion() } yyVAL.union = yyLOCAL - case 446: + case 449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2651 +//line sql.y:2666 { yyLOCAL = Restrict } yyVAL.union = yyLOCAL - case 447: + case 450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2655 +//line sql.y:2670 { yyLOCAL = Cascade } yyVAL.union = yyLOCAL - case 448: + case 451: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2659 +//line sql.y:2674 { yyLOCAL = NoAction } yyVAL.union = yyLOCAL - case 449: + case 452: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2663 +//line sql.y:2678 { yyLOCAL = SetDefault } yyVAL.union = yyLOCAL - case 450: + case 453: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2667 +//line sql.y:2682 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL - case 451: + case 454: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2672 +//line sql.y:2687 { yyVAL.str = "" } - case 452: + case 455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2676 +//line sql.y:2691 { yyVAL.str = string(yyDollar[1].str) } - case 453: + case 456: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2680 +//line sql.y:2695 { yyVAL.str = string(yyDollar[1].str) } - case 454: + case 457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2686 +//line sql.y:2701 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 455: + case 458: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2690 +//line sql.y:2705 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 456: + case 459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2695 +//line sql.y:2710 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 457: + case 460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2699 +//line sql.y:2714 { yyLOCAL = yyDollar[1].booleanUnion() } yyVAL.union = yyLOCAL - case 458: + case 461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2704 +//line sql.y:2719 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 459: + case 462: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2708 +//line sql.y:2723 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 460: + case 463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2714 +//line sql.y:2729 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 461: + case 464: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2718 +//line sql.y:2733 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } - case 462: + case 465: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2722 +//line sql.y:2737 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) } - case 463: + case 466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2728 +//line sql.y:2743 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 464: + case 467: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2732 +//line sql.y:2747 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) } - case 465: + case 468: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2738 +//line sql.y:2753 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 466: + case 469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2742 +//line sql.y:2757 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 467: + case 470: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2746 +//line sql.y:2761 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 468: + case 471: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2750 +//line sql.y:2765 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } yyVAL.union = yyLOCAL - case 469: + case 472: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2754 +//line sql.y:2769 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } yyVAL.union = yyLOCAL - case 470: + case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2758 +//line sql.y:2773 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 471: + case 474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2762 +//line sql.y:2777 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 472: + case 475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2766 +//line sql.y:2781 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 473: + case 476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2770 +//line sql.y:2785 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 474: + case 477: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2774 +//line sql.y:2789 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 475: + case 478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2778 +//line sql.y:2793 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 476: + case 479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2782 +//line sql.y:2797 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 477: + case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2786 +//line sql.y:2801 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 478: + case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2790 +//line sql.y:2805 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].identifierCS.String(), CaseSensitive: true} } yyVAL.union = yyLOCAL - case 479: + case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2794 +//line sql.y:2809 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 480: + case 483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2798 +//line sql.y:2813 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 481: + case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2802 +//line sql.y:2817 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 482: + case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2806 +//line sql.y:2821 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 483: + case 486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2810 +//line sql.y:2825 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 484: + case 487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2814 +//line sql.y:2829 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 485: + case 488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2818 +//line sql.y:2833 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 486: + case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2822 +//line sql.y:2837 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 487: + case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2826 +//line sql.y:2841 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 488: + case 491: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2830 +//line sql.y:2845 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 489: + case 492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2834 +//line sql.y:2849 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 490: + case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2838 +//line sql.y:2853 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 491: + case 494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2842 +//line sql.y:2857 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 492: + case 495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2846 +//line sql.y:2861 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 493: + case 496: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2850 +//line sql.y:2865 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 494: + case 497: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2854 +//line sql.y:2869 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].identifierCI.String() + yyDollar[4].str), CaseSensitive: true} } yyVAL.union = yyLOCAL - case 495: + case 498: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2858 +//line sql.y:2873 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 496: + case 499: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2863 +//line sql.y:2878 { yyVAL.str = "" } - case 497: + case 500: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2867 +//line sql.y:2882 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 498: + case 501: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2871 +//line sql.y:2886 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 508: + case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2890 +//line sql.y:2905 { yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } - case 509: + case 512: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2894 +//line sql.y:2909 { yyVAL.str = yyDollar[1].identifierCI.String() } - case 510: + case 513: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2898 +//line sql.y:2913 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 511: + case 514: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2902 +//line sql.y:2917 { yyVAL.str = string(yyDollar[1].str) } - case 512: + case 515: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2907 +//line sql.y:2922 { yyVAL.str = "" } - case 514: + case 517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2913 +//line sql.y:2928 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 515: + case 518: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2917 +//line sql.y:2932 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 516: + case 519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2922 +//line sql.y:2937 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 517: + case 520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2926 +//line sql.y:2941 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL - case 518: + case 521: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2931 +//line sql.y:2946 { yyVAL.str = "" } - case 519: + case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2935 +//line sql.y:2950 { yyVAL.str = string(yyDollar[2].str) } - case 520: + case 523: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2940 +//line sql.y:2955 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 521: + case 524: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2944 +//line sql.y:2959 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 522: + case 525: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2948 +//line sql.y:2963 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 523: + case 526: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2953 +//line sql.y:2968 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 524: + case 527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2957 +//line sql.y:2972 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 525: + case 528: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2961 +//line sql.y:2976 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) } - case 526: + case 529: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2965 +//line sql.y:2980 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL - case 527: + case 530: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2969 +//line sql.y:2984 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) } - case 528: + case 531: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2973 +//line sql.y:2988 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } yyVAL.union = yyLOCAL - case 529: + case 532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2979 +//line sql.y:2994 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 530: + case 533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2983 +//line sql.y:2998 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 531: + case 534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2987 +//line sql.y:3002 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 532: + case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2993 +//line sql.y:3008 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 533: + case 536: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2997 +//line sql.y:3012 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL - case 534: + case 537: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3001 +//line sql.y:3016 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } yyVAL.union = yyLOCAL - case 535: + case 538: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3005 +//line sql.y:3020 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } yyVAL.union = yyLOCAL - case 536: + case 539: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3009 +//line sql.y:3024 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 537: + case 540: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3013 +//line sql.y:3028 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 538: + case 541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3017 +//line sql.y:3032 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } yyVAL.union = yyLOCAL - case 539: + case 542: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3021 +//line sql.y:3036 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion(), DefaultLiteral: true} } yyVAL.union = yyLOCAL - case 540: + case 543: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3025 +//line sql.y:3040 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 541: + case 544: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3029 +//line sql.y:3044 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(false)} } yyVAL.union = yyLOCAL - case 542: + case 545: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3033 +//line sql.y:3048 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(true)} } yyVAL.union = yyLOCAL - case 543: + case 546: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3037 +//line sql.y:3052 { yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 544: + case 547: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3041 +//line sql.y:3056 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } yyVAL.union = yyLOCAL - case 545: + case 548: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3045 +//line sql.y:3060 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } yyVAL.union = yyLOCAL - case 546: + case 549: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3049 +//line sql.y:3064 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } yyVAL.union = yyLOCAL - case 547: + case 550: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3053 +//line sql.y:3068 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 548: + case 551: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3057 +//line sql.y:3072 { yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } yyVAL.union = yyLOCAL - case 549: + case 552: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3061 +//line sql.y:3076 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 550: + case 553: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3065 +//line sql.y:3080 { yyLOCAL = &KeyState{Enable: false} } yyVAL.union = yyLOCAL - case 551: + case 554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3069 +//line sql.y:3084 { yyLOCAL = &KeyState{Enable: true} } yyVAL.union = yyLOCAL - case 552: + case 555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3073 +//line sql.y:3088 { yyLOCAL = &TablespaceOperation{Import: false} } yyVAL.union = yyLOCAL - case 553: + case 556: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3077 +//line sql.y:3092 { yyLOCAL = &TablespaceOperation{Import: true} } yyVAL.union = yyLOCAL - case 554: + case 557: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3081 +//line sql.y:3096 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 555: + case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3085 +//line sql.y:3100 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 556: + case 559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3089 +//line sql.y:3104 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } yyVAL.union = yyLOCAL - case 557: + case 560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3093 +//line sql.y:3108 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 558: + case 561: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3097 +//line sql.y:3112 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 559: + case 562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3101 +//line sql.y:3116 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 560: + case 563: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3105 +//line sql.y:3120 { yyLOCAL = &Force{} } yyVAL.union = yyLOCAL - case 561: + case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3109 +//line sql.y:3124 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 562: + case 565: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3113 +//line sql.y:3128 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 563: + case 566: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:3119 +//line sql.y:3134 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 564: + case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3123 +//line sql.y:3138 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } - case 565: + case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3129 +//line sql.y:3144 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 566: + case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3133 +//line sql.y:3148 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 567: + case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3137 +//line sql.y:3152 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 568: + case 571: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3141 +//line sql.y:3156 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 569: + case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3145 +//line sql.y:3160 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 570: + case 573: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3149 +//line sql.y:3164 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 571: + case 574: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3153 +//line sql.y:3168 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 572: + case 575: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3157 +//line sql.y:3172 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 573: + case 576: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3161 +//line sql.y:3176 { yyLOCAL = &Validation{With: true} } yyVAL.union = yyLOCAL - case 574: + case 577: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3165 +//line sql.y:3180 { yyLOCAL = &Validation{With: false} } yyVAL.union = yyLOCAL - case 575: + case 578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3171 +//line sql.y:3186 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14301,10 +14218,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 576: + case 579: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3178 +//line sql.y:3193 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14312,10 +14229,10 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 577: + case 580: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3185 +//line sql.y:3200 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14323,28 +14240,28 @@ yydefault: yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 578: + case 581: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3192 +//line sql.y:3207 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() yyLOCAL = yyDollar[1].alterTableUnion() } yyVAL.union = yyLOCAL - case 579: + case 582: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3198 +//line sql.y:3213 { - yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} + yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].tableStmtUnion(), CheckOption: yyDollar[11].str} } yyVAL.union = yyLOCAL - case 580: + case 583: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3208 +//line sql.y:3223 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14352,10 +14269,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 581: + case 584: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3215 +//line sql.y:3230 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14363,10 +14280,10 @@ yydefault: yyLOCAL = yyDollar[1].alterDatabaseUnion() } yyVAL.union = yyLOCAL - case 582: + case 585: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3222 +//line sql.y:3237 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -14379,10 +14296,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 583: + case 586: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3234 +//line sql.y:3249 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -14393,26 +14310,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 584: + case 587: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3244 +//line sql.y:3259 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 585: + case 588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3248 +//line sql.y:3263 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 586: + case 589: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3252 +//line sql.y:3267 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -14426,10 +14343,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 587: + case 590: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3265 +//line sql.y:3280 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -14440,26 +14357,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: + case 591: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3275 +//line sql.y:3290 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 589: + case 592: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3279 +//line sql.y:3294 { yyLOCAL = &AlterVschema{Action: DropSequenceDDLAction, Table: yyDollar[6].tableName} } yyVAL.union = yyLOCAL - case 590: + case 593: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3283 +//line sql.y:3298 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -14471,10 +14388,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 591: + case 594: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3294 +//line sql.y:3309 { yyLOCAL = &AlterVschema{ Action: DropAutoIncDDLAction, @@ -14482,10 +14399,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 592: + case 595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3301 +//line sql.y:3316 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -14493,10 +14410,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 593: + case 596: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3308 +//line sql.y:3323 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -14504,20 +14421,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 594: + case 597: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3315 +//line sql.y:3330 { yyLOCAL = &AlterMigration{ Type: CleanupAllMigrationType, } } yyVAL.union = yyLOCAL - case 595: + case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3321 +//line sql.y:3336 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14525,10 +14442,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 596: + case 599: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3328 +//line sql.y:3343 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14537,20 +14454,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 597: + case 600: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3336 +//line sql.y:3351 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 598: + case 601: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3342 +//line sql.y:3357 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -14558,20 +14475,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 599: + case 602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3349 +//line sql.y:3364 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 600: + case 603: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3355 +//line sql.y:3370 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -14579,20 +14496,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 601: + case 604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3362 +//line sql.y:3377 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 602: + case 605: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3368 +//line sql.y:3383 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -14602,10 +14519,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 603: + case 606: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3377 +//line sql.y:3392 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -14614,10 +14531,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 604: + case 607: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3385 +//line sql.y:3400 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -14625,20 +14542,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 605: + case 608: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3392 +//line sql.y:3407 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 606: + case 609: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3398 +//line sql.y:3413 { yyLOCAL = &AlterMigration{ Type: ForceCutOverMigrationType, @@ -14646,20 +14563,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 607: + case 610: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3405 +//line sql.y:3420 { yyLOCAL = &AlterMigration{ Type: ForceCutOverAllMigrationType, } } yyVAL.union = yyLOCAL - case 608: + case 611: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3411 +//line sql.y:3426 { yyLOCAL = &AlterMigration{ Type: SetCutOverThresholdMigrationType, @@ -14668,18 +14585,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 609: + case 612: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3420 +//line sql.y:3435 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 610: + case 613: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3424 +//line sql.y:3439 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -14687,10 +14604,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 611: + case 614: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3433 +//line sql.y:3448 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14699,10 +14616,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 612: + case 615: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3441 +//line sql.y:3456 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14712,10 +14629,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 613: + case 616: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3450 +//line sql.y:3465 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14723,10 +14640,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 614: + case 617: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3457 +//line sql.y:3472 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14734,18 +14651,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 615: + case 618: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3465 +//line sql.y:3480 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 616: + case 619: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3469 +//line sql.y:3484 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14755,10 +14672,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 617: + case 620: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3478 +//line sql.y:3493 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14769,678 +14686,678 @@ yydefault: } } yyVAL.union = yyLOCAL - case 618: + case 621: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3489 +//line sql.y:3504 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 619: + case 622: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3493 +//line sql.y:3508 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 620: + case 623: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3498 +//line sql.y:3513 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 621: + case 624: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3502 +//line sql.y:3517 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 622: + case 625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3507 +//line sql.y:3522 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 623: + case 626: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3511 +//line sql.y:3526 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 624: + case 627: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3517 +//line sql.y:3532 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 625: + case 628: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3523 +//line sql.y:3538 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 626: + case 629: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3529 +//line sql.y:3544 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 627: + case 630: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3533 +//line sql.y:3548 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 628: + case 631: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3539 +//line sql.y:3554 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 629: + case 632: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3543 +//line sql.y:3558 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 630: + case 633: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3549 +//line sql.y:3564 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 631: + case 634: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3555 +//line sql.y:3570 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 632: + case 635: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3561 +//line sql.y:3576 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 633: + case 636: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3567 +//line sql.y:3582 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 634: + case 637: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3573 +//line sql.y:3588 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 635: + case 638: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3577 +//line sql.y:3592 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 636: + case 639: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3581 +//line sql.y:3596 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 637: + case 640: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3585 +//line sql.y:3600 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 638: + case 641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3591 +//line sql.y:3606 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 639: + case 642: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3597 +//line sql.y:3612 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 640: + case 643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3603 +//line sql.y:3618 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 641: + case 644: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3607 +//line sql.y:3622 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 642: + case 645: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3611 +//line sql.y:3626 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 643: + case 646: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3617 +//line sql.y:3632 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 644: + case 647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3621 +//line sql.y:3636 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 645: + case 648: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3626 +//line sql.y:3641 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 646: + case 649: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3630 +//line sql.y:3645 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 647: + case 650: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3635 +//line sql.y:3650 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 648: + case 651: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3639 +//line sql.y:3654 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 649: + case 652: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3645 +//line sql.y:3660 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL - case 650: + case 653: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3649 +//line sql.y:3664 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 651: + case 654: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3653 +//line sql.y:3668 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL - case 652: + case 655: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3657 +//line sql.y:3672 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 653: + case 656: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3661 +//line sql.y:3676 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL - case 654: + case 657: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3665 +//line sql.y:3680 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 655: + case 658: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3669 +//line sql.y:3684 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL - case 656: + case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3673 +//line sql.y:3688 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 657: + case 660: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3677 +//line sql.y:3692 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL - case 658: + case 661: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3681 +//line sql.y:3696 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 659: + case 662: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3685 +//line sql.y:3700 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } yyVAL.union = yyLOCAL - case 660: + case 663: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3689 +//line sql.y:3704 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 661: + case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3693 +//line sql.y:3708 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 662: + case 665: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3697 +//line sql.y:3712 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 663: + case 666: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3701 +//line sql.y:3716 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL - case 664: + case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3705 +//line sql.y:3720 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 665: + case 668: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3709 +//line sql.y:3724 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 666: + case 669: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3713 +//line sql.y:3728 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 667: + case 670: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3717 +//line sql.y:3732 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL - case 668: + case 671: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3721 +//line sql.y:3736 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 669: + case 672: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3725 +//line sql.y:3740 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL - case 670: + case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3729 +//line sql.y:3744 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL - case 671: + case 674: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3734 +//line sql.y:3749 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 672: + case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3738 +//line sql.y:3753 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 673: + case 676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3742 +//line sql.y:3757 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 674: + case 677: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3748 +//line sql.y:3763 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 675: + case 678: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3752 +//line sql.y:3767 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 676: + case 679: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3758 +//line sql.y:3773 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 677: + case 680: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3763 +//line sql.y:3778 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 678: + case 681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3767 +//line sql.y:3782 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 679: + case 682: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3772 +//line sql.y:3787 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 680: + case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3777 +//line sql.y:3792 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 681: + case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3782 +//line sql.y:3797 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 682: + case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3787 +//line sql.y:3802 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 683: + case 686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3792 +//line sql.y:3807 { yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 684: + case 687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3797 +//line sql.y:3812 { yyDollar[1].partitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 685: + case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3802 +//line sql.y:3817 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 686: + case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3807 +//line sql.y:3822 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 687: + case 690: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3813 +//line sql.y:3828 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 688: + case 691: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3819 +//line sql.y:3834 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 689: + case 692: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3823 +//line sql.y:3838 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 690: + case 693: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3829 +//line sql.y:3844 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 691: + case 694: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3834 +//line sql.y:3849 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 692: + case 695: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3838 +//line sql.y:3853 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 693: + case 696: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3843 +//line sql.y:3858 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 694: + case 697: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3848 +//line sql.y:3863 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 695: + case 698: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3853 +//line sql.y:3868 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 696: + case 699: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3858 +//line sql.y:3873 { yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 697: + case 700: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3863 +//line sql.y:3878 { yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 698: + case 701: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3868 +//line sql.y:3883 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 699: + case 702: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3875 +//line sql.y:3890 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15448,10 +15365,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 700: + case 703: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3882 +//line sql.y:3897 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15459,10 +15376,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 701: + case 704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3889 +//line sql.y:3904 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -15470,131 +15387,131 @@ yydefault: } } yyVAL.union = yyLOCAL - case 702: + case 705: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3897 +//line sql.y:3912 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 703: + case 706: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3901 +//line sql.y:3916 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 704: + case 707: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3907 +//line sql.y:3922 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 705: + case 708: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3913 +//line sql.y:3928 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 706: + case 709: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3919 +//line sql.y:3934 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 707: + case 710: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3925 +//line sql.y:3940 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 708: + case 711: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3931 +//line sql.y:3946 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 709: + case 712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3937 +//line sql.y:3952 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 710: + case 713: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3943 +//line sql.y:3958 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 711: + case 714: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3949 +//line sql.y:3964 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 712: + case 715: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3955 +//line sql.y:3970 { yyVAL.str = "" } - case 713: + case 716: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3959 +//line sql.y:3974 { yyVAL.str = "" } - case 714: + case 717: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3965 +//line sql.y:3980 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 715: + case 718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3971 +//line sql.y:3986 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 716: + case 719: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3975 +//line sql.y:3990 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 717: + case 720: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3981 +//line sql.y:3996 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 718: + case 721: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3985 +//line sql.y:4000 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -15604,1377 +15521,1377 @@ yydefault: } } yyVAL.union = yyLOCAL - case 719: + case 722: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3994 +//line sql.y:4009 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 720: + case 723: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3998 +//line sql.y:4013 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 721: + case 724: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4004 +//line sql.y:4019 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 722: + case 725: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4008 +//line sql.y:4023 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 723: + case 726: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4014 +//line sql.y:4029 { yyLOCAL = &Analyze{IsLocal: yyDollar[2].booleanUnion(), Table: yyDollar[4].tableName} } yyVAL.union = yyLOCAL - case 724: + case 727: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4020 +//line sql.y:4035 { yyLOCAL = &PurgeBinaryLogs{To: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 725: + case 728: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4024 +//line sql.y:4039 { yyLOCAL = &PurgeBinaryLogs{Before: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 726: + case 729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4030 +//line sql.y:4045 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 727: + case 730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4034 +//line sql.y:4049 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 728: + case 731: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4038 +//line sql.y:4053 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 729: + case 732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4042 +//line sql.y:4057 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 730: + case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4046 +//line sql.y:4061 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 731: + case 734: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4050 +//line sql.y:4065 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 732: + case 735: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4054 +//line sql.y:4069 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 733: + case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4058 +//line sql.y:4073 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 734: + case 737: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4062 +//line sql.y:4077 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 735: + case 738: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4066 +//line sql.y:4081 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 736: + case 739: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4070 +//line sql.y:4085 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL - case 737: + case 740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4074 +//line sql.y:4089 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 738: + case 741: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4078 +//line sql.y:4093 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 739: + case 742: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4082 +//line sql.y:4097 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 740: + case 743: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4086 +//line sql.y:4101 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 741: + case 744: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4090 +//line sql.y:4105 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 742: + case 745: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4094 +//line sql.y:4109 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 743: + case 746: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4098 +//line sql.y:4113 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 744: + case 747: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4102 +//line sql.y:4117 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 745: + case 748: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4106 +//line sql.y:4121 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 746: + case 749: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4110 +//line sql.y:4125 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 747: + case 750: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4114 +//line sql.y:4129 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 748: + case 751: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4118 +//line sql.y:4133 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 749: + case 752: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4122 +//line sql.y:4137 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 750: + case 753: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4126 +//line sql.y:4141 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 751: + case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4130 +//line sql.y:4145 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 752: + case 755: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4134 +//line sql.y:4149 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL - case 753: + case 756: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4138 +//line sql.y:4153 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL - case 754: + case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4142 +//line sql.y:4157 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 755: + case 758: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4146 +//line sql.y:4161 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 756: + case 759: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4150 +//line sql.y:4165 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 757: + case 760: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4154 +//line sql.y:4169 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 758: + case 761: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4158 +//line sql.y:4173 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 759: + case 762: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4162 +//line sql.y:4177 { yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL - case 760: + case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4166 +//line sql.y:4181 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 761: + case 764: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4170 +//line sql.y:4185 { yyLOCAL = &ShowThrottlerStatus{} } yyVAL.union = yyLOCAL - case 762: + case 765: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4174 +//line sql.y:4189 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL - case 763: + case 766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4178 +//line sql.y:4193 { yyLOCAL = &Show{&ShowBasic{Command: VschemaKeyspaces}} } yyVAL.union = yyLOCAL - case 764: + case 767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4182 +//line sql.y:4197 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL - case 765: + case 768: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4186 +//line sql.y:4201 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL - case 766: + case 769: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4190 +//line sql.y:4205 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL - case 767: + case 770: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4194 +//line sql.y:4209 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 768: + case 771: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4198 +//line sql.y:4213 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 769: + case 772: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4202 +//line sql.y:4217 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL - case 770: + case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4209 +//line sql.y:4224 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL - case 771: + case 774: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4213 +//line sql.y:4228 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 772: + case 775: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4217 +//line sql.y:4232 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL - case 773: + case 776: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4221 +//line sql.y:4236 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 774: + case 777: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4225 +//line sql.y:4240 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 775: + case 778: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4229 +//line sql.y:4244 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 776: + case 779: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4233 +//line sql.y:4248 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 777: + case 780: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4237 +//line sql.y:4252 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 778: + case 781: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4241 +//line sql.y:4256 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 779: + case 782: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4245 +//line sql.y:4260 { yyLOCAL = &Show{&ShowTransactionStatus{TransactionID: string(yyDollar[5].str)}} } yyVAL.union = yyLOCAL - case 780: + case 783: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4249 +//line sql.y:4264 { yyLOCAL = &Show{&ShowTransactionStatus{}} } yyVAL.union = yyLOCAL - case 781: + case 784: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4253 +//line sql.y:4268 { yyLOCAL = &Show{&ShowTransactionStatus{Keyspace: yyDollar[5].identifierCS.String()}} } yyVAL.union = yyLOCAL - case 782: + case 785: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4258 +//line sql.y:4273 { } - case 783: + case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4260 +//line sql.y:4275 { } - case 784: + case 787: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4264 +//line sql.y:4279 { yyVAL.str = "" } - case 785: + case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4268 +//line sql.y:4283 { yyVAL.str = "extended " } - case 786: + case 789: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4274 +//line sql.y:4289 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 787: + case 790: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4278 +//line sql.y:4293 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 788: + case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4284 +//line sql.y:4299 { yyVAL.str = string(yyDollar[1].str) } - case 789: + case 792: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4288 +//line sql.y:4303 { yyVAL.str = string(yyDollar[1].str) } - case 790: + case 793: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4294 +//line sql.y:4309 { yyVAL.identifierCS = NewIdentifierCS("") } - case 791: + case 794: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4298 +//line sql.y:4313 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 792: + case 795: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4302 +//line sql.y:4317 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 793: + case 796: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4308 +//line sql.y:4323 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 794: + case 797: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4312 +//line sql.y:4327 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 795: + case 798: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4316 +//line sql.y:4331 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 796: + case 799: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4322 +//line sql.y:4337 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 797: + case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4326 +//line sql.y:4341 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 798: + case 801: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4332 +//line sql.y:4347 { yyVAL.empty = struct{}{} } - case 799: + case 802: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4336 +//line sql.y:4351 { yyVAL.empty = struct{}{} } - case 800: + case 803: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4340 +//line sql.y:4355 { yyVAL.empty = struct{}{} } - case 801: + case 804: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4346 +//line sql.y:4361 { yyVAL.str = string(yyDollar[1].str) } - case 802: + case 805: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4350 +//line sql.y:4365 { yyVAL.str = string(yyDollar[1].str) } - case 803: + case 806: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4356 +//line sql.y:4371 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 804: + case 807: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4360 +//line sql.y:4375 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 805: + case 808: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4364 +//line sql.y:4379 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 806: + case 809: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4371 +//line sql.y:4386 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 807: + case 810: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4375 +//line sql.y:4390 { yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } - case 808: + case 811: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4379 +//line sql.y:4394 { yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } - case 809: + case 812: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4383 +//line sql.y:4398 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 810: + case 813: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4390 +//line sql.y:4405 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 811: + case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4394 +//line sql.y:4409 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } yyVAL.union = yyLOCAL - case 812: + case 815: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4399 +//line sql.y:4414 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 813: + case 816: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4403 +//line sql.y:4418 { yyLOCAL = yyDollar[1].txAccessModesUnion() } yyVAL.union = yyLOCAL - case 814: + case 817: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4409 +//line sql.y:4424 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL - case 815: + case 818: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4413 +//line sql.y:4428 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) } - case 816: + case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4419 +//line sql.y:4434 { yyLOCAL = WithConsistentSnapshot } yyVAL.union = yyLOCAL - case 817: + case 820: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4423 +//line sql.y:4438 { yyLOCAL = ReadWrite } yyVAL.union = yyLOCAL - case 818: + case 821: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4427 +//line sql.y:4442 { yyLOCAL = ReadOnly } yyVAL.union = yyLOCAL - case 819: + case 822: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4434 +//line sql.y:4449 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 820: + case 823: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4440 +//line sql.y:4455 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 821: + case 824: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4444 +//line sql.y:4459 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 822: + case 825: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4449 +//line sql.y:4464 { yyVAL.empty = struct{}{} } - case 823: + case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4451 +//line sql.y:4466 { yyVAL.empty = struct{}{} } - case 824: + case 827: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4454 +//line sql.y:4469 { yyVAL.empty = struct{}{} } - case 825: + case 828: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4456 +//line sql.y:4471 { yyVAL.empty = struct{}{} } - case 826: + case 829: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4460 +//line sql.y:4475 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 827: + case 830: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4466 +//line sql.y:4481 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 828: + case 831: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4471 +//line sql.y:4486 { yyLOCAL = EmptyType } yyVAL.union = yyLOCAL - case 829: + case 832: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4475 +//line sql.y:4490 { yyLOCAL = JSONType } yyVAL.union = yyLOCAL - case 830: + case 833: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4479 +//line sql.y:4494 { yyLOCAL = TreeType } yyVAL.union = yyLOCAL - case 831: + case 834: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4483 +//line sql.y:4498 { yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL - case 832: + case 835: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4487 +//line sql.y:4502 { yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL - case 833: + case 836: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4492 +//line sql.y:4507 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 834: + case 837: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4496 +//line sql.y:4511 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 835: + case 838: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4500 +//line sql.y:4515 { yyLOCAL = AllVExplainType } yyVAL.union = yyLOCAL - case 836: + case 839: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4504 +//line sql.y:4519 { yyLOCAL = QueriesVExplainType } yyVAL.union = yyLOCAL - case 837: + case 840: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4508 +//line sql.y:4523 { yyLOCAL = TraceVExplainType } yyVAL.union = yyLOCAL - case 838: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4512 +//line sql.y:4527 { yyLOCAL = KeysVExplainType } yyVAL.union = yyLOCAL - case 839: + case 842: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4518 +//line sql.y:4533 { yyVAL.str = yyDollar[1].str } - case 840: + case 843: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4522 +//line sql.y:4537 { yyVAL.str = yyDollar[1].str } - case 841: + case 844: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4526 +//line sql.y:4541 { yyVAL.str = yyDollar[1].str } - case 842: + case 845: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4532 +//line sql.y:4547 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL - case 843: + case 846: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4536 +//line sql.y:4551 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 844: + case 847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4540 +//line sql.y:4555 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 845: + case 848: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4544 +//line sql.y:4559 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 846: + case 849: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4549 +//line sql.y:4564 { yyVAL.str = "" } - case 847: + case 850: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4553 +//line sql.y:4568 { yyVAL.str = yyDollar[1].identifierCI.val } - case 848: + case 851: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4557 +//line sql.y:4572 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 849: + case 852: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4563 +//line sql.y:4578 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 850: + case 853: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4567 +//line sql.y:4582 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 851: + case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4573 +//line sql.y:4588 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 852: + case 855: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4579 +//line sql.y:4594 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 853: + case 856: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4583 +//line sql.y:4598 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 854: + case 857: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4589 +//line sql.y:4604 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 855: + case 858: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4595 +//line sql.y:4610 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 856: + case 859: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4599 +//line sql.y:4614 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 857: + case 860: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4605 +//line sql.y:4620 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 858: + case 861: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4611 +//line sql.y:4626 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 859: + case 862: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4615 +//line sql.y:4630 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 860: + case 863: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4619 +//line sql.y:4634 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 861: + case 864: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4623 +//line sql.y:4638 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 862: + case 865: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4629 +//line sql.y:4644 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 863: + case 866: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4635 +//line sql.y:4650 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 864: + case 867: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4641 +//line sql.y:4656 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 865: + case 868: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4645 +//line sql.y:4660 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 866: + case 869: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4649 +//line sql.y:4664 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 867: + case 870: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4653 +//line sql.y:4668 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 868: + case 871: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4657 +//line sql.y:4672 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 869: + case 872: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4661 +//line sql.y:4676 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 870: + case 873: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4667 +//line sql.y:4682 { yyVAL.strs = []string{yyDollar[1].str} } - case 871: + case 874: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4671 +//line sql.y:4686 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 872: + case 875: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4677 +//line sql.y:4692 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 873: + case 876: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4681 +//line sql.y:4696 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 874: + case 877: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4685 +//line sql.y:4700 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 875: + case 878: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4689 +//line sql.y:4704 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 876: + case 879: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4693 +//line sql.y:4708 { yyVAL.str = string(yyDollar[1].str) } - case 877: + case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4697 +//line sql.y:4712 { yyVAL.str = string(yyDollar[1].str) } - case 878: + case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4701 +//line sql.y:4716 { yyVAL.str = string(yyDollar[1].str) } - case 879: + case 882: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4705 +//line sql.y:4720 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } - case 880: + case 883: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4709 +//line sql.y:4724 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 881: + case 884: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4713 +//line sql.y:4728 { yyVAL.str = string(yyDollar[1].str) } - case 882: + case 885: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4717 +//line sql.y:4732 { yyVAL.str = string(yyDollar[1].str) } - case 883: + case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4721 +//line sql.y:4736 { yyVAL.str = string(yyDollar[1].str) } - case 884: + case 887: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4726 +//line sql.y:4741 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 885: + case 888: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4730 +//line sql.y:4745 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 886: + case 889: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4734 +//line sql.y:4749 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 887: + case 890: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4739 +//line sql.y:4754 { yyVAL.str = "" } - case 888: + case 891: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4743 +//line sql.y:4758 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 889: + case 892: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4748 +//line sql.y:4763 { setAllowComments(yylex, true) } - case 890: + case 893: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4752 +//line sql.y:4767 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 891: + case 894: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4758 +//line sql.y:4773 { yyVAL.strs = nil } - case 892: + case 895: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4762 +//line sql.y:4777 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 893: + case 896: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4768 +//line sql.y:4783 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 894: + case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4772 +//line sql.y:4787 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 895: + case 898: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4776 +//line sql.y:4791 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 896: + case 899: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4781 +//line sql.y:4796 { yyVAL.str = "" } - case 897: + case 900: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4785 +//line sql.y:4800 { yyVAL.str = SQLNoCacheStr } - case 898: + case 901: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4789 +//line sql.y:4804 { yyVAL.str = SQLCacheStr } - case 899: + case 902: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4794 +//line sql.y:4809 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 900: + case 903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4798 +//line sql.y:4813 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 901: + case 904: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4802 +//line sql.y:4817 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 902: + case 905: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4808 +//line sql.y:4823 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 903: + case 906: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4812 +//line sql.y:4827 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -16983,597 +16900,597 @@ yydefault: } } yyVAL.union = yyLOCAL - case 904: + case 907: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4822 +//line sql.y:4837 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 905: + case 908: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4827 +//line sql.y:4842 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 906: + case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4831 +//line sql.y:4846 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 907: + case 910: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4837 +//line sql.y:4852 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 908: + case 911: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4841 +//line sql.y:4856 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 909: + case 912: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4846 +//line sql.y:4861 { yyVAL.strs = nil } - case 910: + case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4850 +//line sql.y:4865 { yyVAL.strs = yyDollar[1].strs } - case 911: + case 914: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4856 +//line sql.y:4871 { yyVAL.strs = []string{yyDollar[1].str} } - case 912: + case 915: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4860 +//line sql.y:4875 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 913: + case 916: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4866 +//line sql.y:4881 { yyVAL.str = SQLNoCacheStr } - case 914: + case 917: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4870 +//line sql.y:4885 { yyVAL.str = SQLCacheStr } - case 915: + case 918: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4874 +//line sql.y:4889 { yyVAL.str = DistinctStr } - case 916: + case 919: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4878 +//line sql.y:4893 { yyVAL.str = DistinctStr } - case 917: + case 920: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4882 +//line sql.y:4897 { yyVAL.str = HighPriorityStr } - case 918: + case 921: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4886 +//line sql.y:4901 { yyVAL.str = StraightJoinHint } - case 919: + case 922: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4890 +//line sql.y:4905 { yyVAL.str = SQLBufferResultStr } - case 920: + case 923: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4894 +//line sql.y:4909 { yyVAL.str = SQLSmallResultStr } - case 921: + case 924: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4898 +//line sql.y:4913 { yyVAL.str = SQLBigResultStr } - case 922: + case 925: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4902 +//line sql.y:4917 { yyVAL.str = SQLCalcFoundRowsStr } - case 923: + case 926: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4906 +//line sql.y:4921 { yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway } - case 924: + case 927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4912 +//line sql.y:4927 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 925: + case 928: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4916 +//line sql.y:4931 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 926: + case 929: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4922 +//line sql.y:4937 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 927: + case 930: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4926 +//line sql.y:4941 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 928: + case 931: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4930 +//line sql.y:4945 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 929: + case 932: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4934 +//line sql.y:4949 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 930: + case 933: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4939 +//line sql.y:4954 { yyVAL.identifierCI = IdentifierCI{} } - case 931: + case 934: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4943 +//line sql.y:4958 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 932: + case 935: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4947 +//line sql.y:4962 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 934: + case 937: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4954 +//line sql.y:4969 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 935: + case 938: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4959 +//line sql.y:4974 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 936: + case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4963 +//line sql.y:4978 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 937: + case 940: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4969 +//line sql.y:4984 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 938: + case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4975 +//line sql.y:4990 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 939: + case 942: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4979 +//line sql.y:4994 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 942: + case 945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4989 +//line sql.y:5004 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 943: + case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4993 +//line sql.y:5008 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 944: + case 947: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4997 +//line sql.y:5012 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 945: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5001 +//line sql.y:5016 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 946: + case 949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5007 +//line sql.y:5022 { - yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} + yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 947: + case 950: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5011 +//line sql.y:5026 { - yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} + yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 948: + case 951: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5017 +//line sql.y:5032 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 949: + case 952: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5021 +//line sql.y:5036 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 950: + case 953: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5026 +//line sql.y:5041 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 951: + case 954: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:5030 +//line sql.y:5045 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 952: + case 955: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5035 +//line sql.y:5050 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 953: + case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5039 +//line sql.y:5054 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 954: + case 957: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5045 +//line sql.y:5060 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 955: + case 958: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5049 +//line sql.y:5064 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 956: + case 959: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:5055 +//line sql.y:5070 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 957: + case 960: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5059 +//line sql.y:5074 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 958: + case 961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5065 +//line sql.y:5080 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 959: + case 962: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5069 +//line sql.y:5084 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 960: + case 963: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5073 +//line sql.y:5088 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 961: + case 964: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5077 +//line sql.y:5092 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 962: + case 965: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:5083 +//line sql.y:5098 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 963: + case 966: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5087 +//line sql.y:5102 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 964: + case 967: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5100 +//line sql.y:5115 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 965: + case 968: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5104 +//line sql.y:5119 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 966: + case 969: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5108 +//line sql.y:5123 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 967: + case 970: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5112 +//line sql.y:5127 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 968: + case 971: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5118 +//line sql.y:5133 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 969: + case 972: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5120 +//line sql.y:5135 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 970: + case 973: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5124 +//line sql.y:5139 { yyVAL.joinCondition = &JoinCondition{} } - case 971: + case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5126 +//line sql.y:5141 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 972: + case 975: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5130 +//line sql.y:5145 { yyVAL.joinCondition = &JoinCondition{} } - case 973: + case 976: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5132 +//line sql.y:5147 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 974: + case 977: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5135 +//line sql.y:5150 { yyVAL.empty = struct{}{} } - case 975: + case 978: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5137 +//line sql.y:5152 { yyVAL.empty = struct{}{} } - case 976: + case 979: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5140 +//line sql.y:5155 { yyVAL.identifierCS = NewIdentifierCS("") } - case 977: + case 980: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5144 +//line sql.y:5159 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 978: + case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5148 +//line sql.y:5163 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 980: + case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5155 +//line sql.y:5170 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 981: + case 984: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5161 +//line sql.y:5176 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 982: + case 985: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5165 +//line sql.y:5180 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 983: + case 986: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5169 +//line sql.y:5184 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 984: + case 987: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5175 +//line sql.y:5190 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 985: + case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5181 +//line sql.y:5196 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 986: + case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5185 +//line sql.y:5200 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 987: + case 990: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5189 +//line sql.y:5204 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 988: + case 991: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5193 +//line sql.y:5208 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 989: + case 992: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5199 +//line sql.y:5214 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 990: + case 993: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5203 +//line sql.y:5218 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -17582,667 +17499,667 @@ yydefault: } } yyVAL.union = yyLOCAL - case 991: + case 994: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5213 +//line sql.y:5228 { yyVAL.tableName = yyDollar[2].tableName } - case 992: + case 995: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5217 +//line sql.y:5232 { yyVAL.tableName = yyDollar[1].tableName } - case 993: + case 996: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5223 +//line sql.y:5238 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 994: + case 997: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5227 +//line sql.y:5242 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 995: + case 998: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5233 +//line sql.y:5248 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 996: + case 999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5238 +//line sql.y:5253 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 997: + case 1000: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5242 +//line sql.y:5257 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 998: + case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5248 +//line sql.y:5263 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 999: + case 1002: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5252 +//line sql.y:5267 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 1000: + case 1003: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5258 +//line sql.y:5273 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1001: + case 1004: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5262 +//line sql.y:5277 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 1002: + case 1005: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5266 +//line sql.y:5281 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1003: + case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5270 +//line sql.y:5285 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 1004: + case 1007: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5274 +//line sql.y:5289 { yyLOCAL = &IndexHint{Type: UseVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1005: + case 1008: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5278 +//line sql.y:5293 { yyLOCAL = &IndexHint{Type: IgnoreVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1006: + case 1009: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5283 +//line sql.y:5298 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 1007: + case 1010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5287 +//line sql.y:5302 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 1008: + case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5291 +//line sql.y:5306 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 1009: + case 1012: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5295 +//line sql.y:5310 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 1010: + case 1013: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5301 +//line sql.y:5316 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1011: + case 1014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5305 +//line sql.y:5320 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1012: + case 1015: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5312 +//line sql.y:5327 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1013: + case 1016: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5316 +//line sql.y:5331 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1014: + case 1017: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5320 +//line sql.y:5335 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1015: + case 1018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5324 +//line sql.y:5339 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1016: + case 1019: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5328 +//line sql.y:5343 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 1017: + case 1020: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5332 +//line sql.y:5347 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1018: + case 1021: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5336 +//line sql.y:5351 { yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1019: + case 1022: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5355 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1020: + case 1023: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5346 +//line sql.y:5361 { } - case 1021: + case 1024: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5349 +//line sql.y:5364 { } - case 1022: + case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5354 +//line sql.y:5369 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 1023: + case 1026: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5358 +//line sql.y:5373 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 1024: + case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5362 +//line sql.y:5377 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1025: + case 1028: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5366 +//line sql.y:5381 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1026: + case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5370 +//line sql.y:5385 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1027: + case 1030: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5374 +//line sql.y:5389 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: All, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1028: + case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5378 +//line sql.y:5393 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1029: + case 1032: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5384 +//line sql.y:5399 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1030: + case 1033: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5388 +//line sql.y:5403 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1031: + case 1034: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5392 +//line sql.y:5407 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1032: + case 1035: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5396 +//line sql.y:5411 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1033: + case 1036: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5400 +//line sql.y:5415 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1034: + case 1037: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5404 +//line sql.y:5419 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1038: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5408 +//line sql.y:5423 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1036: + case 1039: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5412 +//line sql.y:5427 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1037: + case 1040: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5416 +//line sql.y:5431 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1038: + case 1041: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5420 +//line sql.y:5435 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1039: + case 1042: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5424 +//line sql.y:5439 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1040: + case 1043: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5430 +//line sql.y:5445 { } - case 1041: + case 1044: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5433 +//line sql.y:5448 { } - case 1042: + case 1045: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5439 +//line sql.y:5454 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1043: + case 1046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5443 +//line sql.y:5458 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1044: + case 1047: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5447 +//line sql.y:5462 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1045: + case 1048: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5451 +//line sql.y:5466 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1046: + case 1049: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5455 +//line sql.y:5470 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1047: + case 1050: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5459 +//line sql.y:5474 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1048: + case 1051: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5463 +//line sql.y:5478 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1049: + case 1052: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5467 +//line sql.y:5482 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1050: + case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5471 +//line sql.y:5486 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1051: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5475 +//line sql.y:5490 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1052: + case 1055: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5479 +//line sql.y:5494 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1053: + case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5483 +//line sql.y:5498 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1054: + case 1057: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5487 +//line sql.y:5502 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1055: + case 1058: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5491 +//line sql.y:5506 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5495 +//line sql.y:5510 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1057: + case 1060: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5501 +//line sql.y:5516 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1058: + case 1061: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5505 +//line sql.y:5520 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1059: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5509 +//line sql.y:5524 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1060: + case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5513 +//line sql.y:5528 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1061: + case 1064: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5517 +//line sql.y:5532 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1062: + case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5521 +//line sql.y:5536 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1063: + case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5525 +//line sql.y:5540 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1064: + case 1067: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5529 +//line sql.y:5544 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1065: + case 1068: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5533 +//line sql.y:5548 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL - case 1066: + case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5537 +//line sql.y:5552 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1067: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5541 +//line sql.y:5556 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1068: + case 1071: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5545 +//line sql.y:5560 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1069: + case 1072: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5549 +//line sql.y:5564 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1070: + case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5553 +//line sql.y:5568 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1071: + case 1074: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5557 +//line sql.y:5572 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1072: + case 1075: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5561 +//line sql.y:5576 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL - case 1073: + case 1076: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5565 +//line sql.y:5580 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL - case 1074: + case 1077: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5569 +//line sql.y:5584 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1075: + case 1078: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5573 +//line sql.y:5588 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1076: + case 1079: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5577 +//line sql.y:5592 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -18251,3218 +18168,3218 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1077: + case 1080: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5585 +//line sql.y:5600 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1078: + case 1081: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5589 +//line sql.y:5604 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAddLeft, Date: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion(), Interval: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1079: + case 1082: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5593 +//line sql.y:5608 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1080: + case 1083: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5597 +//line sql.y:5612 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}} } yyVAL.union = yyLOCAL - case 1081: + case 1084: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5601 +//line sql.y:5616 { yyLOCAL = &JSONUnquoteExpr{JSONValue: &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}}} } yyVAL.union = yyLOCAL - case 1082: + case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5607 +//line sql.y:5622 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1083: + case 1086: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5611 +//line sql.y:5626 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1084: + case 1087: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5617 +//line sql.y:5632 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1085: + case 1088: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5621 +//line sql.y:5636 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1086: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5627 +//line sql.y:5642 { yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL - case 1087: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5631 +//line sql.y:5646 { yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL - case 1088: + case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5635 +//line sql.y:5650 { yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL - case 1089: + case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5641 +//line sql.y:5656 { yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL - case 1090: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5645 +//line sql.y:5660 { yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL - case 1091: + case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5652 +//line sql.y:5667 { yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL - case 1092: + case 1095: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5656 +//line sql.y:5671 { yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL - case 1093: + case 1096: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5660 +//line sql.y:5675 { yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL - case 1094: + case 1097: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5664 +//line sql.y:5679 { yyLOCAL = RankExprType } yyVAL.union = yyLOCAL - case 1095: + case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5668 +//line sql.y:5683 { yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL - case 1096: + case 1099: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5674 +//line sql.y:5689 { yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL - case 1097: + case 1100: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5678 +//line sql.y:5693 { yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL - case 1098: + case 1101: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5682 +//line sql.y:5697 { yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL - case 1099: + case 1102: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5686 +//line sql.y:5701 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1100: + case 1103: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5690 +//line sql.y:5705 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1101: + case 1104: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5694 +//line sql.y:5709 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1102: + case 1105: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5698 +//line sql.y:5713 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1103: + case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5703 +//line sql.y:5718 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1104: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5707 +//line sql.y:5722 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1105: + case 1108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5713 +//line sql.y:5728 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1106: + case 1109: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5717 +//line sql.y:5732 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1107: + case 1110: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5722 +//line sql.y:5737 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1108: + case 1111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5726 +//line sql.y:5741 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1109: + case 1112: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5731 +//line sql.y:5746 { yyVAL.identifierCI = IdentifierCI{} } - case 1110: + case 1113: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5735 +//line sql.y:5750 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1111: + case 1114: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5741 +//line sql.y:5756 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1112: + case 1115: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5747 +//line sql.y:5762 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1113: + case 1116: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5751 +//line sql.y:5766 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1114: + case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5757 +//line sql.y:5772 { yyLOCAL = yyDollar[1].overClauseUnion() } yyVAL.union = yyLOCAL - case 1115: + case 1118: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5761 +//line sql.y:5776 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1116: + case 1119: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5766 +//line sql.y:5781 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1118: + case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5773 +//line sql.y:5788 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1119: + case 1122: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5779 +//line sql.y:5794 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1120: + case 1123: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5783 +//line sql.y:5798 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1121: + case 1124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5789 +//line sql.y:5804 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1122: + case 1125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5793 +//line sql.y:5808 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1123: + case 1126: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5799 +//line sql.y:5814 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1124: + case 1127: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5803 +//line sql.y:5818 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1125: + case 1128: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5808 +//line sql.y:5823 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1127: + case 1130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5815 +//line sql.y:5830 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1128: + case 1131: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5821 +//line sql.y:5836 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1129: + case 1132: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5825 +//line sql.y:5840 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1130: + case 1133: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5831 +//line sql.y:5846 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1131: + case 1134: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5837 +//line sql.y:5852 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1132: + case 1135: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5841 +//line sql.y:5856 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1133: + case 1136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5847 +//line sql.y:5862 { yyVAL.str = "" } - case 1134: + case 1137: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5851 +//line sql.y:5866 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1135: + case 1138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5857 +//line sql.y:5872 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1136: + case 1139: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5861 +//line sql.y:5876 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1137: + case 1140: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5868 +//line sql.y:5883 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1138: + case 1141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5872 +//line sql.y:5887 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1139: + case 1142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5876 +//line sql.y:5891 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1140: + case 1143: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5880 +//line sql.y:5895 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1141: + case 1144: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5886 +//line sql.y:5901 { yyLOCAL = yyDollar[1].comparisonExprOperatorUnion() } yyVAL.union = yyLOCAL - case 1142: + case 1145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5890 +//line sql.y:5905 { yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL - case 1143: + case 1146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5896 +//line sql.y:5911 { yyLOCAL = EqualOp } yyVAL.union = yyLOCAL - case 1144: + case 1147: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5900 +//line sql.y:5915 { yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL - case 1145: + case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5904 +//line sql.y:5919 { yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL - case 1146: + case 1149: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5908 +//line sql.y:5923 { yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL - case 1147: + case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5912 +//line sql.y:5927 { yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL - case 1148: + case 1151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5916 +//line sql.y:5931 { yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL - case 1149: + case 1152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5922 +//line sql.y:5937 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1150: + case 1153: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5926 +//line sql.y:5941 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1151: + case 1154: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5930 +//line sql.y:5945 { yyLOCAL = ListArg(yyDollar[1].str[2:]) markBindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1152: + case 1155: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5937 +//line sql.y:5952 { - yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} + yyLOCAL = &Subquery{yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1153: + case 1156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5943 +//line sql.y:5958 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1154: + case 1157: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5947 +//line sql.y:5962 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1155: + case 1158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5957 +//line sql.y:5972 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1156: + case 1159: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5961 +//line sql.y:5976 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1157: + case 1160: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5971 +//line sql.y:5986 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1158: + case 1161: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5975 +//line sql.y:5990 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1159: + case 1162: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5979 +//line sql.y:5994 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1160: + case 1163: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5983 +//line sql.y:5998 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1161: + case 1164: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5987 +//line sql.y:6002 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1162: + case 1165: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5991 +//line sql.y:6006 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1163: + case 1166: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5995 +//line sql.y:6010 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1164: + case 1167: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5999 +//line sql.y:6014 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1165: + case 1168: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6003 +//line sql.y:6018 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 1166: + case 1169: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6007 +//line sql.y:6022 { yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1167: + case 1170: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6011 +//line sql.y:6026 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1168: + case 1171: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6022 +//line sql.y:6037 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL - case 1169: + case 1172: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6026 +//line sql.y:6041 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1170: + case 1173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6032 +//line sql.y:6047 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL - case 1171: + case 1174: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6036 +//line sql.y:6051 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} } yyVAL.union = yyLOCAL - case 1172: + case 1175: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6040 +//line sql.y:6055 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1173: + case 1176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6045 +//line sql.y:6060 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1174: + case 1177: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6050 +//line sql.y:6065 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1175: + case 1178: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6054 +//line sql.y:6069 { yyLOCAL = &CountStar{OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1176: + case 1179: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6058 +//line sql.y:6073 { yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1177: + case 1180: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6062 +//line sql.y:6077 { yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1178: + case 1181: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6066 +//line sql.y:6081 { yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1179: + case 1182: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6070 +//line sql.y:6085 { yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1180: + case 1183: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6074 +//line sql.y:6089 { yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1181: + case 1184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6078 +//line sql.y:6093 { yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1182: + case 1185: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6082 +//line sql.y:6097 { yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1183: + case 1186: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6086 +//line sql.y:6101 { yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1184: + case 1187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6090 +//line sql.y:6105 { yyLOCAL = &Std{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1185: + case 1188: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6094 +//line sql.y:6109 { yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1186: + case 1189: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6098 +//line sql.y:6113 { yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1187: + case 1190: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6102 +//line sql.y:6117 { yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1188: + case 1191: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6106 +//line sql.y:6121 { yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1189: + case 1192: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6110 +//line sql.y:6125 { yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1190: + case 1193: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6114 +//line sql.y:6129 { yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1191: + case 1194: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6118 +//line sql.y:6133 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 1192: + case 1195: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6122 +//line sql.y:6137 { yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1193: + case 1196: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6126 +//line sql.y:6141 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1194: + case 1197: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6130 +//line sql.y:6145 { yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1195: + case 1198: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6134 +//line sql.y:6149 { yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1196: + case 1199: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6138 +//line sql.y:6153 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1197: + case 1200: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6142 +//line sql.y:6157 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1198: + case 1201: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6146 +//line sql.y:6161 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1199: + case 1202: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6150 +//line sql.y:6165 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1200: + case 1203: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6154 +//line sql.y:6169 { yyLOCAL = &JSONArrayAgg{Expr: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1201: + case 1204: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6158 +//line sql.y:6173 { yyLOCAL = &JSONObjectAgg{Key: yyDollar[3].exprUnion(), Value: yyDollar[5].exprUnion(), OverClause: yyDollar[7].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1202: + case 1205: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6162 +//line sql.y:6177 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1203: + case 1206: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6166 +//line sql.y:6181 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1204: + case 1207: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6170 +//line sql.y:6185 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1205: + case 1208: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6174 +//line sql.y:6189 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1209: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6178 +//line sql.y:6193 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1207: + case 1210: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6182 +//line sql.y:6197 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1208: + case 1211: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6186 +//line sql.y:6201 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1209: + case 1212: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6190 +//line sql.y:6205 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1210: + case 1213: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6194 +//line sql.y:6209 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1214: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6198 +//line sql.y:6213 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1212: + case 1215: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6202 +//line sql.y:6217 { yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1216: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6206 +//line sql.y:6221 { yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1214: + case 1217: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6210 +//line sql.y:6225 { yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1218: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6214 +//line sql.y:6229 { yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL - case 1216: + case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6218 +//line sql.y:6233 { yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1220: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6222 +//line sql.y:6237 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1218: + case 1221: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6226 +//line sql.y:6241 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1219: + case 1222: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6230 +//line sql.y:6245 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1220: + case 1223: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6234 +//line sql.y:6249 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1221: + case 1224: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6238 +//line sql.y:6253 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6242 +//line sql.y:6257 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1223: + case 1226: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6246 +//line sql.y:6261 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1224: + case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6250 +//line sql.y:6265 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1225: + case 1228: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6254 +//line sql.y:6269 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1226: + case 1229: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6258 +//line sql.y:6273 { yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1227: + case 1230: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6262 +//line sql.y:6277 { yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1228: + case 1231: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6266 +//line sql.y:6281 { yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1232: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6270 +//line sql.y:6285 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1230: + case 1233: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6274 +//line sql.y:6289 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1231: + case 1234: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6278 +//line sql.y:6293 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1232: + case 1235: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6282 +//line sql.y:6297 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1233: + case 1236: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6286 +//line sql.y:6301 { yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1234: + case 1237: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6290 +//line sql.y:6305 { yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1235: + case 1238: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6294 +//line sql.y:6309 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1236: + case 1239: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6298 +//line sql.y:6313 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1237: + case 1240: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6302 +//line sql.y:6317 { yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1238: + case 1241: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6306 +//line sql.y:6321 { yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1239: + case 1242: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6310 +//line sql.y:6325 { yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1240: + case 1243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6314 +//line sql.y:6329 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1241: + case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6318 +//line sql.y:6333 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1242: + case 1245: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6322 +//line sql.y:6337 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1243: + case 1246: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6326 +//line sql.y:6341 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1244: + case 1247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6330 +//line sql.y:6345 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1245: + case 1248: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6334 +//line sql.y:6349 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1246: + case 1249: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6338 +//line sql.y:6353 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1247: + case 1250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6342 +//line sql.y:6357 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1248: + case 1251: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6346 +//line sql.y:6361 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1249: + case 1252: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6350 +//line sql.y:6365 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1250: + case 1253: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6354 +//line sql.y:6369 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1251: + case 1254: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6358 +//line sql.y:6373 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1252: + case 1255: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6362 +//line sql.y:6377 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1253: + case 1256: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6366 +//line sql.y:6381 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1254: + case 1257: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6370 +//line sql.y:6385 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1255: + case 1258: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6374 +//line sql.y:6389 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1256: + case 1259: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6378 +//line sql.y:6393 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1257: + case 1260: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6382 +//line sql.y:6397 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1258: + case 1261: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6386 +//line sql.y:6401 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1259: + case 1262: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6390 +//line sql.y:6405 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1260: + case 1263: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6394 +//line sql.y:6409 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1261: + case 1264: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6398 +//line sql.y:6413 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1262: + case 1265: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6402 +//line sql.y:6417 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1263: + case 1266: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6406 +//line sql.y:6421 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1264: + case 1267: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6410 +//line sql.y:6425 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1265: + case 1268: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6414 +//line sql.y:6429 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1266: + case 1269: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6418 +//line sql.y:6433 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1267: + case 1270: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6422 +//line sql.y:6437 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1268: + case 1271: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6426 +//line sql.y:6441 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1269: + case 1272: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6430 +//line sql.y:6445 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1270: + case 1273: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6434 +//line sql.y:6449 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1271: + case 1274: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6438 +//line sql.y:6453 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1272: + case 1275: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6442 +//line sql.y:6457 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1273: + case 1276: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6446 +//line sql.y:6461 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1274: + case 1277: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6450 +//line sql.y:6465 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1275: + case 1278: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6454 +//line sql.y:6469 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1276: + case 1279: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6458 +//line sql.y:6473 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1277: + case 1280: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6462 +//line sql.y:6477 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1278: + case 1281: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6466 +//line sql.y:6481 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1279: + case 1282: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6470 +//line sql.y:6485 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1280: + case 1283: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6474 +//line sql.y:6489 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1281: + case 1284: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6478 +//line sql.y:6493 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1282: + case 1285: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6482 +//line sql.y:6497 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1283: + case 1286: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6486 +//line sql.y:6501 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1284: + case 1287: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6490 +//line sql.y:6505 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1285: + case 1288: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6494 +//line sql.y:6509 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1286: + case 1289: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6498 +//line sql.y:6513 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1287: + case 1290: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6502 +//line sql.y:6517 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1288: + case 1291: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6506 +//line sql.y:6521 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1289: + case 1292: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6510 +//line sql.y:6525 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1290: + case 1293: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6514 +//line sql.y:6529 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1291: + case 1294: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6518 +//line sql.y:6533 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1292: + case 1295: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6522 +//line sql.y:6537 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1293: + case 1296: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6526 +//line sql.y:6541 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1294: + case 1297: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6530 +//line sql.y:6545 { yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1295: + case 1298: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6534 +//line sql.y:6549 { yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1296: + case 1299: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6538 +//line sql.y:6553 { yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1297: + case 1300: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6542 +//line sql.y:6557 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1298: + case 1301: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6546 +//line sql.y:6561 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1299: + case 1302: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6550 +//line sql.y:6565 { yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1300: + case 1303: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6554 +//line sql.y:6569 { yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1301: + case 1304: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6558 +//line sql.y:6573 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1302: + case 1305: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6562 +//line sql.y:6577 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1303: + case 1306: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6566 +//line sql.y:6581 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1304: + case 1307: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6570 +//line sql.y:6585 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1305: + case 1308: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6574 +//line sql.y:6589 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1306: + case 1309: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6578 +//line sql.y:6593 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1307: + case 1310: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6582 +//line sql.y:6597 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1308: + case 1311: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6586 +//line sql.y:6601 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1309: + case 1312: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6590 +//line sql.y:6605 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1310: + case 1313: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6594 +//line sql.y:6609 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1311: + case 1314: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6598 +//line sql.y:6613 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1312: + case 1315: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6602 +//line sql.y:6617 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1313: + case 1316: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6606 +//line sql.y:6621 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL - case 1314: + case 1317: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6610 +//line sql.y:6625 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1315: + case 1318: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6614 +//line sql.y:6629 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1316: + case 1319: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6618 +//line sql.y:6633 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1317: + case 1320: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6622 +//line sql.y:6637 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1318: + case 1321: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6626 +//line sql.y:6641 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1319: + case 1322: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6630 +//line sql.y:6645 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1320: + case 1323: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6634 +//line sql.y:6649 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1321: + case 1324: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6638 +//line sql.y:6653 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1322: + case 1325: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6642 +//line sql.y:6657 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1323: + case 1326: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6646 +//line sql.y:6661 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1324: + case 1327: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6650 +//line sql.y:6665 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1325: + case 1328: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6654 +//line sql.y:6669 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1326: + case 1329: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6658 +//line sql.y:6673 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1327: + case 1330: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6662 +//line sql.y:6677 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1328: + case 1331: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6666 +//line sql.y:6681 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1329: + case 1332: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6670 +//line sql.y:6685 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1330: + case 1333: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6674 +//line sql.y:6689 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1331: + case 1334: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6678 +//line sql.y:6693 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1332: + case 1335: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6682 +//line sql.y:6697 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1333: + case 1336: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6686 +//line sql.y:6701 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1334: + case 1337: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6690 +//line sql.y:6705 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1335: + case 1338: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6694 +//line sql.y:6709 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1336: + case 1339: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6698 +//line sql.y:6713 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1337: + case 1340: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6702 +//line sql.y:6717 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1338: + case 1341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6706 +//line sql.y:6721 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1339: + case 1342: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6710 +//line sql.y:6725 { yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1340: + case 1343: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6714 +//line sql.y:6729 { yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1341: + case 1344: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6718 +//line sql.y:6733 { yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1342: + case 1345: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6722 +//line sql.y:6737 { yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1343: + case 1346: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6726 +//line sql.y:6741 { yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1344: + case 1347: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6730 +//line sql.y:6745 { yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1345: + case 1348: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6734 +//line sql.y:6749 { yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1346: + case 1349: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6738 +//line sql.y:6753 { yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1347: + case 1350: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6742 +//line sql.y:6757 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1348: + case 1351: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6746 +//line sql.y:6761 { yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1349: + case 1352: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6750 +//line sql.y:6765 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1350: + case 1353: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6754 +//line sql.y:6769 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1351: + case 1354: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6758 +//line sql.y:6773 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1352: + case 1355: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6762 +//line sql.y:6777 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1353: + case 1356: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6766 +//line sql.y:6781 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1354: + case 1357: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6770 +//line sql.y:6785 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1355: + case 1358: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6774 +//line sql.y:6789 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1356: + case 1359: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6778 +//line sql.y:6793 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1361: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6788 +//line sql.y:6803 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1362: + case 1365: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6792 +//line sql.y:6807 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1363: + case 1366: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6796 +//line sql.y:6811 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1364: + case 1367: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6800 +//line sql.y:6815 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1365: + case 1368: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6805 +//line sql.y:6820 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1366: + case 1369: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6809 +//line sql.y:6824 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1367: + case 1370: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6815 +//line sql.y:6830 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1368: + case 1371: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6819 +//line sql.y:6834 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1369: + case 1372: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6823 +//line sql.y:6838 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1370: + case 1373: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6827 +//line sql.y:6842 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1371: + case 1374: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6831 +//line sql.y:6846 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1372: + case 1375: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6836 +//line sql.y:6851 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1373: + case 1376: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6840 +//line sql.y:6855 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1374: + case 1377: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6844 +//line sql.y:6859 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1375: + case 1378: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6848 +//line sql.y:6863 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1376: + case 1379: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6852 +//line sql.y:6867 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1377: + case 1380: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6856 +//line sql.y:6871 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1378: + case 1381: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6861 +//line sql.y:6876 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1379: + case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6865 +//line sql.y:6880 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1380: + case 1383: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6869 +//line sql.y:6884 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1381: + case 1384: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6873 +//line sql.y:6888 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1382: + case 1385: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6880 +//line sql.y:6895 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1383: + case 1386: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6884 +//line sql.y:6899 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1384: + case 1387: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6890 +//line sql.y:6905 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1385: + case 1388: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6894 +//line sql.y:6909 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1386: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6898 +//line sql.y:6913 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1387: + case 1390: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6902 +//line sql.y:6917 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1388: + case 1391: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6908 +//line sql.y:6923 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1389: + case 1392: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6912 +//line sql.y:6927 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1390: + case 1393: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6916 +//line sql.y:6931 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1391: + case 1394: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6920 +//line sql.y:6935 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1392: + case 1395: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6924 +//line sql.y:6939 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1393: + case 1396: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6928 +//line sql.y:6943 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1394: + case 1397: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6932 +//line sql.y:6947 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1395: + case 1398: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6937 +//line sql.y:6952 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1396: + case 1399: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6941 +//line sql.y:6956 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1397: + case 1400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6947 +//line sql.y:6962 { yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL - case 1398: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6951 +//line sql.y:6966 { yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL - case 1399: + case 1402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6955 +//line sql.y:6970 { yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL - case 1400: + case 1403: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6959 +//line sql.y:6974 { yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL - case 1401: + case 1404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6963 +//line sql.y:6978 { yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL - case 1402: + case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6967 +//line sql.y:6982 { yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL - case 1403: + case 1406: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6971 +//line sql.y:6986 { yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL - case 1404: + case 1407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6975 +//line sql.y:6990 { yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL - case 1405: + case 1408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6979 +//line sql.y:6994 { yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL - case 1406: + case 1409: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6983 +//line sql.y:6998 { yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL - case 1407: + case 1410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6987 +//line sql.y:7002 { yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL - case 1408: + case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6991 +//line sql.y:7006 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1409: + case 1412: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6995 +//line sql.y:7010 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1410: + case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6999 +//line sql.y:7014 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1411: + case 1414: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7003 +//line sql.y:7018 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1412: + case 1415: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7007 +//line sql.y:7022 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1413: + case 1416: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7011 +//line sql.y:7026 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1414: + case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7015 +//line sql.y:7030 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1415: + case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7019 +//line sql.y:7034 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1416: + case 1419: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7023 +//line sql.y:7038 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1417: + case 1420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7029 +//line sql.y:7044 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1418: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7033 +//line sql.y:7048 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1419: + case 1422: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7037 +//line sql.y:7052 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1420: + case 1423: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7041 +//line sql.y:7056 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1421: + case 1424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7045 +//line sql.y:7060 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1422: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7049 +//line sql.y:7064 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1423: + case 1426: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7053 +//line sql.y:7068 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1424: + case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7057 +//line sql.y:7072 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1425: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7061 +//line sql.y:7076 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1426: + case 1429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7065 +//line sql.y:7080 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1427: + case 1430: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7069 +//line sql.y:7084 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1428: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7073 +//line sql.y:7088 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1429: + case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7077 +//line sql.y:7092 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1430: + case 1433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7081 +//line sql.y:7096 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1431: + case 1434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7085 +//line sql.y:7100 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1432: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7089 +//line sql.y:7104 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1433: + case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7093 +//line sql.y:7108 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1434: + case 1437: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7097 +//line sql.y:7112 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1437: + case 1440: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:7107 +//line sql.y:7122 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1438: + case 1441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:7111 +//line sql.y:7126 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1439: + case 1442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:7115 +//line sql.y:7130 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1440: + case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7125 +//line sql.y:7140 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1441: + case 1444: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7129 +//line sql.y:7144 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1442: + case 1445: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7133 +//line sql.y:7148 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1443: + case 1446: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7137 +//line sql.y:7152 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1444: + case 1447: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7141 +//line sql.y:7156 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1445: + case 1448: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7147 +//line sql.y:7162 { yyLOCAL = NoOption } yyVAL.union = yyLOCAL - case 1446: + case 1449: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7151 +//line sql.y:7166 { yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL - case 1447: + case 1450: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7155 +//line sql.y:7170 { yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL - case 1448: + case 1451: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7159 +//line sql.y:7174 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL - case 1449: + case 1452: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7163 +//line sql.y:7178 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL - case 1450: + case 1453: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7169 +//line sql.y:7184 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } - case 1451: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7173 +//line sql.y:7188 { yyVAL.str = string(yyDollar[1].str) } - case 1452: + case 1455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7177 +//line sql.y:7192 { yyVAL.str = string(yyDollar[1].str) } - case 1453: + case 1456: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7183 +//line sql.y:7198 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1454: + case 1457: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7187 +//line sql.y:7202 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1455: + case 1458: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7191 +//line sql.y:7206 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1456: + case 1459: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7197 +//line sql.y:7212 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1457: + case 1460: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7201 +//line sql.y:7216 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL - case 1458: + case 1461: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7205 +//line sql.y:7220 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1459: + case 1462: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7209 +//line sql.y:7224 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1460: + case 1463: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7213 +//line sql.y:7228 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL - case 1461: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7219 +//line sql.y:7234 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1462: + case 1465: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7223 +//line sql.y:7238 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1463: + case 1466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7227 +//line sql.y:7242 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1464: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7231 +//line sql.y:7246 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1465: + case 1468: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7235 +//line sql.y:7250 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1466: + case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7239 +//line sql.y:7254 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1467: + case 1470: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7243 +//line sql.y:7258 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1468: + case 1471: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7247 +//line sql.y:7262 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1469: + case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7251 +//line sql.y:7266 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1470: + case 1473: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7255 +//line sql.y:7270 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1471: + case 1474: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7261 +//line sql.y:7276 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1472: + case 1475: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7265 +//line sql.y:7280 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1473: + case 1476: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7270 +//line sql.y:7285 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1474: + case 1477: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7274 +//line sql.y:7289 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1475: + case 1478: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7279 +//line sql.y:7294 { yyVAL.str = string("") } - case 1476: + case 1479: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7283 +//line sql.y:7298 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 1477: + case 1480: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:7289 +//line sql.y:7304 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1478: + case 1481: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7293 +//line sql.y:7308 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1479: + case 1482: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:7299 +//line sql.y:7314 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1483: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7304 +//line sql.y:7319 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1481: + case 1484: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7308 +//line sql.y:7323 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1482: + case 1485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7314 +//line sql.y:7329 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1483: + case 1486: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7318 +//line sql.y:7333 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1484: + case 1487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:7322 +//line sql.y:7337 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1485: + case 1488: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:7326 +//line sql.y:7341 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1486: + case 1489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7332 +//line sql.y:7347 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1487: + case 1490: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7336 +//line sql.y:7351 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1488: + case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7342 +//line sql.y:7357 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -21472,442 +21389,442 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1489: + case 1492: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7351 +//line sql.y:7366 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1490: + case 1493: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7355 +//line sql.y:7370 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1491: + case 1494: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7360 +//line sql.y:7375 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1492: + case 1495: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7364 +//line sql.y:7379 { yyLOCAL = &GroupBy{Exprs: yyDollar[3].exprsUnion(), WithRollup: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 1493: + case 1496: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7369 +//line sql.y:7384 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1494: + case 1497: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7373 +//line sql.y:7388 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1495: + case 1498: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7379 +//line sql.y:7394 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1496: + case 1499: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7383 +//line sql.y:7398 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1497: + case 1500: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:7389 +//line sql.y:7404 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1498: + case 1501: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7395 +//line sql.y:7410 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1499: + case 1502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7399 +//line sql.y:7414 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1500: + case 1503: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7404 +//line sql.y:7419 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1501: + case 1504: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7408 +//line sql.y:7423 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1502: + case 1505: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7413 +//line sql.y:7428 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1503: + case 1506: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7417 +//line sql.y:7432 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1504: + case 1507: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7423 +//line sql.y:7438 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1505: + case 1508: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7429 +//line sql.y:7444 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1506: + case 1509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7433 +//line sql.y:7448 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1507: + case 1510: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:7439 +//line sql.y:7454 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1508: + case 1511: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7444 +//line sql.y:7459 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1509: + case 1512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7448 +//line sql.y:7463 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1510: + case 1513: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7452 +//line sql.y:7467 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1511: + case 1514: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:7457 +//line sql.y:7472 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1512: + case 1515: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:7461 +//line sql.y:7476 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1513: + case 1516: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:7467 +//line sql.y:7482 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1514: + case 1517: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7471 +//line sql.y:7486 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1515: + case 1518: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7475 +//line sql.y:7490 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1516: + case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7480 +//line sql.y:7495 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1517: + case 1520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7484 +//line sql.y:7499 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1518: + case 1521: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7488 +//line sql.y:7503 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1519: + case 1522: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7492 +//line sql.y:7507 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1520: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7496 +//line sql.y:7511 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1521: + case 1524: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7503 +//line sql.y:7518 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 1522: + case 1525: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7507 +//line sql.y:7522 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 1523: + case 1526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7511 +//line sql.y:7526 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 1524: + case 1527: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7515 +//line sql.y:7530 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 1525: + case 1528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7521 +//line sql.y:7536 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1526: + case 1529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7525 +//line sql.y:7540 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1527: + case 1530: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7529 +//line sql.y:7544 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1528: + case 1531: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7533 +//line sql.y:7548 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1529: + case 1532: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7538 +//line sql.y:7553 { yyVAL.str = "" } - case 1530: + case 1533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7542 +//line sql.y:7557 { yyVAL.str = string(yyDollar[3].str) } - case 1531: + case 1534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7546 +//line sql.y:7561 { yyVAL.str = string(yyDollar[3].str) } - case 1532: + case 1535: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7550 +//line sql.y:7565 { yyVAL.str = string(yyDollar[3].str) } - case 1533: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7555 +//line sql.y:7570 { yyVAL.str = "" } - case 1534: + case 1537: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7559 +//line sql.y:7574 { yyVAL.str = yyDollar[3].str } - case 1535: + case 1538: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7565 +//line sql.y:7580 { yyVAL.str = string(yyDollar[1].str) } - case 1536: + case 1539: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7569 +//line sql.y:7584 { yyVAL.str = string(yyDollar[1].str) } - case 1537: + case 1540: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7574 +//line sql.y:7589 { yyVAL.str = "" } - case 1538: + case 1541: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7578 +//line sql.y:7593 { yyVAL.str = yyDollar[2].str } - case 1539: + case 1542: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7583 +//line sql.y:7598 { yyVAL.str = "cascaded" } - case 1540: + case 1543: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7587 +//line sql.y:7602 { yyVAL.str = string(yyDollar[1].str) } - case 1541: + case 1544: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7591 +//line sql.y:7606 { yyVAL.str = string(yyDollar[1].str) } - case 1542: + case 1545: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:7596 +//line sql.y:7611 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1543: + case 1546: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7600 +//line sql.y:7615 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1544: + case 1547: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:7606 +//line sql.y:7621 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1545: + case 1548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7612 +//line sql.y:7627 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1546: + case 1549: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:7618 +//line sql.y:7633 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -21915,433 +21832,464 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1547: + case 1550: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7627 +//line sql.y:7642 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1548: + case 1551: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7631 +//line sql.y:7646 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1549: + case 1552: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7636 +//line sql.y:7651 { yyVAL.str = "" } - case 1550: + case 1553: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7640 +//line sql.y:7655 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1551: + case 1554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7646 +//line sql.y:7661 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1552: + case 1555: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7650 +//line sql.y:7665 { yyLOCAL = ForUpdateLockNoWait } yyVAL.union = yyLOCAL - case 1553: + case 1556: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7654 +//line sql.y:7669 { yyLOCAL = ForUpdateLockSkipLocked } yyVAL.union = yyLOCAL - case 1554: + case 1557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7658 +//line sql.y:7673 { yyLOCAL = ForShareLock } yyVAL.union = yyLOCAL - case 1555: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7662 +//line sql.y:7677 { yyLOCAL = ForShareLockNoWait } yyVAL.union = yyLOCAL - case 1556: + case 1559: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7666 +//line sql.y:7681 { yyLOCAL = ForShareLockSkipLocked } yyVAL.union = yyLOCAL - case 1557: + case 1560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7670 +//line sql.y:7685 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1558: + case 1561: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7676 +//line sql.y:7691 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1559: + case 1562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7680 +//line sql.y:7695 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1560: + case 1563: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7684 +//line sql.y:7699 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1561: + case 1564: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7689 +//line sql.y:7704 { yyVAL.str = "" } - case 1562: + case 1565: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7693 +//line sql.y:7708 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1563: + case 1566: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7697 +//line sql.y:7712 { yyVAL.str = " format text" + yyDollar[3].str } - case 1564: + case 1567: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7702 +//line sql.y:7717 { yyVAL.str = "" } - case 1565: + case 1568: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7706 +//line sql.y:7721 { yyVAL.str = " header" } - case 1566: + case 1569: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7711 +//line sql.y:7726 { yyVAL.str = "" } - case 1567: + case 1570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7715 +//line sql.y:7730 { yyVAL.str = " manifest on" } - case 1568: + case 1571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7719 +//line sql.y:7734 { yyVAL.str = " manifest off" } - case 1569: + case 1572: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7724 +//line sql.y:7739 { yyVAL.str = "" } - case 1570: + case 1573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7728 +//line sql.y:7743 { yyVAL.str = " overwrite on" } - case 1571: + case 1574: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7732 +//line sql.y:7747 { yyVAL.str = " overwrite off" } - case 1572: + case 1575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7738 +//line sql.y:7753 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1573: + case 1576: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7743 +//line sql.y:7758 { yyVAL.str = "" } - case 1574: + case 1577: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7747 +//line sql.y:7762 { yyVAL.str = " lines" + yyDollar[2].str } - case 1575: + case 1578: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7753 +//line sql.y:7768 { yyVAL.str = yyDollar[1].str } - case 1576: + case 1579: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7757 +//line sql.y:7772 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1577: + case 1580: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7763 +//line sql.y:7778 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1578: + case 1581: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7767 +//line sql.y:7782 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1579: + case 1582: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7772 +//line sql.y:7787 { yyVAL.str = "" } - case 1580: + case 1583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7776 +//line sql.y:7791 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1581: + case 1584: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7782 +//line sql.y:7797 { yyVAL.str = yyDollar[1].str } - case 1582: + case 1585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7786 +//line sql.y:7801 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1583: + case 1586: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7792 +//line sql.y:7807 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1584: + case 1587: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7796 +//line sql.y:7811 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1585: + case 1588: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7800 +//line sql.y:7815 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1586: + case 1589: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7805 +//line sql.y:7820 { yyVAL.str = "" } - case 1587: + case 1590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7809 +//line sql.y:7824 { yyVAL.str = " optionally" } - case 1588: + case 1591: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Insert -//line sql.y:7822 +//line sql.y:7837 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion(), RowAlias: yyDollar[3].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1589: + case 1592: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7826 +//line sql.y:7841 { - yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} + yyLOCAL = &Insert{Rows: yyDollar[1].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1590: + case 1593: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *Insert -//line sql.y:7830 +//line sql.y:7845 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion(), RowAlias: yyDollar[6].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1591: + case 1594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7834 +//line sql.y:7849 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion(), RowAlias: yyDollar[5].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1592: + case 1595: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7838 +//line sql.y:7853 { - yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} + yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].tableStmtUnion()} } yyVAL.union = yyLOCAL - case 1593: + case 1596: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7844 +//line sql.y:7859 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1594: + case 1597: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7848 +//line sql.y:7863 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1595: + case 1598: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7852 +//line sql.y:7867 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1596: + case 1599: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7856 +//line sql.y:7871 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1597: + case 1600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7861 +//line sql.y:7876 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1598: + case 1601: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7865 +//line sql.y:7880 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 1599: + case 1602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7869 +//line sql.y:7884 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1600: + case 1603: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7874 +//line sql.y:7889 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1601: + case 1604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7878 +//line sql.y:7893 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1602: + case 1605: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7884 +//line sql.y:7899 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1603: + case 1606: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7888 +//line sql.y:7903 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1604: + case 1607: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Values +//line sql.y:7909 + { + yyLOCAL = Values{yyDollar[1].valTupleUnion()} + } + yyVAL.union = yyLOCAL + case 1608: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:7913 + { + yySLICE := (*Values)(yyIaddr(yyVAL.union)) + *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) + } + case 1609: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7894 +//line sql.y:7919 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1605: + case 1610: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL ValTuple +//line sql.y:7923 + { + yyLOCAL = ValTuple{} + } + yyVAL.union = yyLOCAL + case 1611: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ValTuple +//line sql.y:7929 + { + yyLOCAL = yyDollar[1].valTupleUnion() + } + yyVAL.union = yyLOCAL + case 1612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7898 +//line sql.y:7933 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1606: + case 1613: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7904 +//line sql.y:7939 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1607: + case 1614: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7908 +//line sql.y:7945 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1608: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7913 +//line sql.y:7955 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -22350,300 +22298,300 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1609: + case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7923 +//line sql.y:7965 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1610: + case 1619: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7927 +//line sql.y:7969 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1611: + case 1620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7933 +//line sql.y:7975 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1613: + case 1622: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7940 +//line sql.y:7982 { yyVAL.str = "charset" } - case 1616: + case 1625: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7950 +//line sql.y:7992 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1617: + case 1626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7954 +//line sql.y:7996 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1618: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7958 +//line sql.y:8000 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1621: + case 1630: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7967 +//line sql.y:8009 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1622: + case 1631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7969 +//line sql.y:8011 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1623: + case 1632: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7972 +//line sql.y:8014 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1624: + case 1633: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7974 +//line sql.y:8016 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1625: + case 1634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7977 +//line sql.y:8019 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1626: + case 1635: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7979 +//line sql.y:8021 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1627: + case 1636: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7982 +//line sql.y:8024 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1628: + case 1637: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7984 +//line sql.y:8026 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1629: + case 1638: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7987 +//line sql.y:8029 { yyVAL.empty = struct{}{} } - case 1630: + case 1639: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7989 +//line sql.y:8031 { yyVAL.empty = struct{}{} } - case 1631: + case 1640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7991 +//line sql.y:8033 { yyVAL.empty = struct{}{} } - case 1632: + case 1641: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7995 +//line sql.y:8037 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1633: + case 1642: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:8000 +//line sql.y:8042 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1634: + case 1643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:8004 +//line sql.y:8046 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1635: + case 1644: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8009 +//line sql.y:8051 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1636: + case 1645: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8011 +//line sql.y:8053 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1637: + case 1646: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:8015 +//line sql.y:8057 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1638: + case 1647: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8021 +//line sql.y:8063 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1639: + case 1648: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8025 +//line sql.y:8067 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1641: + case 1650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8032 +//line sql.y:8074 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1642: + case 1651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8038 +//line sql.y:8080 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1643: + case 1652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8042 +//line sql.y:8084 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1644: + case 1653: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8048 +//line sql.y:8090 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1645: + case 1654: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8052 +//line sql.y:8094 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1647: + case 1656: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8059 +//line sql.y:8101 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1648: + case 1657: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:8065 +//line sql.y:8107 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 1649: + case 1658: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:8071 +//line sql.y:8113 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1650: + case 1659: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8075 +//line sql.y:8117 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1651: + case 1660: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8079 +//line sql.y:8121 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2283: + case 2292: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8739 +//line sql.y:8781 { } - case 2284: + case 2293: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8744 +//line sql.y:8786 { } - case 2285: + case 2294: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8748 +//line sql.y:8790 { skipToEnd(yylex) } - case 2286: + case 2295: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8753 +//line sql.y:8795 { skipToEnd(yylex) } - case 2287: + case 2296: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8757 +//line sql.y:8799 { skipToEnd(yylex) } - case 2288: + case 2297: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8761 +//line sql.y:8803 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index bf1a793e7e8..65c7bc84d01 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -60,14 +60,15 @@ func markBindVariable(yylex yyLexer, bvar string) { } %union { - statement Statement - selStmt SelectStatement - tableExpr TableExpr - expr Expr - colTuple ColTuple - optVal Expr - constraintInfo ConstraintInfo - alterOption AlterOption + statement Statement + selStmt SelectStatement + tableStmt TableStatement + tableExpr TableExpr + expr Expr + colTuple ColTuple + optVal Expr + constraintInfo ConstraintInfo + alterOption AlterOption ins *Insert colName *ColName @@ -434,7 +435,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %type prepare_statement execute_statement deallocate_statement %type stream_statement vstream_statement insert_statement update_statement delete_statement set_statement set_transaction_statement %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement -%type select_statement select_stmt_with_into query_expression_parens query_expression query_expression_body query_primary +%type select_statement select_stmt_with_into query_expression_parens query_expression query_expression_body query_primary values_statement %type with_clause_opt with_clause %type common_table_expr %type with_list @@ -517,8 +518,8 @@ func markBindVariable(yylex yyLexer, bvar string) { %type is_suffix %type col_tuple %type expression_list expression_list_opt window_partition_clause_opt -%type tuple_list -%type row_tuple tuple_or_empty +%type row_tuple_list val_tuple_list +%type val_tuple row_tuple val_tuple_or_empty row_tuple_or_empty val_or_row_tuple %type subquery %type derived_table %type column_name after_opt @@ -769,7 +770,7 @@ query_expression_parens: } | openb query_expression locking_clause closeb { - setLockInSelect($2, $3) + setLockIfPossible(yylex, $2, $3) $$ = $2 } @@ -810,9 +811,9 @@ query_expression: | with_clause query_expression_body order_by_opt limit_opt { $2.SetWith($1) - $2.SetOrderBy($3) - $2.SetLimit($4) - $$ = $2 + $2.SetOrderBy($3) + $2.SetLimit($4) + $$ = $2 } | with_clause query_expression_parens limit_clause { @@ -865,7 +866,7 @@ query_expression } | query_expression locking_clause { - setLockInSelect($1, $2) + setLockIfPossible(yylex, $1, $2) $$ = $1 } | query_expression_parens @@ -884,27 +885,37 @@ select_stmt_with_into: } | query_expression into_clause { - $1.SetInto($2) + setIntoIfPossible(yylex, $1, $2) $$ = $1 } | query_expression into_clause locking_clause { - $1.SetInto($2) - $1.SetLock($3) + setIntoIfPossible(yylex, $1, $2) + setLockIfPossible(yylex, $1, $3) $$ = $1 } | query_expression locking_clause into_clause { - $1.SetInto($3) - $1.SetLock($2) + setLockIfPossible(yylex, $1, $2) + setIntoIfPossible(yylex, $1, $3) $$ = $1 } | query_expression_parens into_clause { - $1.SetInto($2) + setIntoIfPossible(yylex, $1, $2) $$ = $1 } +values_statement: + VALUES comment_opt LIST_ARG + { + $$ = &ValuesStatement{Comments: Comments($2).Parsed(), ListArg: ListArg($3[2:])} + } +| VALUES comment_opt row_tuple_list + { + $$ = &ValuesStatement{Comments: Comments($2).Parsed(), Rows: $3} + } + stream_statement: STREAM comment_opt select_expression FROM table_name { @@ -928,6 +939,10 @@ query_primary: { $$ = NewSelect(Comments($2), $4/*SelectExprs*/, $3/*options*/, nil, $5/*from*/, NewWhere(WhereClause, $6), $7, NewWhere(HavingClause, $8), $9) } +| values_statement + { + $$ = $1 + } insert_statement: insert_or_replace comment_opt ignore_opt into_table_name opt_partition_clause insert_data on_dup_opt @@ -3871,7 +3886,7 @@ subpartition_definition_attribute_list_opt: } partition_value_range: - VALUES LESS THAN row_tuple + VALUES LESS THAN val_tuple { $$ = &PartitionValueRange{ Type: LessThanType, @@ -3885,7 +3900,7 @@ partition_value_range: Maxvalue: true, } } -| VALUES IN row_tuple +| VALUES IN val_tuple { $$ = &PartitionValueRange{ Type: InType, @@ -5918,7 +5933,7 @@ any_all_compare: } col_tuple: - row_tuple + val_tuple { $$ = $1 } @@ -7818,7 +7833,7 @@ optionally_opt: // Because the rules are together, the parser can keep shifting // the tokens until it disambiguates a as sql_id and select as keyword. insert_data: - VALUES tuple_list row_alias_opt + VALUES val_tuple_list row_alias_opt { $$ = &Insert{Rows: $2, RowAlias: $3} } @@ -7826,11 +7841,11 @@ insert_data: { $$ = &Insert{Rows: $1} } -| openb ins_column_list closeb VALUES tuple_list row_alias_opt +| openb ins_column_list closeb VALUES val_tuple_list row_alias_opt { $$ = &Insert{Columns: $2, Rows: $5, RowAlias: $6} } -| openb closeb VALUES tuple_list row_alias_opt +| openb closeb VALUES val_tuple_list row_alias_opt { $$ = &Insert{Columns: []IdentifierCI{}, Rows: $4, RowAlias: $5} } @@ -7879,37 +7894,64 @@ on_dup_opt: $$ = $5 } -tuple_list: - tuple_or_empty +row_tuple_list: + row_tuple_or_empty { $$ = Values{$1} } -| tuple_list ',' tuple_or_empty +| row_tuple_list ',' row_tuple_or_empty { $$ = append($1, $3) } -tuple_or_empty: +val_tuple_list: + val_tuple_or_empty + { + $$ = Values{$1} + } +| val_tuple_list ',' val_tuple_or_empty + { + $$ = append($1, $3) + } + +row_tuple_or_empty: row_tuple { $$ = $1 } +| ROW openb closeb + { + $$ = ValTuple{} + } + +val_tuple_or_empty: + val_tuple + { + $$ = $1 + } | openb closeb { $$ = ValTuple{} } -row_tuple: +val_tuple: openb expression_list closeb { $$ = ValTuple($2) } -| ROW openb expression_list closeb + +row_tuple: + ROW openb expression_list closeb { $$ = ValTuple($3) } + +val_or_row_tuple: + val_tuple +| row_tuple + tuple_expression: - row_tuple + val_or_row_tuple { if len($1) == 1 { $$ = $1[0] diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 65cd1a96181..94697c22e91 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -621,7 +621,10 @@ func (t *explainTablet) handleSelect(query string) (*sqltypes.Result, error) { case *sqlparser.Select: selStmt = stmt case *sqlparser.Union: - selStmt = sqlparser.GetFirstSelect(stmt) + selStmt, err = sqlparser.GetFirstSelect(stmt) + if err != nil { + return nil, err + } default: return nil, fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) } diff --git a/go/vt/vtgate/executorcontext/vcursor_impl.go b/go/vt/vtgate/executorcontext/vcursor_impl.go index 3f8d7def797..39a91416321 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl.go @@ -406,7 +406,7 @@ func (vc *VCursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, str return table, destKeyspace, destTabletType, dest, err } -func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.SelectStatement { +func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.TableStatement { ks, _, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) if err != nil { return nil diff --git a/go/vt/vtgate/planbuilder/ddl.go b/go/vt/vtgate/planbuilder/ddl.go index a0045cec060..332f2aaa6c3 100644 --- a/go/vt/vtgate/planbuilder/ddl.go +++ b/go/vt/vtgate/planbuilder/ddl.go @@ -196,7 +196,7 @@ func buildCreateViewCommon( vschema plancontext.VSchema, reservedVars *sqlparser.ReservedVars, cfg dynamicconfig.DDL, - ddlSelect sqlparser.SelectStatement, + ddlSelect sqlparser.TableStatement, ddl sqlparser.DDLStatement, ) (key.Destination, *vindexes.Keyspace, error) { // For Create View, we require that the keyspace exist and the select query can be satisfied within the keyspace itself diff --git a/go/vt/vtgate/planbuilder/operators/SQL_builder.go b/go/vt/vtgate/planbuilder/operators/SQL_builder.go index fc91569981d..ca15b5c9134 100644 --- a/go/vt/vtgate/planbuilder/operators/SQL_builder.go +++ b/go/vt/vtgate/planbuilder/operators/SQL_builder.go @@ -37,8 +37,9 @@ type ( } ) -func (qb *queryBuilder) asSelectStatement() sqlparser.SelectStatement { - return qb.stmt.(sqlparser.SelectStatement) +func (qb *queryBuilder) asSelectStatement() sqlparser.TableStatement { + return qb.stmt.(sqlparser.TableStatement) + } func (qb *queryBuilder) asOrderAndLimit() sqlparser.OrderAndLimit { return qb.stmt.(sqlparser.OrderAndLimit) @@ -191,7 +192,8 @@ func (qb *queryBuilder) pushUnionInsideDerived() { As: sqlparser.NewIdentifierCS("dt"), }}, } - sel.SelectExprs = unionSelects(sqlparser.GetFirstSelect(selStmt).SelectExprs) + firstSelect := getFirstSelect(selStmt) + sel.SelectExprs = unionSelects(firstSelect.SelectExprs) qb.stmt = sel } @@ -208,9 +210,10 @@ func unionSelects(exprs sqlparser.SelectExprs) (selectExprs sqlparser.SelectExpr return } -func checkUnionColumnByName(column *sqlparser.ColName, sel sqlparser.SelectStatement) { +func checkUnionColumnByName(column *sqlparser.ColName, sel sqlparser.TableStatement) { colName := column.Name.String() - exprs := sqlparser.GetFirstSelect(sel).SelectExprs + firstSelect := getFirstSelect(sel) + exprs := firstSelect.SelectExprs offset := slices.IndexFunc(exprs, func(expr sqlparser.SelectExpr) bool { switch ae := expr.(type) { case *sqlparser.StarExpr: @@ -244,8 +247,8 @@ func (qb *queryBuilder) unionWith(other *queryBuilder, distinct bool) { func (qb *queryBuilder) recursiveCteWith(other *queryBuilder, name, alias string, distinct bool, columns sqlparser.Columns) { cteUnion := &sqlparser.Union{ - Left: qb.stmt.(sqlparser.SelectStatement), - Right: other.stmt.(sqlparser.SelectStatement), + Left: qb.stmt.(sqlparser.TableStatement), + Right: other.stmt.(sqlparser.TableStatement), Distinct: distinct, } @@ -393,7 +396,7 @@ func removeKeyspaceFromSelectExpr(expr sqlparser.SelectExpr) { } } -func stripDownQuery(from, to sqlparser.SelectStatement) { +func stripDownQuery(from, to sqlparser.TableStatement) { switch node := from.(type) { case *sqlparser.Select: toNode, ok := to.(*sqlparser.Select) @@ -450,7 +453,12 @@ func buildQuery(op Operator, qb *queryBuilder) { buildUnion(op, qb) case *Distinct: buildQuery(op.Source, qb) - qb.asSelectStatement().MakeDistinct() + statement := qb.asSelectStatement() + d, ok := statement.(sqlparser.Distinctable) + if !ok { + panic(vterrors.VT13001("expected a select statement with distinct")) + } + d.MakeDistinct() case *Update: buildUpdate(op, qb) case *Delete: diff --git a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go index 73169369a41..ced81df147a 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go @@ -544,7 +544,7 @@ func splitAggrColumnsToLeftAndRight( canPushDistinctAggr, distinctExprs := checkIfWeCanPush(ctx, aggregator) - // Distinct aggregation cannot be pushed down in the join. + // Distinctable aggregation cannot be pushed down in the join. // We keep node of the distinct aggregation expression to be used later for ordering. if !canPushDistinctAggr { if len(distinctExprs) != 1 { diff --git a/go/vt/vtgate/planbuilder/operators/ast_to_op.go b/go/vt/vtgate/planbuilder/operators/ast_to_op.go index 12c19bb72a6..2e3781c94db 100644 --- a/go/vt/vtgate/planbuilder/operators/ast_to_op.go +++ b/go/vt/vtgate/planbuilder/operators/ast_to_op.go @@ -178,7 +178,7 @@ func createOperatorFromUnion(ctx *plancontext.PlanningContext, node *sqlparser.U return newHorizon(union, node) } -func translateQueryToOpForUnion(ctx *plancontext.PlanningContext, node sqlparser.SelectStatement) Operator { +func translateQueryToOpForUnion(ctx *plancontext.PlanningContext, node sqlparser.TableStatement) Operator { op := translateQueryToOp(ctx, node) if hz, ok := op.(*Horizon); ok { hz.Truncate = true diff --git a/go/vt/vtgate/planbuilder/operators/expressions.go b/go/vt/vtgate/planbuilder/operators/expressions.go index 38848693775..f42ec87404d 100644 --- a/go/vt/vtgate/planbuilder/operators/expressions.go +++ b/go/vt/vtgate/planbuilder/operators/expressions.go @@ -121,3 +121,11 @@ func simplifyPredicates(ctx *plancontext.PlanningContext, in sqlparser.Expr) sql } return output } + +func getFirstSelect(selStmt sqlparser.TableStatement) *sqlparser.Select { + firstSelect, err := sqlparser.GetFirstSelect(selStmt) + if err != nil { + panic(err) + } + return firstSelect +} diff --git a/go/vt/vtgate/planbuilder/operators/horizon.go b/go/vt/vtgate/planbuilder/operators/horizon.go index 292be1b37c5..aa7737001d6 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon.go +++ b/go/vt/vtgate/planbuilder/operators/horizon.go @@ -45,7 +45,7 @@ type Horizon struct { // QP contains the QueryProjection for this op QP *QueryProjection - Query sqlparser.SelectStatement + Query sqlparser.TableStatement // Columns needed to feed other plans Columns []*sqlparser.ColName @@ -54,7 +54,7 @@ type Horizon struct { Truncate bool } -func newHorizon(src Operator, query sqlparser.SelectStatement) *Horizon { +func newHorizon(src Operator, query sqlparser.TableStatement) *Horizon { return &Horizon{ unaryOperator: newUnaryOp(src), Query: query, @@ -148,7 +148,7 @@ func (h *Horizon) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, return -1 } - for idx, se := range sqlparser.GetFirstSelect(h.Query).SelectExprs { + for idx, se := range getFirstSelect(h.Query).SelectExprs { ae, ok := se.(*sqlparser.AliasedExpr) if !ok { panic(vterrors.VT09015()) @@ -174,7 +174,7 @@ func (h *Horizon) GetColumns(ctx *plancontext.PlanningContext) (exprs []*sqlpars } func (h *Horizon) GetSelectExprs(*plancontext.PlanningContext) sqlparser.SelectExprs { - return sqlparser.GetFirstSelect(h.Query).SelectExprs + return getFirstSelect(h.Query).SelectExprs } func (h *Horizon) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { @@ -185,7 +185,7 @@ func (h *Horizon) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { } // TODO: REMOVE -func (h *Horizon) selectStatement() sqlparser.SelectStatement { +func (h *Horizon) selectStatement() sqlparser.TableStatement { return h.Query } diff --git a/go/vt/vtgate/planbuilder/operators/insert.go b/go/vt/vtgate/planbuilder/operators/insert.go index 4ce37901a77..ae125dea19c 100644 --- a/go/vt/vtgate/planbuilder/operators/insert.go +++ b/go/vt/vtgate/planbuilder/operators/insert.go @@ -394,7 +394,7 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I case sqlparser.Values: op = route route.Source = insertRowsPlan(ctx, insOp, insStmt, rows) - case sqlparser.SelectStatement: + case sqlparser.TableStatement: op = insertSelectPlan(ctx, insOp, route, insStmt, rows) } if insStmt.Comments != nil { @@ -408,7 +408,7 @@ func insertSelectPlan( insOp *Insert, routeOp *Route, ins *sqlparser.Insert, - sel sqlparser.SelectStatement, + sel sqlparser.TableStatement, ) *InsertSelection { if columnMismatch(insOp.AutoIncrement, ins, sel) { panic(vterrors.VT03006()) @@ -457,7 +457,7 @@ func insertSelectPlan( return insertSelect } -func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.SelectStatement) bool { +func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.TableStatement) bool { origColCount := len(ins.Columns) if gen != nil && gen.added { // One column got added to the insert query ast for auto increment column. @@ -468,7 +468,7 @@ func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.SelectSt return true } if origColCount > sel.GetColumnCount() { - sel := sqlparser.GetFirstSelect(sel) + sel := getFirstSelect(sel) var hasStarExpr bool for _, sExpr := range sel.SelectExprs { if _, hasStarExpr = sExpr.(*sqlparser.StarExpr); hasStarExpr { diff --git a/go/vt/vtgate/planbuilder/operators/query_planning.go b/go/vt/vtgate/planbuilder/operators/query_planning.go index 5fe0c7773c1..db716966d47 100644 --- a/go/vt/vtgate/planbuilder/operators/query_planning.go +++ b/go/vt/vtgate/planbuilder/operators/query_planning.go @@ -32,7 +32,7 @@ import ( func planQuery(ctx *plancontext.PlanningContext, root Operator) Operator { var selExpr sqlparser.SelectExprs if horizon, isHorizon := root.(*Horizon); isHorizon { - sel := sqlparser.GetFirstSelect(horizon.Query) + sel := getFirstSelect(horizon.Query) selExpr = sqlparser.Clone(sel.SelectExprs) } @@ -207,7 +207,7 @@ func pushOrExpandHorizon(ctx *plancontext.PlanningContext, in *Horizon) (Operato !hasHaving && !needsOrdering && !qp.NeedsAggregation() && - !in.selectStatement().IsDistinct() && + !isDistinctAST(in.selectStatement()) && in.selectStatement().GetLimit() == nil if canPush { @@ -784,7 +784,7 @@ func isDistinct(op Operator) bool { case *Union: return op.distinct case *Horizon: - return op.Query.IsDistinct() + return isDistinctAST(op.Query) case *Limit: return isDistinct(op.Source) default: @@ -792,6 +792,13 @@ func isDistinct(op Operator) bool { } } +func isDistinctAST(s sqlparser.Statement) bool { + if d, ok := s.(sqlparser.Distinctable); ok { + return d.IsDistinct() + } + return false +} + func tryPushUnion(ctx *plancontext.PlanningContext, op *Union) (Operator, *ApplyResult) { if res := compactUnion(op); res != NoRewrite { return op, res diff --git a/go/vt/vtgate/planbuilder/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index a245831ca13..c66bf757dd8 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -203,7 +203,7 @@ func (qp *QueryProjection) addSelectExpressions(ctx *plancontext.PlanningContext func createQPFromUnion(ctx *plancontext.PlanningContext, union *sqlparser.Union) *QueryProjection { qp := &QueryProjection{} - sel := sqlparser.GetFirstSelect(union) + sel := getFirstSelect(union) qp.addSelectExpressions(ctx, sel) qp.addOrderBy(ctx, union.OrderBy) @@ -714,7 +714,7 @@ func CompareRefInt(a *int, b *int) bool { return *a < *b } -func CreateQPFromSelectStatement(ctx *plancontext.PlanningContext, stmt sqlparser.SelectStatement) *QueryProjection { +func CreateQPFromSelectStatement(ctx *plancontext.PlanningContext, stmt sqlparser.TableStatement) *QueryProjection { switch sel := stmt.(type) { case *sqlparser.Select: return createQPFromSelect(ctx, sel) diff --git a/go/vt/vtgate/planbuilder/operators/subquery_builder.go b/go/vt/vtgate/planbuilder/operators/subquery_builder.go index c2256df06f4..6ec5ecdd7f3 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_builder.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_builder.go @@ -115,7 +115,7 @@ func createSubqueryOp( // inspectStatement goes through all the predicates contained in the AST // and extracts subqueries into operators func (sqb *SubQueryBuilder) inspectStatement(ctx *plancontext.PlanningContext, - stmt sqlparser.SelectStatement, + stmt sqlparser.TableStatement, ) (sqlparser.Exprs, []applyJoinColumn) { switch stmt := stmt.(type) { case *sqlparser.Select: diff --git a/go/vt/vtgate/planbuilder/operators/subquery_planning.go b/go/vt/vtgate/planbuilder/operators/subquery_planning.go index e222ae0f343..06ca69dd7f3 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_planning.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_planning.go @@ -30,7 +30,7 @@ import ( "vitess.io/vitess/go/vt/vtgate/semantics" ) -func isMergeable(ctx *plancontext.PlanningContext, query sqlparser.SelectStatement, op Operator) bool { +func isMergeable(ctx *plancontext.PlanningContext, query sqlparser.TableStatement, op Operator) bool { validVindex := func(expr sqlparser.Expr) bool { sc := findColumnVindex(ctx, op, expr) return sc != nil && sc.IsUnique() @@ -672,7 +672,7 @@ func (s *subqueryRouteMerger) rewriteASTExpression(ctx *plancontext.PlanningCont if err != nil { panic(err) } - subqStmt, ok := stmt.(sqlparser.SelectStatement) + subqStmt, ok := stmt.(sqlparser.TableStatement) if !ok { panic(vterrors.VT13001("subqueries should only be select statement")) } @@ -700,7 +700,7 @@ func (s *subqueryRouteMerger) rewriteASTExpression(ctx *plancontext.PlanningCont if !deps.IsSolvedBy(subqID) { cursor.Replace(exprFound) } - }, nil).(sqlparser.SelectStatement) + }, nil).(sqlparser.TableStatement) if err != nil { panic(err) } diff --git a/go/vt/vtgate/planbuilder/operators/union.go b/go/vt/vtgate/planbuilder/operators/union.go index 7d09391cf7d..1c692c9f38e 100644 --- a/go/vt/vtgate/planbuilder/operators/union.go +++ b/go/vt/vtgate/planbuilder/operators/union.go @@ -150,7 +150,7 @@ func (u *Union) GetSelectFor(source int) *sqlparser.Select { for { switch op := src.(type) { case *Horizon: - return sqlparser.GetFirstSelect(op.Query) + return getFirstSelect(op.Query) case *Route: src = op.Source default: diff --git a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go index e5e96b0a4be..87b18ee436a 100644 --- a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go +++ b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go @@ -191,7 +191,7 @@ func (v *vschema) FindTable(tablename sqlparser.TableName) (*vindexes.Table, str panic("implement me") } -func (v *vschema) FindView(name sqlparser.TableName) sqlparser.SelectStatement { +func (v *vschema) FindView(name sqlparser.TableName) sqlparser.TableStatement { // TODO implement me panic("implement me") } diff --git a/go/vt/vtgate/planbuilder/plancontext/vschema.go b/go/vt/vtgate/planbuilder/plancontext/vschema.go index b4560424718..7a2273afe46 100644 --- a/go/vt/vtgate/planbuilder/plancontext/vschema.go +++ b/go/vt/vtgate/planbuilder/plancontext/vschema.go @@ -25,7 +25,7 @@ type PlannerVersion = querypb.ExecuteOptions_PlannerVersion // info about tables. type VSchema interface { FindTable(tablename sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) - FindView(name sqlparser.TableName) sqlparser.SelectStatement + FindView(name sqlparser.TableName) sqlparser.TableStatement FindTableOrVindex(tablename sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) // SelectedKeyspace returns the current keyspace if set, otherwise returns an error diff --git a/go/vt/vtgate/planbuilder/simplifier_test.go b/go/vt/vtgate/planbuilder/simplifier_test.go index dce21b3e175..5aeb0565f9b 100644 --- a/go/vt/vtgate/planbuilder/simplifier_test.go +++ b/go/vt/vtgate/planbuilder/simplifier_test.go @@ -49,7 +49,7 @@ func TestSimplifyBuggyQuery(t *testing.T) { reservedVars := sqlparser.NewReservedVars("vtg", reserved) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepSameError(query, reservedVars, vw, rewritten.BindVarNeeds), @@ -73,7 +73,7 @@ func TestSimplifyPanic(t *testing.T) { reservedVars := sqlparser.NewReservedVars("vtg", reserved) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepPanicking(query, reservedVars, vw, rewritten.BindVarNeeds), @@ -95,7 +95,7 @@ func TestUnsupportedFile(t *testing.T) { log.Errorf("unsupported_cases.txt - %s", tcase.Query) stmt, reserved, err := sqlparser.NewTestParser().Parse2(tcase.Query) require.NoError(t, err) - _, ok := stmt.(sqlparser.SelectStatement) + _, ok := stmt.(sqlparser.TableStatement) if !ok { t.Skip() return @@ -110,7 +110,7 @@ func TestUnsupportedFile(t *testing.T) { origQuery := sqlparser.String(ast) stmt, _, _ = sqlparser.NewTestParser().Parse2(tcase.Query) simplified := simplifier.SimplifyStatement( - stmt.(sqlparser.SelectStatement), + stmt.(sqlparser.TableStatement), vw.CurrentDb(), vw, keepSameError(tcase.Query, reservedVars, vw, rewritten.BindVarNeeds), @@ -128,7 +128,7 @@ func TestUnsupportedFile(t *testing.T) { } } -func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.SelectStatement) bool { +func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.TableStatement) bool { stmt, _, err := sqlparser.NewTestParser().Parse2(query) if err != nil { panic(err) @@ -139,7 +139,7 @@ func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema * if expected == nil { panic("query does not fail to plan") } - return func(statement sqlparser.SelectStatement) bool { + return func(statement sqlparser.TableStatement) bool { _, myErr := BuildFromStmt(context.Background(), query, statement, reservedVars, vschema, needs, staticConfig{}) if myErr == nil { return false @@ -152,8 +152,8 @@ func keepSameError(query string, reservedVars *sqlparser.ReservedVars, vschema * } } -func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.SelectStatement) bool { - cmp := func(statement sqlparser.SelectStatement) (res bool) { +func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema *vschemawrapper.VSchemaWrapper, needs *sqlparser.BindVarNeeds) func(statement sqlparser.TableStatement) bool { + cmp := func(statement sqlparser.TableStatement) (res bool) { defer func() { r := recover() if r != nil { @@ -172,7 +172,7 @@ func keepPanicking(query string, reservedVars *sqlparser.ReservedVars, vschema * if err != nil { panic(err.Error()) } - if !cmp(stmt.(sqlparser.SelectStatement)) { + if !cmp(stmt.(sqlparser.TableStatement)) { panic("query is not panicking") } diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index a1b2009d0e1..8fa41712223 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -73,7 +73,7 @@ func NewTracker(ch chan *discovery.TabletHealth, enableViews, enableUDFs bool, p } if enableViews { - t.views = &viewMap{m: map[keyspaceStr]map[viewNameStr]sqlparser.SelectStatement{}, parser: parser} + t.views = &viewMap{m: map[keyspaceStr]map[viewNameStr]sqlparser.TableStatement{}, parser: parser} } if enableUDFs { t.udfs = map[keyspaceStr][]string{} @@ -283,7 +283,7 @@ func (t *Tracker) Tables(ks string) map[string]*vindexes.TableInfo { } // Views returns all known views in the keyspace with their definition. -func (t *Tracker) Views(ks string) map[string]sqlparser.SelectStatement { +func (t *Tracker) Views(ks string) map[string]sqlparser.TableStatement { if t.views == nil { return nil } @@ -525,14 +525,14 @@ func (t *Tracker) clearKeyspaceTables(ks string) { } type viewMap struct { - m map[keyspaceStr]map[viewNameStr]sqlparser.SelectStatement + m map[keyspaceStr]map[viewNameStr]sqlparser.TableStatement parser *sqlparser.Parser } func (vm *viewMap) set(ks, tbl, sql string) { m := vm.m[ks] if m == nil { - m = make(map[tableNameStr]sqlparser.SelectStatement) + m = make(map[tableNameStr]sqlparser.TableStatement) vm.m[ks] = m } stmt, err := vm.parser.Parse(sql) @@ -548,7 +548,7 @@ func (vm *viewMap) set(ks, tbl, sql string) { m[tbl] = cv.Select } -func (vm *viewMap) get(ks, tbl string) sqlparser.SelectStatement { +func (vm *viewMap) get(ks, tbl string) sqlparser.TableStatement { m := vm.m[ks] if m == nil { return nil @@ -571,7 +571,7 @@ func (t *Tracker) clearKeyspaceViews(ks string) { } // GetViews returns the view statement for the given keyspace and view name. -func (t *Tracker) GetViews(ks string, tbl string) sqlparser.SelectStatement { +func (t *Tracker) GetViews(ks string, tbl string) sqlparser.TableStatement { t.mu.Lock() defer t.mu.Unlock() diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index 62cdc019ddf..c4e7dc55866 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -286,14 +286,22 @@ func containsStar(s sqlparser.SelectExprs) bool { } func checkUnionColumns(union *sqlparser.Union) error { - firstProj := sqlparser.GetFirstSelect(union).SelectExprs + lft, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } + firstProj := lft.GetColumns() if containsStar(firstProj) { // if we still have *, we can't figure out if the query is invalid or not // we'll fail it at run time instead return nil } - secondProj := sqlparser.GetFirstSelect(union.Right).SelectExprs + rgt, err := sqlparser.GetFirstSelect(union.Right) + if err != nil { + return err + } + secondProj := rgt.GetColumns() if containsStar(secondProj) { return nil } diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index de8fbdee0d7..3f7a21cb6ac 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -1003,8 +1003,10 @@ func TestUnionWithOrderBy(t *testing.T) { stmt, semTable := parseAndAnalyze(t, query, "") union, _ := stmt.(*sqlparser.Union) - sel1 := sqlparser.GetFirstSelect(union) - sel2 := sqlparser.GetFirstSelect(union.Right) + sel1, err := sqlparser.GetFirstSelect(union) + require.NoError(t, err) + sel2, err := sqlparser.GetFirstSelect(union.Right) + require.NoError(t, err) t1 := sel1.From[0].(*sqlparser.AliasedTableExpr) t2 := sel2.From[0].(*sqlparser.AliasedTableExpr) diff --git a/go/vt/vtgate/semantics/cte_table.go b/go/vt/vtgate/semantics/cte_table.go index 498fc5076c1..7083fea10d2 100644 --- a/go/vt/vtgate/semantics/cte_table.go +++ b/go/vt/vtgate/semantics/cte_table.go @@ -150,7 +150,7 @@ func (cte *CTETable) GetMirrorRule() *vindexes.MirrorRule { type CTE struct { Name string - Query sqlparser.SelectStatement + Query sqlparser.TableStatement isAuthoritative bool recursiveDeps *TableSet Columns sqlparser.Columns diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 3e53ed0816a..64426e25748 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -385,12 +385,16 @@ func getIntLiteral(e sqlparser.Expr) *sqlparser.Literal { // handleOrderBy processes the ORDER BY clause. func (r *earlyRewriter) handleOrderBy(parent sqlparser.SQLNode, iter iterator) error { - stmt, ok := parent.(sqlparser.SelectStatement) + stmt, ok := parent.(sqlparser.TableStatement) if !ok { return nil } - sel := sqlparser.GetFirstSelect(stmt) + sel, err := sqlparser.GetFirstSelect(stmt) + if err != nil { + return err + } + for e := iter.next(); e != nil; e = iter.next() { lit, err := r.replaceLiteralsInOrderBy(e, iter) if err != nil { @@ -419,12 +423,15 @@ func (r *earlyRewriter) handleOrderBy(parent sqlparser.SQLNode, iter iterator) e // handleGroupBy processes the GROUP BY clause. func (r *earlyRewriter) handleGroupBy(parent sqlparser.SQLNode, iter iterator) error { - stmt, ok := parent.(sqlparser.SelectStatement) + stmt, ok := parent.(*sqlparser.Select) if !ok { return nil } - sel := sqlparser.GetFirstSelect(stmt) + sel, err := sqlparser.GetFirstSelect(stmt) + if err != nil { + return err + } for e := iter.next(); e != nil; e = iter.next() { expr, err := r.replaceLiteralsInGroupBy(e) if err != nil { @@ -435,7 +442,6 @@ func (r *earlyRewriter) handleGroupBy(parent sqlparser.SQLNode, iter iterator) e if err != nil { return err } - } err = iter.replace(expr) if err != nil { diff --git a/go/vt/vtgate/semantics/scoper.go b/go/vt/vtgate/semantics/scoper.go index 9d596d9ecd1..e6df3c3a5b0 100644 --- a/go/vt/vtgate/semantics/scoper.go +++ b/go/vt/vtgate/semantics/scoper.go @@ -297,11 +297,11 @@ func (s *scoper) createSpecialScopePostProjection(parent sqlparser.SQLNode) erro for i, sel := range sqlparser.GetAllSelects(parent) { if i == 0 { nScope.stmt = sel - tableInfo = createVTableInfoForExpressions(sel.SelectExprs, nil /*needed for star expressions*/, s.org) + tableInfo = createVTableInfoForExpressions(sel.GetColumns(), nil /*needed for star expressions*/, s.org) nScope.tables = append(nScope.tables, tableInfo) continue } - thisTableInfo := createVTableInfoForExpressions(sel.SelectExprs, nil /*needed for star expressions*/, s.org) + thisTableInfo := createVTableInfoForExpressions(sel.GetColumns(), nil /*needed for star expressions*/, s.org) if len(tableInfo.cols) != len(thisTableInfo.cols) { return vterrors.NewErrorf(vtrpcpb.Code_FAILED_PRECONDITION, vterrors.WrongNumberOfColumnsInSelect, "The used SELECT statements have a different number of columns") } diff --git a/go/vt/vtgate/semantics/semantic_table.go b/go/vt/vtgate/semantics/semantic_table.go index 30a41ba5f12..e3eead71c90 100644 --- a/go/vt/vtgate/semantics/semantic_table.go +++ b/go/vt/vtgate/semantics/semantic_table.go @@ -493,7 +493,7 @@ func (st *SemTable) ForeignKeysPresent() bool { return false } -func (st *SemTable) SelectExprs(sel sqlparser.SelectStatement) sqlparser.SelectExprs { +func (st *SemTable) SelectExprs(sel sqlparser.TableStatement) sqlparser.SelectExprs { switch sel := sel.(type) { case *sqlparser.Select: return sel.SelectExprs diff --git a/go/vt/vtgate/semantics/table_collector.go b/go/vt/vtgate/semantics/table_collector.go index 45a50fd23a2..329ebcef254 100644 --- a/go/vt/vtgate/semantics/table_collector.go +++ b/go/vt/vtgate/semantics/table_collector.go @@ -154,8 +154,11 @@ func (tc *tableCollector) visitAliasedTableExpr(node *sqlparser.AliasedTableExpr } func (tc *tableCollector) visitUnion(union *sqlparser.Union) error { - firstSelect := sqlparser.GetFirstSelect(union) - expanded, selectExprs := getColumnNames(firstSelect.SelectExprs) + firstSelect, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } + expanded, selectExprs := getColumnNames(firstSelect.GetColumns()) info := unionInfo{ isAuthoritative: expanded, exprs: selectExprs, @@ -165,12 +168,12 @@ func (tc *tableCollector) visitUnion(union *sqlparser.Union) error { return nil } - size := len(firstSelect.SelectExprs) + size := firstSelect.GetColumnCount() info.recursive = make([]TableSet, size) typers := make([]evalengine.TypeAggregator, size) collations := tc.org.collationEnv() - err := sqlparser.VisitAllSelects(union, func(s *sqlparser.Select, idx int) error { + err = sqlparser.VisitAllSelects(union, func(s *sqlparser.Select, idx int) error { for i, expr := range s.SelectExprs { ae, ok := expr.(*sqlparser.AliasedExpr) if !ok { @@ -413,7 +416,10 @@ func checkValidRecursiveCTE(cteDef *CTE) error { return vterrors.VT09026(cteDef.Name) } - firstSelect := sqlparser.GetFirstSelect(union.Right) + firstSelect, err := sqlparser.GetFirstSelect(union.Right) + if err != nil { + return err + } if firstSelect.GroupBy != nil { return vterrors.VT09027(cteDef.Name) } @@ -470,8 +476,16 @@ func (tc *tableCollector) addSelectDerivedTable( return scope.addTable(tableInfo) } -func (tc *tableCollector) addUnionDerivedTable(union *sqlparser.Union, node *sqlparser.AliasedTableExpr, columns sqlparser.Columns, alias sqlparser.IdentifierCS) error { - firstSelect := sqlparser.GetFirstSelect(union) +func (tc *tableCollector) addUnionDerivedTable( + union *sqlparser.Union, + node *sqlparser.AliasedTableExpr, + columns sqlparser.Columns, + alias sqlparser.IdentifierCS, +) error { + firstSelect, err := sqlparser.GetFirstSelect(union) + if err != nil { + return err + } tables := tc.scoper.wScope[firstSelect] info, found := tc.unionInfo[union] if !found { diff --git a/go/vt/vtgate/simplifier/simplifier.go b/go/vt/vtgate/simplifier/simplifier.go index e838450e3a2..c15e2ea58d1 100644 --- a/go/vt/vtgate/simplifier/simplifier.go +++ b/go/vt/vtgate/simplifier/simplifier.go @@ -25,17 +25,17 @@ import ( // SimplifyStatement simplifies the AST of a query. It basically iteratively prunes leaves of the AST, as long as the pruning // continues to return true from the `test` function. func SimplifyStatement( - in sqlparser.SelectStatement, + in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation, - testF func(sqlparser.SelectStatement) bool, -) sqlparser.SelectStatement { + testF func(sqlparser.TableStatement) bool, +) sqlparser.TableStatement { tables, err := getTables(in, currentDB, si) if err != nil { panic(err) } - test := func(s sqlparser.SelectStatement) bool { + test := func(s sqlparser.TableStatement) bool { // Since our semantic analysis changes the AST, we clone it first, so we have a pristine AST to play with return testF(sqlparser.Clone(s)) } @@ -68,7 +68,7 @@ func SimplifyStatement( return in } -func trySimplifyDistinct(in sqlparser.SelectStatement, test func(statement sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func trySimplifyDistinct(in sqlparser.TableStatement, test func(statement sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true @@ -100,7 +100,7 @@ func trySimplifyDistinct(in sqlparser.SelectStatement, test func(statement sqlpa return nil } -func trySimplifyExpressions(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func trySimplifyExpressions(in sqlparser.TableStatement, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false visit := func(cursor expressionCursor) bool { // first - let's try to remove the expression @@ -141,7 +141,7 @@ func trySimplifyExpressions(in sqlparser.SelectStatement, test func(sqlparser.Se return nil } -func trySimplifyUnions(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) (res sqlparser.SelectStatement) { +func trySimplifyUnions(in sqlparser.TableStatement, test func(subquery sqlparser.TableStatement) bool) (res sqlparser.TableStatement) { if union, ok := in.(*sqlparser.Union); ok { // the root object is an UNION if test(sqlparser.Clone(union.Left)) { @@ -193,7 +193,7 @@ func trySimplifyUnions(in sqlparser.SelectStatement, test func(sqlparser.SelectS return nil } -func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.SelectStatement, currentDB string, si semantics.SchemaInformation, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { // we start by removing one table at a time, and see if we still have an interesting plan for idx, tbl := range tables { clone := sqlparser.Clone(in) @@ -209,7 +209,7 @@ func tryRemoveTable(tables []semantics.TableInfo, in sqlparser.SelectStatement, return nil } -func getTables(in sqlparser.SelectStatement, currentDB string, si semantics.SchemaInformation) ([]semantics.TableInfo, error) { +func getTables(in sqlparser.TableStatement, currentDB string, si semantics.SchemaInformation) ([]semantics.TableInfo, error) { // Since our semantic analysis changes the AST, we clone it first, so we have a pristine AST to play with clone := sqlparser.Clone(in) semTable, err := semantics.Analyze(clone, currentDB, si) @@ -219,7 +219,7 @@ func getTables(in sqlparser.SelectStatement, currentDB string, si semantics.Sche return semTable.Tables, nil } -func simplifyStarExpr(in sqlparser.SelectStatement, test func(sqlparser.SelectStatement) bool) sqlparser.SelectStatement { +func simplifyStarExpr(in sqlparser.TableStatement, test func(sqlparser.TableStatement) bool) sqlparser.TableStatement { simplified := false alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true @@ -254,7 +254,7 @@ func simplifyStarExpr(in sqlparser.SelectStatement, test func(sqlparser.SelectSt // removeTable removes the table with the given index from the select statement, which includes the FROM clause // but also all expressions and predicates that depend on the table -func removeTable(clone sqlparser.SelectStatement, searchedTS semantics.TableSet, db string, si semantics.SchemaInformation) bool { +func removeTable(clone sqlparser.TableStatement, searchedTS semantics.TableSet, db string, si semantics.SchemaInformation) bool { semTable, err := semantics.Analyze(clone, db, si) if err != nil { panic(err) @@ -429,7 +429,7 @@ func newExprCursor(expr sqlparser.Expr, replace func(replaceWith sqlparser.Expr) // This cursor has a few extra capabilities that the normal sqlparser.SafeRewrite does not have, // such as visiting and being able to change individual expressions in a AND tree // if visit returns true, then traversal continues, otherwise traversal stops -func visitAllExpressionsInAST(clone sqlparser.SelectStatement, visit func(expressionCursor) bool) { +func visitAllExpressionsInAST(clone sqlparser.TableStatement, visit func(expressionCursor) bool) { alwaysVisitChildren := func(node, parent sqlparser.SQLNode) bool { return true } diff --git a/go/vt/vtgate/simplifier/simplifier_test.go b/go/vt/vtgate/simplifier/simplifier_test.go index 340497da8ef..0948f720f2d 100644 --- a/go/vt/vtgate/simplifier/simplifier_test.go +++ b/go/vt/vtgate/simplifier/simplifier_test.go @@ -52,7 +52,7 @@ limit 123 offset 456 ` ast, err := sqlparser.NewTestParser().Parse(query) require.NoError(t, err) - visitAllExpressionsInAST(ast.(sqlparser.SelectStatement), func(cursor expressionCursor) bool { + visitAllExpressionsInAST(ast.(sqlparser.TableStatement), func(cursor expressionCursor) bool { fmt.Printf(">> found expression: %s\n", sqlparser.String(cursor.expr)) cursor.remove() fmt.Printf("remove: %s\n", sqlparser.String(ast)) @@ -70,7 +70,7 @@ func TestAbortExpressionCursor(t *testing.T) { query := "select user.id, count(*), unsharded.name from user join unsharded on 13 = 14 where unsharded.id = 42 and name = 'foo' and user.id = unsharded.id" ast, err := sqlparser.NewTestParser().Parse(query) require.NoError(t, err) - visitAllExpressionsInAST(ast.(sqlparser.SelectStatement), func(cursor expressionCursor) bool { + visitAllExpressionsInAST(ast.(sqlparser.TableStatement), func(cursor expressionCursor) bool { fmt.Println(sqlparser.String(cursor.expr)) cursor.replace(sqlparser.NewIntLiteral("1")) fmt.Println(sqlparser.String(ast)) diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 278dd6932ae..36fcb2045fa 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -263,7 +263,7 @@ type KeyspaceSchema struct { ForeignKeyMode vschemapb.Keyspace_ForeignKeyMode Tables map[string]*Table Vindexes map[string]Vindex - Views map[string]sqlparser.SelectStatement + Views map[string]sqlparser.TableStatement Error error MultiTenantSpec *vschemapb.MultiTenantSpec @@ -430,12 +430,12 @@ func (vschema *VSchema) AddView(ksname, viewName, query string, parser *sqlparse if err != nil { return err } - selectStmt, ok := ast.(sqlparser.SelectStatement) + selectStmt, ok := ast.(sqlparser.TableStatement) if !ok { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "expected SELECT or UNION query, got %T", ast) } if ks.Views == nil { - ks.Views = make(map[string]sqlparser.SelectStatement) + ks.Views = make(map[string]sqlparser.TableStatement) } ks.Views[viewName] = selectStmt t := &Table{ @@ -1476,7 +1476,7 @@ func (vschema *VSchema) FindTableOrVindex(keyspace, name string, tabletType topo return nil, nil, NotFoundError{TableName: name} } -func (vschema *VSchema) FindView(keyspace, name string) sqlparser.SelectStatement { +func (vschema *VSchema) FindView(keyspace, name string) sqlparser.TableStatement { if keyspace == "" { switch { case len(vschema.Keyspaces) == 1: diff --git a/go/vt/vtgate/vschema_manager.go b/go/vt/vtgate/vschema_manager.go index 290971c45ed..529f9a5a29d 100644 --- a/go/vt/vtgate/vschema_manager.go +++ b/go/vt/vtgate/vschema_manager.go @@ -49,7 +49,7 @@ type VSchemaManager struct { // SchemaInfo is an interface to schema tracker. type SchemaInfo interface { Tables(ks string) map[string]*vindexes.TableInfo - Views(ks string) map[string]sqlparser.SelectStatement + Views(ks string) map[string]sqlparser.TableStatement UDFs(ks string) []string } @@ -213,7 +213,7 @@ func (vm *VSchemaManager) updateFromSchema(vschema *vindexes.VSchema) { func (vm *VSchemaManager) updateViewInfo(ks *vindexes.KeyspaceSchema, ksName string) { views := vm.schema.Views(ksName) if views != nil { - ks.Views = make(map[string]sqlparser.SelectStatement, len(views)) + ks.Views = make(map[string]sqlparser.TableStatement, len(views)) for name, def := range views { ks.Views[name] = sqlparser.Clone(def) } diff --git a/go/vt/vtgate/vschema_manager_test.go b/go/vt/vtgate/vschema_manager_test.go index 8db0c2df05b..b4b7a20804f 100644 --- a/go/vt/vtgate/vschema_manager_test.go +++ b/go/vt/vtgate/vschema_manager_test.go @@ -900,7 +900,7 @@ func (f *fakeSchema) Tables(string) map[string]*vindexes.TableInfo { return f.t } -func (f *fakeSchema) Views(string) map[string]sqlparser.SelectStatement { +func (f *fakeSchema) Views(string) map[string]sqlparser.TableStatement { return nil } func (f *fakeSchema) UDFs(string) []string { return f.udfs } diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java index 26ad5fd11b3..318bf44d328 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java @@ -284,7 +284,8 @@ public void testNumericAndDateTimeEncoding() throws SQLException { Query.Type.HEXVAL, Query.Type.HEXNUM, Query.Type.BITNUM, - Query.Type.RAW + Query.Type.RAW, + Query.Type.ROW_TUPLE ); @Test diff --git a/proto/query.proto b/proto/query.proto index 27a04d77f0a..6c088566fc1 100644 --- a/proto/query.proto +++ b/proto/query.proto @@ -219,7 +219,11 @@ enum Type { // Properties: 35, IsQuoted. VECTOR = 2083; // RAW specifies a type which won't be quoted but the value used as-is while encoding. + // Properties: 36, None. RAW = 2084; + // ROW_TUPLE represents multiple rows. + // Properties: 37, None. + ROW_TUPLE = 2085; } // Value represents a typed value. diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index adb02034c92..234c7e0f323 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -40380,7 +40380,8 @@ export namespace query { HEXVAL = 4129, BITNUM = 4130, VECTOR = 2083, - RAW = 2084 + RAW = 2084, + ROW_TUPLE = 2085 } /** Properties of a Value. */ diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index d71d3e08fe5..f1935b2a9b3 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -95915,6 +95915,7 @@ export const query = $root.query = (() => { * @property {number} BITNUM=4130 BITNUM value * @property {number} VECTOR=2083 VECTOR value * @property {number} RAW=2084 RAW value + * @property {number} ROW_TUPLE=2085 ROW_TUPLE value */ query.Type = (function() { const valuesById = {}, values = Object.create(valuesById); @@ -95955,6 +95956,7 @@ export const query = $root.query = (() => { values[valuesById[4130] = "BITNUM"] = 4130; values[valuesById[2083] = "VECTOR"] = 2083; values[valuesById[2084] = "RAW"] = 2084; + values[valuesById[2085] = "ROW_TUPLE"] = 2085; return values; })(); @@ -96145,6 +96147,7 @@ export const query = $root.query = (() => { case 4130: case 2083: case 2084: + case 2085: break; } if (message.value != null && message.hasOwnProperty("value")) @@ -96320,6 +96323,10 @@ export const query = $root.query = (() => { case 2084: message.type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.type = 2085; + break; } if (object.value != null) if (typeof object.value === "string") @@ -96594,6 +96601,7 @@ export const query = $root.query = (() => { case 4130: case 2083: case 2084: + case 2085: break; } if (message.value != null && message.hasOwnProperty("value")) @@ -96778,6 +96786,10 @@ export const query = $root.query = (() => { case 2084: message.type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.type = 2085; + break; } if (object.value != null) if (typeof object.value === "string") @@ -98345,6 +98357,7 @@ export const query = $root.query = (() => { case 4130: case 2083: case 2084: + case 2085: break; } if (message.table != null && message.hasOwnProperty("table")) @@ -98546,6 +98559,10 @@ export const query = $root.query = (() => { case 2084: message.type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.type = 2085; + break; } if (object.table != null) message.table = String(object.table); @@ -115806,6 +115823,7 @@ export const query = $root.query = (() => { case 4130: case 2083: case 2084: + case 2085: break; } return null; @@ -115982,6 +116000,10 @@ export const query = $root.query = (() => { case 2084: message.return_type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.return_type = 2085; + break; } return message; }; @@ -119616,6 +119638,7 @@ export const vschema = $root.vschema = (() => { case 4130: case 2083: case 2084: + case 2085: break; } return null; @@ -119790,6 +119813,10 @@ export const vschema = $root.vschema = (() => { case 2084: message.tenant_id_column_type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.tenant_id_column_type = 2085; + break; } return message; }; @@ -121332,6 +121359,7 @@ export const vschema = $root.vschema = (() => { case 4130: case 2083: case 2084: + case 2085: break; } if (message.invisible != null && message.hasOwnProperty("invisible")) @@ -121533,6 +121561,10 @@ export const vschema = $root.vschema = (() => { case 2084: message.type = 2084; break; + case "ROW_TUPLE": + case 2085: + message.type = 2085; + break; } if (object.invisible != null) message.invisible = Boolean(object.invisible); From db4fca3aa5530e7114c333685862699f185da6ba Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Jan 2025 17:24:36 +0530 Subject: [PATCH 29/66] Remove shard targeted keyspace from database qualifier on the query (#17503) Signed-off-by: Harshit Gangal --- go/vt/sqlparser/ast_funcs.go | 48 ++++++++----------- go/vt/sqlparser/ast_funcs_test.go | 25 ++++++++++ go/vt/sqlparser/ast_test.go | 8 ---- go/vt/vtgate/planbuilder/builder.go | 4 -- go/vt/vtgate/planbuilder/bypass.go | 2 + .../testdata/bypass_keyrange_cases.json | 17 +++++++ .../testdata/bypass_shard_cases.json | 17 +++++++ 7 files changed, 80 insertions(+), 41 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 7e493ec5618..e28c17a4745 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -2429,48 +2429,38 @@ func RemoveKeyspaceInCol(in SQLNode) { }, in) } -// RemoveKeyspaceInTables removes the Qualifier on all TableNames in the AST -func RemoveKeyspaceInTables(in SQLNode) { - // Walk will only return an error if we return an error from the inner func. safe to ignore here - Rewrite(in, nil, func(cursor *Cursor) bool { - if tbl, ok := cursor.Node().(TableName); ok && tbl.Qualifier.NotEmpty() { - tbl.Qualifier = NewIdentifierCS("") - cursor.Replace(tbl) - } - - return true +// RemoveKeyspace removes the keyspace qualifier from all ColName and TableName +func RemoveKeyspace(in SQLNode) { + removeKeyspace(in, func(_ string) bool { + return true // Always remove }) } -// RemoveKeyspace removes the Qualifier.Qualifier on all ColNames and Qualifier on all TableNames in the AST -func RemoveKeyspace(in SQLNode) { - Rewrite(in, nil, func(cursor *Cursor) bool { - switch expr := cursor.Node().(type) { - case *ColName: - if expr.Qualifier.Qualifier.NotEmpty() { - expr.Qualifier.Qualifier = NewIdentifierCS("") - } - case TableName: - if expr.Qualifier.NotEmpty() { - expr.Qualifier = NewIdentifierCS("") - cursor.Replace(expr) - } - } - return true +// RemoveSpecificKeyspace removes the keyspace qualifier from all ColName and TableName +// when it matches the keyspace provided +func RemoveSpecificKeyspace(in SQLNode, keyspace string) { + removeKeyspace(in, func(qualifier string) bool { + return qualifier == keyspace // Remove only if it matches the provided keyspace }) } -// RemoveKeyspaceIgnoreSysSchema removes the Qualifier.Qualifier on all ColNames and Qualifier on all TableNames in the AST -// except for the system schema. +// RemoveKeyspaceIgnoreSysSchema removes the keyspace qualifier from all ColName and TableName +// except for the system schema qualifier. func RemoveKeyspaceIgnoreSysSchema(in SQLNode) { + removeKeyspace(in, func(qualifier string) bool { + return qualifier != "" && !SystemSchema(qualifier) // Remove if it's not empty and not a system schema + }) +} + +func removeKeyspace(in SQLNode, shouldRemove func(qualifier string) bool) { Rewrite(in, nil, func(cursor *Cursor) bool { switch expr := cursor.Node().(type) { case *ColName: - if expr.Qualifier.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.Qualifier.String()) { + if shouldRemove(expr.Qualifier.Qualifier.String()) { expr.Qualifier.Qualifier = NewIdentifierCS("") } case TableName: - if expr.Qualifier.NotEmpty() && !SystemSchema(expr.Qualifier.String()) { + if shouldRemove(expr.Qualifier.String()) { expr.Qualifier = NewIdentifierCS("") cursor.Replace(expr) } diff --git a/go/vt/sqlparser/ast_funcs_test.go b/go/vt/sqlparser/ast_funcs_test.go index a3b744729f4..009f3e6cc15 100644 --- a/go/vt/sqlparser/ast_funcs_test.go +++ b/go/vt/sqlparser/ast_funcs_test.go @@ -219,3 +219,28 @@ func TestExtractTables(t *testing.T) { }) } } + +// TestRemoveKeyspace tests the RemoveKeyspaceIgnoreSysSchema function. +// It removes all the keyspace except system schema. +func TestRemoveKeyspaceIgnoreSysSchema(t *testing.T) { + stmt, err := NewTestParser().Parse("select 1 from uks.unsharded join information_schema.tables") + require.NoError(t, err) + RemoveKeyspaceIgnoreSysSchema(stmt) + + require.Equal(t, "select 1 from unsharded join information_schema.`tables`", String(stmt)) +} + +// TestRemoveSpecificKeyspace tests the RemoveSpecificKeyspace function. +// It removes the specific keyspace from the database qualifier. +func TestRemoveSpecificKeyspace(t *testing.T) { + stmt, err := NewTestParser().Parse("select 1 from uks.unsharded") + require.NoError(t, err) + + // does not match + RemoveSpecificKeyspace(stmt, "ks2") + require.Equal(t, "select 1 from uks.unsharded", String(stmt)) + + // match + RemoveSpecificKeyspace(stmt, "uks") + require.Equal(t, "select 1 from unsharded", String(stmt)) +} diff --git a/go/vt/sqlparser/ast_test.go b/go/vt/sqlparser/ast_test.go index c1484df7cc4..f01b47cbd7b 100644 --- a/go/vt/sqlparser/ast_test.go +++ b/go/vt/sqlparser/ast_test.go @@ -917,11 +917,3 @@ func TestCloneComments(t *testing.T) { assert.Equal(t, "b", val) } } - -func TestRemoveKeyspace(t *testing.T) { - stmt, err := NewTestParser().Parse("select 1 from uks.unsharded") - require.NoError(t, err) - RemoveKeyspaceIgnoreSysSchema(stmt) - - require.Equal(t, "select 1 from unsharded", String(stmt)) -} diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index ca4ccb7ac5a..065c50a6dfa 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -43,10 +43,6 @@ const ( Gen4Left2Right = querypb.ExecuteOptions_Gen4Left2Right ) -var ( - plannerVersions = []plancontext.PlannerVersion{Gen4, Gen4GreedyOnly, Gen4Left2Right} -) - type ( planResult struct { primitive engine.Primitive diff --git a/go/vt/vtgate/planbuilder/bypass.go b/go/vt/vtgate/planbuilder/bypass.go index d3384d509c1..6e3f64990d7 100644 --- a/go/vt/vtgate/planbuilder/bypass.go +++ b/go/vt/vtgate/planbuilder/bypass.go @@ -56,6 +56,8 @@ func buildPlanForBypass(stmt sqlparser.Statement, _ *sqlparser.ReservedVars, vsc } } + sqlparser.RemoveSpecificKeyspace(stmt, keyspace.Name) + send := &engine.Send{ Keyspace: keyspace, TargetDestination: vschema.Destination(), diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json b/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json index b13bafd77f8..e1ff7de97a0 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/bypass_keyrange_cases.json @@ -164,5 +164,22 @@ "Query": "create /* test */ table t1(id bigint, primary key(id)) /* comments */" } } + }, + { + "comment": "remove the matching keyspace from shard targeted query", + "query": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "ExactKeyRange(-)", + "Query": "select count(*), col from unsharded join vt_main.t1 where exists (select 1 from t2 join information_schema.`tables` where table_name = 't3')" + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json b/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json index 02a00444724..80d4dbbd08b 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/bypass_shard_cases.json @@ -251,5 +251,22 @@ "QueryTimeout": 100 } } + }, + { + "comment": "remove the matching keyspace from shard targeted query", + "query": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*), col from `main`.unsharded join vt_main.t1 where exists (select 1 from main.t2 join information_schema.tables where table_name = 't3')", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "Shard(-80)", + "Query": "select count(*), col from unsharded join vt_main.t1 where exists (select 1 from t2 join information_schema.`tables` where table_name = 't3')" + } + } } ] From 0bcbe4c0388d6649f3ae83e5b677cb7cace8267a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Jan 2025 19:23:31 +0530 Subject: [PATCH 30/66] [Java]: Bump mysql-connector-java version from 8.0.33 to mysql-connector-j 8.4.0 (#17522) Signed-off-by: Harshit Gangal --- java/example/pom.xml | 4 ++-- java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java | 2 +- .../src/main/java/io/vitess/jdbc/VitessParameterMetaData.java | 2 +- .../src/main/java/io/vitess/jdbc/VitessPreparedStatement.java | 2 +- .../src/main/java/io/vitess/util/charset/CharsetMapping.java | 2 +- java/jdbc/src/main/java/io/vitess/util/charset/Collation.java | 2 +- .../src/main/java/io/vitess/util/charset/MysqlCharset.java | 2 +- java/pom.xml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/java/example/pom.xml b/java/example/pom.xml index fabab27dd77..114dc9af5ff 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -31,8 +31,8 @@ mysql - mysql-connector-java - 8.0.33 + mysql-connector-j + 8.4.0 false diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java index e6a1b0187dd..3835ba543f8 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java @@ -218,7 +218,7 @@ private static Properties getURLParamProperties(String paramString, Properties i } } - // Per the mysql-connector-java docs, passed in Properties values should take precedence + // Per the mysql-connector-j docs, passed in Properties values should take precedence // over // those in the URL. See javadoc for NonRegisteringDriver#connect if ((null != value && value.length() > 0) && (parameter.length() > 0) && null == info diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java index 8bb880e3749..e556ba7ac37 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessParameterMetaData.java @@ -25,7 +25,7 @@ public class VitessParameterMetaData implements ParameterMetaData { private final int parameterCount; /** - * This implementation (and defaults below) is equivalent to mysql-connector-java's "simple" + * This implementation (and defaults below) is equivalent to mysql-connector-j's "simple" * (non-server) statement metadata */ VitessParameterMetaData(int count) { diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java index 550b5180e11..e97b2d151bb 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessPreparedStatement.java @@ -426,7 +426,7 @@ public ParameterMetaData getParameterMetaData() throws SQLException { } /** - * This function was ported from mysql-connector-java ParseInfo object and greatly simplified to + * This function was ported from mysql-connector-j ParseInfo object and greatly simplified to * just the parts for counting parameters */ private int calculateParameterCount() throws SQLException { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java index 343ae0e90eb..8b32e2aab67 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java @@ -24,7 +24,7 @@ import java.util.Map; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ public class CharsetMapping { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java b/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java index 31548686655..7bd24d10f2a 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/Collation.java @@ -17,7 +17,7 @@ package io.vitess.util.charset; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ class Collation { diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java b/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java index fad94cb8dcb..6691e1cb4b4 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/MysqlCharset.java @@ -23,7 +23,7 @@ import java.util.Set; /** - * These classes were pulled from mysql-connector-java and simplified to just the parts supporting + * These classes were pulled from mysql-connector-j and simplified to just the parts supporting * the statically available charsets */ class MysqlCharset { diff --git a/java/pom.xml b/java/pom.xml index e68bbd5574e..7a80212f0a9 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -252,7 +252,7 @@ true true - mysql:mysql-connector-java + mysql:mysql-connector-j io.grpc:grpc-context From b0a5d6605be767bf070b0c9bde03e361c56db86c Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Jan 2025 19:23:56 +0530 Subject: [PATCH 31/66] Add support for global routing in describe statement (#17510) Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/misc_test.go | 4 +- go/vt/vtgate/executor_test.go | 8 ++- go/vt/vtgate/planbuilder/plan_test.go | 4 +- .../testdata/other_read_cases.json | 60 +++++++++++++------ go/vt/vtgate/planbuilder/vexplain.go | 24 ++++---- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 55fa139b290..b350002a05b 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -753,9 +753,9 @@ func TestDescribeVindex(t *testing.T) { _, err := conn.ExecuteFetch("describe hash", 1000, false) require.Error(t, err) mysqlErr := err.(*sqlerror.SQLError) - assert.Equal(t, sqlerror.ERNoSuchTable, mysqlErr.Num) + assert.Equal(t, sqlerror.ERUnknownTable, mysqlErr.Num) assert.Equal(t, "42S02", mysqlErr.State) - assert.ErrorContains(t, mysqlErr, "NotFound desc") + assert.ErrorContains(t, mysqlErr, "VT05004: table 'hash' does not exist") } func TestEmptyQuery(t *testing.T) { diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 74bfb710582..8b06870e7e1 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -2672,10 +2672,12 @@ func TestExecutorShowVitessMigrations(t *testing.T) { func TestExecutorDescHash(t *testing.T) { executor, _, _, _, ctx := createExecutorEnv(t) - - showQuery := "desc hash_index" session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) - _, err := executor.Execute(ctx, nil, "", session, showQuery, nil) + + _, err := executor.Execute(ctx, nil, "", session, "desc hash_index", nil) + require.EqualError(t, err, "VT05004: table 'hash_index' does not exist") + + _, err = executor.Execute(ctx, nil, "", session, "desc music", nil) require.NoError(t, err) } diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f3bed93e3c8..8a8d55279a6 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -577,10 +577,10 @@ func (s *planTestSuite) TestOtherPlanningFromFile() { vw, err := vschemawrapper.NewVschemaWrapper(env, vschema, TestBuilder) require.NoError(s.T(), err) + s.testFile("other_read_cases.json", vw, false) + vw.Vcursor.SetTarget("main") vw.Keyspace = &vindexes.Keyspace{Name: "main"} - - s.testFile("other_read_cases.json", vw, false) s.testFile("other_admin_cases.json", vw, false) } diff --git a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json index 2258bcd768c..1a7c9ddac2a 100644 --- a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json @@ -8,24 +8,24 @@ "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.user" + "user.user" ] } }, { "comment": "Analyze statement", - "query": "analyze table t1", + "query": "analyze table main.t1", "plan": { "QueryType": "ANALYZE", - "Original": "analyze table t1", + "Original": "analyze table main.t1", "Instructions": { "OperatorType": "Send", "Keyspace": { @@ -42,43 +42,43 @@ }, { "comment": "Describe statement", - "query": "describe select * from t", + "query": "describe select * from user", "plan": { "QueryType": "EXPLAIN", - "Original": "describe select * from t", + "Original": "describe select * from user", "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", - "Query": "explain select * from t", + "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.t" + "user.user" ] } }, { "comment": "Desc statement", - "query": "desc select * from t", + "query": "desc select * from user", "plan": { "QueryType": "EXPLAIN", - "Original": "desc select * from t", + "Original": "desc select * from user", "Instructions": { "OperatorType": "Send", "Keyspace": { - "Name": "main", - "Sharded": false + "Name": "user", + "Sharded": true }, "TargetDestination": "AnyShard()", - "Query": "explain select * from t", + "Query": "explain select * from `user`", "SingleShardOnly": true }, "TablesUsed": [ - "main.t" + "user.user" ] } }, @@ -167,5 +167,31 @@ "main.administrable_role_authorizations" ] } + }, + { + "comment": "describe table without qualifier", + "query": "describe user", + "plan": { + "QueryType": "EXPLAIN", + "Original": "describe user", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetDestination": "AnyShard()", + "Query": "explain `user`", + "SingleShardOnly": true + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "describe table does not exists", + "query": "describe unknown_table", + "plan": "table unknown_table not found" } ] diff --git a/go/vt/vtgate/planbuilder/vexplain.go b/go/vt/vtgate/planbuilder/vexplain.go index 7aed1e48884..a12139c3068 100644 --- a/go/vt/vtgate/planbuilder/vexplain.go +++ b/go/vt/vtgate/planbuilder/vexplain.go @@ -55,7 +55,7 @@ func buildVExplainPlan( func explainTabPlan(explain *sqlparser.ExplainTab, vschema plancontext.VSchema) (*planResult, error) { var keyspace *vindexes.Keyspace - var destination key.Destination + var dest key.Destination if sqlparser.SystemSchema(explain.Table.Qualifier.String()) { var err error @@ -64,30 +64,26 @@ func explainTabPlan(explain *sqlparser.ExplainTab, vschema plancontext.VSchema) return nil, err } } else { + var tbl *vindexes.Table var err error - var ks string - _, _, ks, _, destination, err = vschema.FindTableOrVindex(explain.Table) + tbl, _, _, _, dest, err = vschema.FindTableOrVindex(explain.Table) if err != nil { return nil, err } - explain.Table.Qualifier = sqlparser.NewIdentifierCS("") - - keyspace, err = vschema.FindKeyspace(ks) - if err != nil { - return nil, err - } - if keyspace == nil { - return nil, vterrors.VT14004(ks) + if tbl == nil { + return nil, vterrors.VT05004(explain.Table.Name.String()) } + keyspace = tbl.Keyspace + explain.Table = sqlparser.NewTableName(tbl.Name.String()) } - if destination == nil { - destination = key.DestinationAnyShard{} + if dest == nil { + dest = key.DestinationAnyShard{} } return newPlanResult(&engine.Send{ Keyspace: keyspace, - TargetDestination: destination, + TargetDestination: dest, Query: sqlparser.String(explain), SingleShardOnly: true, }, singleTable(keyspace.Name, explain.Table.Name.String())), nil From e207a4460e350ddd40873df8036dc61aa1e5c733 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Wed, 15 Jan 2025 08:56:05 -0500 Subject: [PATCH 32/66] VDiff: Save lastpk value for source and target (#17493) Signed-off-by: Matt Lord --- go/test/endtoend/vreplication/config_test.go | 17 +- .../vreplication/multi_tenant_test.go | 16 +- go/test/endtoend/vreplication/vdiff2_test.go | 9 + .../tabletmanagerdata/tabletmanagerdata.pb.go | 1044 +++++++++-------- .../tabletmanagerdata_vtproto.pb.go | 212 ++++ .../tabletmanager/vdiff/engine_test.go | 8 +- .../tabletmanager/vdiff/framework_test.go | 10 + .../tabletmanager/vdiff/table_differ.go | 181 ++- .../tabletmanager/vdiff/table_differ_test.go | 131 +++ .../tabletmanager/vdiff/table_plan.go | 5 + go/vt/vttablet/tabletmanager/vdiff/utils.go | 11 - .../tabletmanager/vdiff/workflow_differ.go | 43 +- .../vdiff/workflow_differ_test.go | 367 +++--- .../tabletserver/vstreamer/rowstreamer.go | 3 +- proto/tabletmanagerdata.proto | 7 + web/vtadmin/src/proto/vtadmin.d.ts | 106 ++ web/vtadmin/src/proto/vtadmin.js | 256 ++++ 17 files changed, 1690 insertions(+), 736 deletions(-) create mode 100644 go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go diff --git a/go/test/endtoend/vreplication/config_test.go b/go/test/endtoend/vreplication/config_test.go index 3e7dd08f31c..b856572ab7b 100644 --- a/go/test/endtoend/vreplication/config_test.go +++ b/go/test/endtoend/vreplication/config_test.go @@ -45,12 +45,18 @@ import ( // default collation as it has to work across versions and the 8.0 default does not exist in 5.7. var ( // All standard user tables should have a primary key and at least one secondary key. - customerTypes = []string{"'individual'", "'soho'", "'enterprise'"} + customerTypes = []string{"'individual'", "'soho'", "'enterprise'"} + customerTableTemplate = `create table customer(cid int auto_increment, name varchar(128) collate utf8mb4_bin, meta json default null, + industryCategory varchar(100) generated always as (json_extract(meta, _utf8mb4'$.industry')) virtual, typ enum(%s), + sport set('football','cricket','baseball'), ts timestamp not null default current_timestamp, bits bit(2) default b'11', date1 datetime not null default '0000-00-00 00:00:00', + date2 datetime not null default '2021-00-01 00:00:00', dec80 decimal(8,0), blb blob, primary key(%s), key(name)) CHARSET=utf8mb4` + customerTable = fmt.Sprintf(customerTableTemplate, strings.Join(customerTypes, ","), "cid,typ" /* PK columns */) + // customerTableModifiedPK has a PK on (cid) vs (cid,typ). + customerTableModifiedPK = fmt.Sprintf(customerTableTemplate, strings.Join(customerTypes, ","), "cid" /* PK columns */) + initialProductSchema = fmt.Sprintf(` create table product(pid int, description varbinary(128), date1 datetime not null default '0000-00-00 00:00:00', date2 datetime not null default '2021-00-01 00:00:00', primary key(pid), key(date1,date2)) CHARSET=utf8mb4; -create table customer(cid int auto_increment, name varchar(128) collate utf8mb4_bin, meta json default null, industryCategory varchar(100) generated always as (json_extract(meta, _utf8mb4'$.industry')) virtual, - typ enum(%s), sport set('football','cricket','baseball'), ts timestamp not null default current_timestamp, bits bit(2) default b'11', date1 datetime not null default '0000-00-00 00:00:00', - date2 datetime not null default '2021-00-01 00:00:00', dec80 decimal(8,0), blb blob, primary key(cid,typ), key(name)) CHARSET=utf8mb4; +%s; create table customer_seq(id int, next_id bigint, cache bigint, primary key(id)) comment 'vitess_sequence'; create table merchant(mname varchar(128), category varchar(128), primary key(mname), key(category)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; create table orders(oid int, cid int, pid int, mname varchar(128), price int, qty int, total int as (qty * price), total2 int as (qty * price) stored, primary key(oid), key(pid), key(cid)) CHARSET=utf8; @@ -69,7 +75,8 @@ create table `+"`blüb_tbl`"+` (id int, val1 varchar(20), `+"`blöb1`"+` blob, create table reftable (id int, val1 varchar(20), primary key(id), key(val1)); create table loadtest (id int, name varchar(256), primary key(id), key(name)); create table nopk (name varchar(128), age int unsigned); -`, strings.Join(customerTypes, ",")) +`, customerTable) + // These should always be ignored in vreplication internalSchema = ` create table _1e275eef_3b20_11eb_a38f_04ed332e05c2_20201210204529_gho(id int, val varbinary(128), primary key(id)); diff --git a/go/test/endtoend/vreplication/multi_tenant_test.go b/go/test/endtoend/vreplication/multi_tenant_test.go index 6e73303be8a..2cd908b449f 100644 --- a/go/test/endtoend/vreplication/multi_tenant_test.go +++ b/go/test/endtoend/vreplication/multi_tenant_test.go @@ -91,7 +91,15 @@ type multiTenantMigration struct { } const ( - mtSchema = "create table t1(id int, tenant_id int, primary key(id, tenant_id)) Engine=InnoDB" + // The source/mt schema does not have the tenant_id column in the PK as adding a + // column to a table can be done as an INSTANT operation whereas modifying a table's + // PK requires a full table rebuild. So as a practical matter in production the + // source schema will likely have the tenant_id column, but NOT have it be part of + // the PK. + mtSchema = "create table t1(id int, tenant_id int, primary key(id)) Engine=InnoDB" + // The target/st schema must have the tenant_id column in the PK and the primary + // vindex. + stSchema = "create table t1(id int, tenant_id int, primary key(id, tenant_id)) Engine=InnoDB" mtVSchema = ` { "multi_tenant_spec": { @@ -127,7 +135,6 @@ const ( } } ` - stSchema = mtSchema stVSchema = ` { "tables": { @@ -429,8 +436,11 @@ func (mtm *multiTenantMigration) insertSomeData(t *testing.T, tenantId int64, ke defer closeConn() idx := mtm.getLastID(tenantId) for i := idx + 1; i <= idx+numRows; i++ { + // The source table has a PK on id only, so we have to make the id value + // unique rather than relying on the combination of (id, tenant_id) for + // our uniqueness. execQueryWithRetry(t, vtgateConn, - fmt.Sprintf("insert into %s.t1(id, tenant_id) values(%d, %d)", keyspace, i, tenantId), queryTimeout) + fmt.Sprintf("insert into %s.t1(id, tenant_id) values(%d, %d)", keyspace, i+(tenantId*1e4), tenantId), queryTimeout) } mtm.setLastID(tenantId, idx+numRows) } diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index 6116e26eef5..c4bb2efc73a 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -175,6 +175,15 @@ func TestVDiff2(t *testing.T) { require.NoError(t, err) verifyClusterHealth(t, vc) + // Pre-create the customer table on the target keyspace, with the primary key on + // (cid) vs (cid,typ) on the source. This confirms that we are able to properly + // diff the table when the source and target have a different PK definition. + // Remove the 0 date restrictions as the customer table uses them in its DEFAULTs. + execVtgateQuery(t, vtgateConn, targetKs, "set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'") + execVtgateQuery(t, vtgateConn, targetKs, customerTableModifiedPK) + // Set the sql_mode back to the default. + execVtgateQuery(t, vtgateConn, targetKs, "set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'") + for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // Primary tablets for any new shards are added in the first cell. diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 67eae2395ad..36ad09547f1 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -6766,6 +6766,61 @@ func (x *VDiffOptions) GetReportOptions() *VDiffReportOptions { return nil } +type VDiffTableLastPK struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *query.QueryResult `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + // If the source value is nil then it's the same as the target + // and the target value should be used for both. + Source *query.QueryResult `protobuf:"bytes,2,opt,name=source,proto3,oneof" json:"source,omitempty"` +} + +func (x *VDiffTableLastPK) Reset() { + *x = VDiffTableLastPK{} + mi := &file_tabletmanagerdata_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VDiffTableLastPK) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VDiffTableLastPK) ProtoMessage() {} + +func (x *VDiffTableLastPK) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[132] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VDiffTableLastPK.ProtoReflect.Descriptor instead. +func (*VDiffTableLastPK) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{132} +} + +func (x *VDiffTableLastPK) GetTarget() *query.QueryResult { + if x != nil { + return x.Target + } + return nil +} + +func (x *VDiffTableLastPK) GetSource() *query.QueryResult { + if x != nil { + return x.Source + } + return nil +} + // UpdateVReplicationWorkflowRequest is used to update an existing VReplication // workflow. Note that the following fields MUST have an explicit value provided // if you do NOT wish to update the existing value to the given type's ZeroValue: @@ -6788,7 +6843,7 @@ type UpdateVReplicationWorkflowRequest struct { func (x *UpdateVReplicationWorkflowRequest) Reset() { *x = UpdateVReplicationWorkflowRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[132] + mi := &file_tabletmanagerdata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6800,7 +6855,7 @@ func (x *UpdateVReplicationWorkflowRequest) String() string { func (*UpdateVReplicationWorkflowRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[132] + mi := &file_tabletmanagerdata_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6813,7 +6868,7 @@ func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{132} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{133} } func (x *UpdateVReplicationWorkflowRequest) GetWorkflow() string { @@ -6875,7 +6930,7 @@ type UpdateVReplicationWorkflowResponse struct { func (x *UpdateVReplicationWorkflowResponse) Reset() { *x = UpdateVReplicationWorkflowResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6887,7 +6942,7 @@ func (x *UpdateVReplicationWorkflowResponse) String() string { func (*UpdateVReplicationWorkflowResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6900,7 +6955,7 @@ func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{133} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{134} } func (x *UpdateVReplicationWorkflowResponse) GetResult() *query.QueryResult { @@ -6931,7 +6986,7 @@ type UpdateVReplicationWorkflowsRequest struct { func (x *UpdateVReplicationWorkflowsRequest) Reset() { *x = UpdateVReplicationWorkflowsRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[134] + mi := &file_tabletmanagerdata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6943,7 +6998,7 @@ func (x *UpdateVReplicationWorkflowsRequest) String() string { func (*UpdateVReplicationWorkflowsRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[134] + mi := &file_tabletmanagerdata_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6956,7 +7011,7 @@ func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowsRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{134} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{135} } func (x *UpdateVReplicationWorkflowsRequest) GetAllWorkflows() bool { @@ -7011,7 +7066,7 @@ type UpdateVReplicationWorkflowsResponse struct { func (x *UpdateVReplicationWorkflowsResponse) Reset() { *x = UpdateVReplicationWorkflowsResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[135] + mi := &file_tabletmanagerdata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7023,7 +7078,7 @@ func (x *UpdateVReplicationWorkflowsResponse) String() string { func (*UpdateVReplicationWorkflowsResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[135] + mi := &file_tabletmanagerdata_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7036,7 +7091,7 @@ func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateVReplicationWorkflowsResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{135} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{136} } func (x *UpdateVReplicationWorkflowsResponse) GetResult() *query.QueryResult { @@ -7056,7 +7111,7 @@ type ResetSequencesRequest struct { func (x *ResetSequencesRequest) Reset() { *x = ResetSequencesRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7068,7 +7123,7 @@ func (x *ResetSequencesRequest) String() string { func (*ResetSequencesRequest) ProtoMessage() {} func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7081,7 +7136,7 @@ func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesRequest.ProtoReflect.Descriptor instead. func (*ResetSequencesRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{136} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137} } func (x *ResetSequencesRequest) GetTables() []string { @@ -7099,7 +7154,7 @@ type ResetSequencesResponse struct { func (x *ResetSequencesResponse) Reset() { *x = ResetSequencesResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[137] + mi := &file_tabletmanagerdata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7111,7 +7166,7 @@ func (x *ResetSequencesResponse) String() string { func (*ResetSequencesResponse) ProtoMessage() {} func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[137] + mi := &file_tabletmanagerdata_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7124,7 +7179,7 @@ func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesResponse.ProtoReflect.Descriptor instead. func (*ResetSequencesResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{138} } type CheckThrottlerRequest struct { @@ -7145,7 +7200,7 @@ type CheckThrottlerRequest struct { func (x *CheckThrottlerRequest) Reset() { *x = CheckThrottlerRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[138] + mi := &file_tabletmanagerdata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7157,7 +7212,7 @@ func (x *CheckThrottlerRequest) String() string { func (*CheckThrottlerRequest) ProtoMessage() {} func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[138] + mi := &file_tabletmanagerdata_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7170,7 +7225,7 @@ func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerRequest.ProtoReflect.Descriptor instead. func (*CheckThrottlerRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{138} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139} } func (x *CheckThrottlerRequest) GetAppName() string { @@ -7239,7 +7294,7 @@ type CheckThrottlerResponse struct { func (x *CheckThrottlerResponse) Reset() { *x = CheckThrottlerResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[139] + mi := &file_tabletmanagerdata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7251,7 +7306,7 @@ func (x *CheckThrottlerResponse) String() string { func (*CheckThrottlerResponse) ProtoMessage() {} func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[139] + mi := &file_tabletmanagerdata_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7264,7 +7319,7 @@ func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140} } func (x *CheckThrottlerResponse) GetStatusCode() int32 { @@ -7345,7 +7400,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7357,7 +7412,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7370,7 +7425,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141} } type GetThrottlerStatusResponse struct { @@ -7418,7 +7473,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[141] + mi := &file_tabletmanagerdata_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7430,7 +7485,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[141] + mi := &file_tabletmanagerdata_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7443,7 +7498,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142} } func (x *GetThrottlerStatusResponse) GetTabletAlias() string { @@ -7583,7 +7638,7 @@ type ChangeTagsRequest struct { func (x *ChangeTagsRequest) Reset() { *x = ChangeTagsRequest{} - mi := &file_tabletmanagerdata_proto_msgTypes[142] + mi := &file_tabletmanagerdata_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7595,7 +7650,7 @@ func (x *ChangeTagsRequest) String() string { func (*ChangeTagsRequest) ProtoMessage() {} func (x *ChangeTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[142] + mi := &file_tabletmanagerdata_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7608,7 +7663,7 @@ func (x *ChangeTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTagsRequest.ProtoReflect.Descriptor instead. func (*ChangeTagsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{143} } func (x *ChangeTagsRequest) GetTags() map[string]string { @@ -7635,7 +7690,7 @@ type ChangeTagsResponse struct { func (x *ChangeTagsResponse) Reset() { *x = ChangeTagsResponse{} - mi := &file_tabletmanagerdata_proto_msgTypes[143] + mi := &file_tabletmanagerdata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7647,7 +7702,7 @@ func (x *ChangeTagsResponse) String() string { func (*ChangeTagsResponse) ProtoMessage() {} func (x *ChangeTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[143] + mi := &file_tabletmanagerdata_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7660,7 +7715,7 @@ func (x *ChangeTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTagsResponse.ProtoReflect.Descriptor instead. func (*ChangeTagsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{143} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{144} } func (x *ChangeTagsResponse) GetTags() map[string]string { @@ -7693,7 +7748,7 @@ type ReadVReplicationWorkflowResponse_Stream struct { func (x *ReadVReplicationWorkflowResponse_Stream) Reset() { *x = ReadVReplicationWorkflowResponse_Stream{} - mi := &file_tabletmanagerdata_proto_msgTypes[149] + mi := &file_tabletmanagerdata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7705,7 +7760,7 @@ func (x *ReadVReplicationWorkflowResponse_Stream) String() string { func (*ReadVReplicationWorkflowResponse_Stream) ProtoMessage() {} func (x *ReadVReplicationWorkflowResponse_Stream) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[149] + mi := &file_tabletmanagerdata_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7844,7 +7899,7 @@ type CheckThrottlerResponse_Metric struct { func (x *CheckThrottlerResponse_Metric) Reset() { *x = CheckThrottlerResponse_Metric{} - mi := &file_tabletmanagerdata_proto_msgTypes[152] + mi := &file_tabletmanagerdata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7856,7 +7911,7 @@ func (x *CheckThrottlerResponse_Metric) String() string { func (*CheckThrottlerResponse_Metric) ProtoMessage() {} func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[152] + mi := &file_tabletmanagerdata_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7869,7 +7924,7 @@ func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse_Metric.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse_Metric) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140, 0} } func (x *CheckThrottlerResponse_Metric) GetName() string { @@ -7939,7 +7994,7 @@ type GetThrottlerStatusResponse_MetricResult struct { func (x *GetThrottlerStatusResponse_MetricResult) Reset() { *x = GetThrottlerStatusResponse_MetricResult{} - mi := &file_tabletmanagerdata_proto_msgTypes[154] + mi := &file_tabletmanagerdata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7951,7 +8006,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) String() string { func (*GetThrottlerStatusResponse_MetricResult) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[154] + mi := &file_tabletmanagerdata_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7964,7 +8019,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricResult.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricResult) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 0} } func (x *GetThrottlerStatusResponse_MetricResult) GetValue() float64 { @@ -7992,7 +8047,7 @@ type GetThrottlerStatusResponse_MetricHealth struct { func (x *GetThrottlerStatusResponse_MetricHealth) Reset() { *x = GetThrottlerStatusResponse_MetricHealth{} - mi := &file_tabletmanagerdata_proto_msgTypes[157] + mi := &file_tabletmanagerdata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8004,7 +8059,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) String() string { func (*GetThrottlerStatusResponse_MetricHealth) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[157] + mi := &file_tabletmanagerdata_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8017,7 +8072,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricHealth.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricHealth) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 3} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 3} } func (x *GetThrottlerStatusResponse_MetricHealth) GetLastHealthyAt() *vttime.Time { @@ -8047,7 +8102,7 @@ type GetThrottlerStatusResponse_RecentApp struct { func (x *GetThrottlerStatusResponse_RecentApp) Reset() { *x = GetThrottlerStatusResponse_RecentApp{} - mi := &file_tabletmanagerdata_proto_msgTypes[161] + mi := &file_tabletmanagerdata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8059,7 +8114,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) String() string { func (*GetThrottlerStatusResponse_RecentApp) ProtoMessage() {} func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[161] + mi := &file_tabletmanagerdata_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8072,7 +8127,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Messa // Deprecated: Use GetThrottlerStatusResponse_RecentApp.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_RecentApp) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141, 7} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{142, 7} } func (x *GetThrottlerStatusResponse_RecentApp) GetCheckedAt() *vttime.Time { @@ -8961,317 +9016,324 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, - 0x04, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x71, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x48, 0x00, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4f, 0x6e, 0x44, 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x05, 0x6f, - 0x6e, 0x44, 0x64, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, - 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, - 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, - 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0xd6, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7a, + 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, + 0x50, 0x4b, 0x12, 0x2a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2f, + 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xed, 0x04, 0x0a, 0x21, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x1b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, + 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4f, 0x6e, 0x44, 0x44, + 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, + 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, - 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, - 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, - 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, - 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x46, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, + 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, + 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, + 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, + 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, + 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, - 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, - 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, - 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, - 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, - 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, - 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, - 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x41, 0x70, 0x70, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, - 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x41, 0x70, 0x70, 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, 0x4d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, + 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, + 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, + 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, - 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, + 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x03, 0x2a, 0x83, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, - 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, - 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, - 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, + 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, + 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, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x1a, + 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, 0x0a, + 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, + 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, + 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, + 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, + 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, + 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, + 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, + 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, + 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9287,7 +9349,7 @@ func file_tabletmanagerdata_proto_rawDescGZIP() []byte { } var file_tabletmanagerdata_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 165) +var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 166) var file_tabletmanagerdata_proto_goTypes = []any{ (TabletSelectionPreference)(0), // 0: tabletmanagerdata.TabletSelectionPreference (CheckThrottlerResponseCode)(0), // 1: tabletmanagerdata.CheckThrottlerResponseCode @@ -9423,163 +9485,166 @@ var file_tabletmanagerdata_proto_goTypes = []any{ (*VDiffReportOptions)(nil), // 131: tabletmanagerdata.VDiffReportOptions (*VDiffCoreOptions)(nil), // 132: tabletmanagerdata.VDiffCoreOptions (*VDiffOptions)(nil), // 133: tabletmanagerdata.VDiffOptions - (*UpdateVReplicationWorkflowRequest)(nil), // 134: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*UpdateVReplicationWorkflowResponse)(nil), // 135: tabletmanagerdata.UpdateVReplicationWorkflowResponse - (*UpdateVReplicationWorkflowsRequest)(nil), // 136: tabletmanagerdata.UpdateVReplicationWorkflowsRequest - (*UpdateVReplicationWorkflowsResponse)(nil), // 137: tabletmanagerdata.UpdateVReplicationWorkflowsResponse - (*ResetSequencesRequest)(nil), // 138: tabletmanagerdata.ResetSequencesRequest - (*ResetSequencesResponse)(nil), // 139: tabletmanagerdata.ResetSequencesResponse - (*CheckThrottlerRequest)(nil), // 140: tabletmanagerdata.CheckThrottlerRequest - (*CheckThrottlerResponse)(nil), // 141: tabletmanagerdata.CheckThrottlerResponse - (*GetThrottlerStatusRequest)(nil), // 142: tabletmanagerdata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 143: tabletmanagerdata.GetThrottlerStatusResponse - (*ChangeTagsRequest)(nil), // 144: tabletmanagerdata.ChangeTagsRequest - (*ChangeTagsResponse)(nil), // 145: tabletmanagerdata.ChangeTagsResponse - nil, // 146: tabletmanagerdata.UserPermission.PrivilegesEntry - nil, // 147: tabletmanagerdata.DbPermission.PrivilegesEntry - nil, // 148: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry - nil, // 149: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - nil, // 150: tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry - (*ReadVReplicationWorkflowResponse_Stream)(nil), // 151: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - nil, // 152: tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry - nil, // 153: tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry - (*CheckThrottlerResponse_Metric)(nil), // 154: tabletmanagerdata.CheckThrottlerResponse.Metric - nil, // 155: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - (*GetThrottlerStatusResponse_MetricResult)(nil), // 156: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - nil, // 157: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - nil, // 158: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - (*GetThrottlerStatusResponse_MetricHealth)(nil), // 159: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - nil, // 160: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - nil, // 161: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - nil, // 162: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - (*GetThrottlerStatusResponse_RecentApp)(nil), // 163: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - nil, // 164: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - nil, // 165: tabletmanagerdata.ChangeTagsRequest.TagsEntry - nil, // 166: tabletmanagerdata.ChangeTagsResponse.TagsEntry - (*query.Field)(nil), // 167: query.Field - (topodata.TabletType)(0), // 168: topodata.TabletType - (*vtrpc.CallerID)(nil), // 169: vtrpc.CallerID - (*query.QueryResult)(nil), // 170: query.QueryResult - (*query.TransactionMetadata)(nil), // 171: query.TransactionMetadata - (*mysqlctl.HostMetricsResponse)(nil), // 172: mysqlctl.HostMetricsResponse - (*replicationdata.Status)(nil), // 173: replicationdata.Status - (*replicationdata.PrimaryStatus)(nil), // 174: replicationdata.PrimaryStatus - (*topodata.TabletAlias)(nil), // 175: topodata.TabletAlias - (*replicationdata.FullStatus)(nil), // 176: replicationdata.FullStatus - (replicationdata.StopReplicationMode)(0), // 177: replicationdata.StopReplicationMode - (*replicationdata.StopReplicationStatus)(nil), // 178: replicationdata.StopReplicationStatus - (*logutil.Event)(nil), // 179: logutil.Event - (*vttime.Time)(nil), // 180: vttime.Time - (*binlogdata.BinlogSource)(nil), // 181: binlogdata.BinlogSource - (binlogdata.VReplicationWorkflowType)(0), // 182: binlogdata.VReplicationWorkflowType - (binlogdata.VReplicationWorkflowSubType)(0), // 183: binlogdata.VReplicationWorkflowSubType - (binlogdata.VReplicationWorkflowState)(0), // 184: binlogdata.VReplicationWorkflowState - (binlogdata.OnDDLAction)(0), // 185: binlogdata.OnDDLAction - (*topodata.ThrottledAppRule)(nil), // 186: topodata.ThrottledAppRule + (*VDiffTableLastPK)(nil), // 134: tabletmanagerdata.VDiffTableLastPK + (*UpdateVReplicationWorkflowRequest)(nil), // 135: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*UpdateVReplicationWorkflowResponse)(nil), // 136: tabletmanagerdata.UpdateVReplicationWorkflowResponse + (*UpdateVReplicationWorkflowsRequest)(nil), // 137: tabletmanagerdata.UpdateVReplicationWorkflowsRequest + (*UpdateVReplicationWorkflowsResponse)(nil), // 138: tabletmanagerdata.UpdateVReplicationWorkflowsResponse + (*ResetSequencesRequest)(nil), // 139: tabletmanagerdata.ResetSequencesRequest + (*ResetSequencesResponse)(nil), // 140: tabletmanagerdata.ResetSequencesResponse + (*CheckThrottlerRequest)(nil), // 141: tabletmanagerdata.CheckThrottlerRequest + (*CheckThrottlerResponse)(nil), // 142: tabletmanagerdata.CheckThrottlerResponse + (*GetThrottlerStatusRequest)(nil), // 143: tabletmanagerdata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 144: tabletmanagerdata.GetThrottlerStatusResponse + (*ChangeTagsRequest)(nil), // 145: tabletmanagerdata.ChangeTagsRequest + (*ChangeTagsResponse)(nil), // 146: tabletmanagerdata.ChangeTagsResponse + nil, // 147: tabletmanagerdata.UserPermission.PrivilegesEntry + nil, // 148: tabletmanagerdata.DbPermission.PrivilegesEntry + nil, // 149: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + nil, // 150: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + nil, // 151: tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + (*ReadVReplicationWorkflowResponse_Stream)(nil), // 152: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + nil, // 153: tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + nil, // 154: tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + (*CheckThrottlerResponse_Metric)(nil), // 155: tabletmanagerdata.CheckThrottlerResponse.Metric + nil, // 156: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + (*GetThrottlerStatusResponse_MetricResult)(nil), // 157: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + nil, // 158: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + nil, // 159: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + (*GetThrottlerStatusResponse_MetricHealth)(nil), // 160: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + nil, // 161: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + nil, // 162: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + nil, // 163: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + (*GetThrottlerStatusResponse_RecentApp)(nil), // 164: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + nil, // 165: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + nil, // 166: tabletmanagerdata.ChangeTagsRequest.TagsEntry + nil, // 167: tabletmanagerdata.ChangeTagsResponse.TagsEntry + (*query.Field)(nil), // 168: query.Field + (topodata.TabletType)(0), // 169: topodata.TabletType + (*vtrpc.CallerID)(nil), // 170: vtrpc.CallerID + (*query.QueryResult)(nil), // 171: query.QueryResult + (*query.TransactionMetadata)(nil), // 172: query.TransactionMetadata + (*mysqlctl.HostMetricsResponse)(nil), // 173: mysqlctl.HostMetricsResponse + (*replicationdata.Status)(nil), // 174: replicationdata.Status + (*replicationdata.PrimaryStatus)(nil), // 175: replicationdata.PrimaryStatus + (*topodata.TabletAlias)(nil), // 176: topodata.TabletAlias + (*replicationdata.FullStatus)(nil), // 177: replicationdata.FullStatus + (replicationdata.StopReplicationMode)(0), // 178: replicationdata.StopReplicationMode + (*replicationdata.StopReplicationStatus)(nil), // 179: replicationdata.StopReplicationStatus + (*logutil.Event)(nil), // 180: logutil.Event + (*vttime.Time)(nil), // 181: vttime.Time + (*binlogdata.BinlogSource)(nil), // 182: binlogdata.BinlogSource + (binlogdata.VReplicationWorkflowType)(0), // 183: binlogdata.VReplicationWorkflowType + (binlogdata.VReplicationWorkflowSubType)(0), // 184: binlogdata.VReplicationWorkflowSubType + (binlogdata.VReplicationWorkflowState)(0), // 185: binlogdata.VReplicationWorkflowState + (binlogdata.OnDDLAction)(0), // 186: binlogdata.OnDDLAction + (*topodata.ThrottledAppRule)(nil), // 187: topodata.ThrottledAppRule } var file_tabletmanagerdata_proto_depIdxs = []int32{ - 167, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field + 168, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field 2, // 1: tabletmanagerdata.SchemaDefinition.table_definitions:type_name -> tabletmanagerdata.TableDefinition 3, // 2: tabletmanagerdata.SchemaChangeResult.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 3: tabletmanagerdata.SchemaChangeResult.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 146, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry - 147, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry + 147, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry + 148, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry 5, // 6: tabletmanagerdata.Permissions.user_permissions:type_name -> tabletmanagerdata.UserPermission 6, // 7: tabletmanagerdata.Permissions.db_permissions:type_name -> tabletmanagerdata.DbPermission - 148, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + 149, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry 3, // 9: tabletmanagerdata.GetSchemaResponse.schema_definition:type_name -> tabletmanagerdata.SchemaDefinition 7, // 10: tabletmanagerdata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 149, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - 168, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType + 150, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + 169, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType 4, // 13: tabletmanagerdata.PreflightSchemaResponse.change_results:type_name -> tabletmanagerdata.SchemaChangeResult 3, // 14: tabletmanagerdata.ApplySchemaRequest.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 15: tabletmanagerdata.ApplySchemaRequest.after_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 16: tabletmanagerdata.ApplySchemaResponse.before_schema:type_name -> tabletmanagerdata.SchemaDefinition 3, // 17: tabletmanagerdata.ApplySchemaResponse.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 169, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID - 170, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult - 170, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult - 170, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult - 170, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult - 170, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 171, // 24: tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata - 171, // 25: tabletmanagerdata.ReadTransactionResponse.transaction:type_name -> query.TransactionMetadata - 172, // 26: tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics:type_name -> mysqlctl.HostMetricsResponse - 173, // 27: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status - 174, // 28: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus - 170, // 29: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult - 175, // 30: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias - 175, // 31: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias - 174, // 32: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus - 176, // 33: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus - 175, // 34: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias - 175, // 35: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias - 177, // 36: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode - 178, // 37: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus - 179, // 38: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event - 180, // 39: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 180, // 40: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 179, // 41: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 181, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource - 168, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 170, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID + 171, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult + 171, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult + 171, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult + 171, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult + 171, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 172, // 24: tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 172, // 25: tabletmanagerdata.ReadTransactionResponse.transaction:type_name -> query.TransactionMetadata + 173, // 26: tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics:type_name -> mysqlctl.HostMetricsResponse + 174, // 27: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status + 175, // 28: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus + 171, // 29: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult + 176, // 30: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias + 176, // 31: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias + 175, // 32: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus + 177, // 33: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus + 176, // 34: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias + 176, // 35: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias + 178, // 36: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode + 179, // 37: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus + 180, // 38: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event + 181, // 39: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 181, // 40: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 180, // 41: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 182, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource + 169, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType 0, // 44: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 182, // 45: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 183, // 46: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 170, // 47: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 150, // 48: tabletmanagerdata.DeleteTableDataRequest.table_filters:type_name -> tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry - 170, // 49: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 184, // 50: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState - 184, // 51: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState + 183, // 45: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 184, // 46: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 171, // 47: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 151, // 48: tabletmanagerdata.DeleteTableDataRequest.table_filters:type_name -> tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + 171, // 49: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 185, // 50: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState + 185, // 51: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState 125, // 52: tabletmanagerdata.ReadVReplicationWorkflowsResponse.workflows:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse - 168, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType + 169, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType 0, // 54: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 182, // 55: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 183, // 56: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 151, // 57: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - 152, // 58: tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + 183, // 55: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 184, // 56: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 152, // 57: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + 153, // 58: tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry 133, // 59: tabletmanagerdata.VDiffRequest.options:type_name -> tabletmanagerdata.VDiffOptions - 170, // 60: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult + 171, // 60: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult 130, // 61: tabletmanagerdata.VDiffOptions.picker_options:type_name -> tabletmanagerdata.VDiffPickerOptions 132, // 62: tabletmanagerdata.VDiffOptions.core_options:type_name -> tabletmanagerdata.VDiffCoreOptions 131, // 63: tabletmanagerdata.VDiffOptions.report_options:type_name -> tabletmanagerdata.VDiffReportOptions - 168, // 64: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType - 0, // 65: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 185, // 66: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction - 184, // 67: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 153, // 68: tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry - 170, // 69: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 184, // 70: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 170, // 71: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult - 155, // 72: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - 1, // 73: tabletmanagerdata.CheckThrottlerResponse.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 157, // 74: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - 158, // 75: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - 160, // 76: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - 161, // 77: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - 162, // 78: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - 164, // 79: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - 165, // 80: tabletmanagerdata.ChangeTagsRequest.tags:type_name -> tabletmanagerdata.ChangeTagsRequest.TagsEntry - 166, // 81: tabletmanagerdata.ChangeTagsResponse.tags:type_name -> tabletmanagerdata.ChangeTagsResponse.TagsEntry - 181, // 82: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource - 180, // 83: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time - 180, // 84: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time - 184, // 85: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState - 180, // 86: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time - 180, // 87: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time - 1, // 88: tabletmanagerdata.CheckThrottlerResponse.Metric.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 154, // 89: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric - 156, // 90: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - 180, // 91: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time - 159, // 92: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - 186, // 93: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule - 180, // 94: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time - 1, // 95: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode - 163, // 96: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - 97, // [97:97] is the sub-list for method output_type - 97, // [97:97] is the sub-list for method input_type - 97, // [97:97] is the sub-list for extension type_name - 97, // [97:97] is the sub-list for extension extendee - 0, // [0:97] is the sub-list for field type_name + 171, // 64: tabletmanagerdata.VDiffTableLastPK.target:type_name -> query.QueryResult + 171, // 65: tabletmanagerdata.VDiffTableLastPK.source:type_name -> query.QueryResult + 169, // 66: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 0, // 67: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 186, // 68: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction + 185, // 69: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 154, // 70: tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + 171, // 71: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 185, // 72: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 171, // 73: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult + 156, // 74: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + 1, // 75: tabletmanagerdata.CheckThrottlerResponse.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 158, // 76: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + 159, // 77: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + 161, // 78: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + 162, // 79: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + 163, // 80: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + 165, // 81: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + 166, // 82: tabletmanagerdata.ChangeTagsRequest.tags:type_name -> tabletmanagerdata.ChangeTagsRequest.TagsEntry + 167, // 83: tabletmanagerdata.ChangeTagsResponse.tags:type_name -> tabletmanagerdata.ChangeTagsResponse.TagsEntry + 182, // 84: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource + 181, // 85: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time + 181, // 86: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time + 185, // 87: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState + 181, // 88: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time + 181, // 89: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time + 1, // 90: tabletmanagerdata.CheckThrottlerResponse.Metric.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 155, // 91: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric + 157, // 92: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + 181, // 93: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time + 160, // 94: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + 187, // 95: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule + 181, // 96: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time + 1, // 97: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 164, // 98: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + 99, // [99:99] is the sub-list for method output_type + 99, // [99:99] is the sub-list for method input_type + 99, // [99:99] is the sub-list for extension type_name + 99, // [99:99] is the sub-list for extension extendee + 0, // [0:99] is the sub-list for field type_name } func init() { file_tabletmanagerdata_proto_init() } @@ -9590,14 +9655,15 @@ func file_tabletmanagerdata_proto_init() { file_tabletmanagerdata_proto_msgTypes[108].OneofWrappers = []any{} file_tabletmanagerdata_proto_msgTypes[130].OneofWrappers = []any{} file_tabletmanagerdata_proto_msgTypes[132].OneofWrappers = []any{} - file_tabletmanagerdata_proto_msgTypes[134].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[133].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[135].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tabletmanagerdata_proto_rawDesc, NumEnums: 2, - NumMessages: 165, + NumMessages: 166, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go index 9f6b0df851b..eaedd9c4bc7 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go @@ -2579,6 +2579,24 @@ func (m *VDiffOptions) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *VDiffTableLastPK) CloneVT() *VDiffTableLastPK { + if m == nil { + return (*VDiffTableLastPK)(nil) + } + r := new(VDiffTableLastPK) + r.Target = m.Target.CloneVT() + r.Source = m.Source.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VDiffTableLastPK) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflowRequest { if m == nil { return (*UpdateVReplicationWorkflowRequest)(nil) @@ -9350,6 +9368,59 @@ func (m *VDiffOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *VDiffTableLastPK) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VDiffTableLastPK) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VDiffTableLastPK) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Source != nil { + size, err := m.Source.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Target != nil { + size, err := m.Target.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *UpdateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -12772,6 +12843,24 @@ func (m *VDiffOptions) SizeVT() (n int) { return n } +func (m *VDiffTableLastPK) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Target != nil { + l = m.Target.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Source != nil { + l = m.Source.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { if m == nil { return 0 @@ -27261,6 +27350,129 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *VDiffTableLastPK) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VDiffTableLastPK: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VDiffTableLastPK: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Target == nil { + m.Target = &query.QueryResult{} + } + if err := m.Target.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &query.QueryResult{} + } + if err := m.Source.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index 61d713a8e58..374756418c6 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -139,7 +139,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest(fmt.Sprintf("select column_name as column_name, collation_name as collation_name from information_schema.columns where table_schema='%s' and table_name='t1' and column_name in ('c1')", vdiffDBName), sqltypes.MakeTestResult(sqltypes.MakeTestFields( "collation_name", @@ -159,7 +159,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{"TableName": "t1", "MatchingRows": 1, "ProcessedRows": 1, "MismatchedRows": 0, "ExtraRowsSource": 0, "ExtraRowsTarget": 0}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest("update _vt.vdiff_table set table_rows = 1 where vdiff_id = 1 and table_name = 't1'", singleRowAffected, nil) @@ -169,7 +169,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{"TableName": "t1", "MatchingRows": 1, "ProcessedRows": 1, "MismatchedRows": 0, "ExtraRowsSource": 0, "ExtraRowsTarget": 0}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest("update _vt.vdiff_table set state = 'started' where vdiff_id = 1 and table_name = 't1'", singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`insert into _vt.vdiff_log(vdiff_id, message) values (1, 'started: table \'t1\'')`, singleRowAffected, nil) @@ -185,7 +185,7 @@ func TestVDiff(t *testing.T) { "lastpk|mismatch|report", "varbinary|int64|json", ), - `fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}|0|{}`, + `target:{fields:{name:"c1" type:INT64 table:"t1" org_table:"t1" database:"vt_customer" org_name:"c1" column_length:20 charset:63 flags:53251} rows:{lengths:1 values:"1"}}|0|{}`, ), nil) vdenv.dbClient.ExpectRequest(`update _vt.vdiff_table set rows_compared = 0, report = '{"TableName":"t1","ProcessedRows":0,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 't1'`, singleRowAffected, nil) vdenv.dbClient.ExpectRequest(`update _vt.vdiff_table set state = 'completed', rows_compared = 0, report = '{"TableName":"t1","ProcessedRows":0,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 't1'`, singleRowAffected, nil) diff --git a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go index 7d4cdb78c20..563741fcd23 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go @@ -678,5 +678,15 @@ func (tvde *testVDiffEnv) createController(t *testing.T, id int) *controller { tvde.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vdiff where id = %d", id), noResults, nil) ct, err := newController(context.Background(), controllerQR.Named().Row(), tvde.dbClientFactory, tstenv.TopoServ, tvde.vde, tvde.opts) require.NoError(t, err) + ct.sources = map[string]*migrationSource{ + tstenv.ShardName: { + vrID: 1, + shardStreamer: &shardStreamer{ + tablet: tvde.vde.thisTablet, + shard: tstenv.ShardName, + }, + }, + } + ct.sourceKeyspace = tstenv.KeyspaceName return ct } diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index 102d7535af9..1ebeab8ed8d 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -20,10 +20,12 @@ import ( "context" "encoding/json" "fmt" + "slices" "strings" "sync" "time" + "golang.org/x/exp/maps" "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/mysql/collations" @@ -34,6 +36,7 @@ import ( "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -86,9 +89,10 @@ type tableDiffer struct { targetPrimitive engine.Primitive // sourceQuery is computed from the associated query for this table in the vreplication workflow's Rule Filter - sourceQuery string - table *tabletmanagerdatapb.TableDefinition - lastPK *querypb.QueryResult + sourceQuery string + table *tabletmanagerdatapb.TableDefinition + lastSourcePK *querypb.QueryResult + lastTargetPK *querypb.QueryResult // wgShardStreamers is used, with a cancellable context, to wait for all shard streamers // to finish after each diff is complete. @@ -238,15 +242,9 @@ func (td *tableDiffer) selectTablets(ctx context.Context) error { sourceCells := strings.Split(td.wd.opts.PickerOptions.SourceCell, ",") targetCells := strings.Split(td.wd.opts.PickerOptions.TargetCell, ",") - // For Mount+Migrate, the source tablets will be in a different - // Vitess cluster with its own TopoServer. - sourceTopoServer := td.wd.ct.ts - if td.wd.ct.externalCluster != "" { - extTS, err := td.wd.ct.ts.OpenExternalVitessClusterServer(ctx, td.wd.ct.externalCluster) - if err != nil { - return err - } - sourceTopoServer = extTS + sourceTopoServer, err := td.wd.getSourceTopoServer() + if err != nil { + return vterrors.Wrap(err, "failed to get source topo server") } tabletPickerOptions := discovery.TabletPickerOptions{} wg.Add(1) @@ -349,7 +347,7 @@ func (td *tableDiffer) startTargetDataStream(ctx context.Context) error { ct := td.wd.ct gtidch := make(chan string, 1) ct.targetShardStreamer.result = make(chan *sqltypes.Result, 1) - go td.streamOneShard(ctx, ct.targetShardStreamer, td.tablePlan.targetQuery, td.lastPK, gtidch) + go td.streamOneShard(ctx, ct.targetShardStreamer, td.tablePlan.targetQuery, td.lastTargetPK, gtidch) gtid, ok := <-gtidch if !ok { log.Infof("streaming error: %v", ct.targetShardStreamer.err) @@ -364,7 +362,7 @@ func (td *tableDiffer) startSourceDataStreams(ctx context.Context) error { if err := td.forEachSource(func(source *migrationSource) error { gtidch := make(chan string, 1) source.result = make(chan *sqltypes.Result, 1) - go td.streamOneShard(ctx, source.shardStreamer, td.tablePlan.sourceQuery, td.lastPK, gtidch) + go td.streamOneShard(ctx, source.shardStreamer, td.tablePlan.sourceQuery, td.lastSourcePK, gtidch) gtid, ok := <-gtidch if !ok { @@ -721,32 +719,17 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D if dr == nil { return fmt.Errorf("cannot update progress with a nil diff report") } - var lastPK []byte + var err error var query string rpt, err := json.Marshal(dr) if err != nil { return err } - if lastRow != nil { - lastPK, err = td.lastPKFromRow(lastRow) - if err != nil { - return err - } - - if td.wd.opts.CoreOptions.MaxDiffSeconds > 0 { - // Update the in-memory lastPK as well so that we can restart the table - // diff if needed. - lastpkpb := &querypb.QueryResult{} - if err := prototext.Unmarshal(lastPK, lastpkpb); err != nil { - return err - } - td.lastPK = lastpkpb - } - query, err = sqlparser.ParseAndBind(sqlUpdateTableProgress, + if lastRow == nil { + query, err = sqlparser.ParseAndBind(sqlUpdateTableNoProgress, sqltypes.Int64BindVariable(dr.ProcessedRows), - sqltypes.StringBindVariable(string(lastPK)), sqltypes.StringBindVariable(string(rpt)), sqltypes.Int64BindVariable(td.wd.ct.id), sqltypes.StringBindVariable(td.table.Name), @@ -755,8 +738,25 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D return err } } else { - query, err = sqlparser.ParseAndBind(sqlUpdateTableNoProgress, + lastPK := td.lastPKFromRow(lastRow) + if td.wd.opts.CoreOptions.MaxDiffSeconds > 0 { + // Update the in-memory lastPK as well so that we can restart the table + // diff if needed. + td.lastTargetPK = lastPK.Target + if lastPK.Source == nil { + // If the source PK is nil, we use the target value for both. + td.lastSourcePK = lastPK.Target + } else { + td.lastSourcePK = lastPK.Source + } + } + lastPKTxt, err := prototext.Marshal(lastPK) + if err != nil { + return vterrors.Wrapf(err, "failed to marshal lastpk value %+v for table %s", lastPK, td.table.Name) + } + query, err = sqlparser.ParseAndBind(sqlUpdateTableProgress, sqltypes.Int64BindVariable(dr.ProcessedRows), + sqltypes.StringBindVariable(string(lastPKTxt)), sqltypes.StringBindVariable(string(rpt)), sqltypes.Int64BindVariable(td.wd.ct.id), sqltypes.StringBindVariable(td.table.Name), @@ -768,6 +768,7 @@ func (td *tableDiffer) updateTableProgress(dbClient binlogplayer.DBClient, dr *D if _, err := dbClient.ExecuteFetch(query, 1); err != nil { return err } + td.wd.ct.TableDiffRowCounts.Add(td.table.Name, dr.ProcessedRows) return nil } @@ -832,19 +833,30 @@ func updateTableMismatch(dbClient binlogplayer.DBClient, vdiffID int64, table st return nil } -func (td *tableDiffer) lastPKFromRow(row []sqltypes.Value) ([]byte, error) { - pkColCnt := len(td.tablePlan.pkCols) - pkFields := make([]*querypb.Field, pkColCnt) - pkVals := make([]sqltypes.Value, pkColCnt) - for i, colIndex := range td.tablePlan.pkCols { - pkFields[i] = td.tablePlan.table.Fields[colIndex] - pkVals[i] = row[colIndex] - } - buf, err := prototext.Marshal(&querypb.QueryResult{ - Fields: pkFields, - Rows: []*querypb.Row{sqltypes.RowToProto3(pkVals)}, - }) - return buf, err +func (td *tableDiffer) lastPKFromRow(row []sqltypes.Value) *tabletmanagerdatapb.VDiffTableLastPK { + buildQR := func(pkCols []int) *querypb.QueryResult { + pkColCnt := len(pkCols) + pkFields := make([]*querypb.Field, pkColCnt) + pkVals := make([]sqltypes.Value, pkColCnt) + for i, colIndex := range pkCols { + pkFields[i] = td.tablePlan.table.Fields[colIndex] + pkVals[i] = row[colIndex] + } + return &querypb.QueryResult{ + Fields: pkFields, + Rows: []*querypb.Row{sqltypes.RowToProto3(pkVals)}, + } + } + lastPK := &tabletmanagerdatapb.VDiffTableLastPK{ + Target: buildQR(td.tablePlan.pkCols), + } + // If the source and target PKs are different, we need to save the source PK + // as well. Otherwise the source will be nil which means that the target value + // should also be used for the source. + if !slices.Equal(td.tablePlan.pkCols, td.tablePlan.sourcePkCols) { + lastPK.Source = buildQR(td.tablePlan.sourcePkCols) + } + return lastPK } // If SourceTimeZone is defined in the BinlogSource (_vt.vreplication.source), the @@ -893,6 +905,83 @@ func (td *tableDiffer) adjustForSourceTimeZone(targetSelectExprs sqlparser.Selec return targetSelectExprs } +// getSourcePKCols populates the sourcePkCols field in the tablePlan. +// We need this information in order to save the lastpk value for the +// source if the PK columns differ between the source and target. +func (td *tableDiffer) getSourcePKCols() error { + ctx, cancel := context.WithTimeout(td.wd.ct.vde.ctx, topo.RemoteOperationTimeout*3) + defer cancel() + + // We use the first sourceShard as all of them should have the same schema. + if len(td.wd.ct.sources) == 0 { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no source shards found in %s keyspace", + td.wd.ct.sourceKeyspace) + } + sourceShardName := maps.Keys(td.wd.ct.sources)[0] + sourceTS, err := td.wd.getSourceTopoServer() + if err != nil { + return vterrors.Wrap(err, "failed to get source topo server") + } + sourceShard, err := sourceTS.GetShard(ctx, td.wd.ct.sourceKeyspace, sourceShardName) + if err != nil { + return vterrors.Wrapf(err, "failed to get source shard %s", sourceShardName) + } + if sourceShard.PrimaryAlias == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "source shard %s has no primary", sourceShardName) + } + sourceTablet, err := sourceTS.GetTablet(ctx, sourceShard.PrimaryAlias) + if err != nil { + return vterrors.Wrapf(err, "failed to get primary tablet in source shard %s/%s", + td.wd.ct.sourceKeyspace, sourceShardName) + } + sourceSchema, err := td.wd.ct.tmc.GetSchema(ctx, sourceTablet.Tablet, &tabletmanagerdatapb.GetSchemaRequest{ + Tables: []string{td.table.Name}, + }) + if err != nil { + return vterrors.Wrapf(err, "failed to get the schema for table %s from source tablet %s", + td.table.Name, topoproto.TabletAliasString(sourceTablet.Tablet.Alias)) + } + sourceTable := sourceSchema.TableDefinitions[0] + if len(sourceTable.PrimaryKeyColumns) == 0 { + // We use the columns from a PKE if there is one. + executeFetch := func(query string, maxrows int, wantfields bool) (*sqltypes.Result, error) { + res, err := td.wd.ct.tmc.ExecuteFetchAsApp(ctx, sourceTablet.Tablet, false, &tabletmanagerdatapb.ExecuteFetchAsAppRequest{ + Query: []byte(query), + MaxRows: 1, + }) + if err != nil { + return nil, vterrors.Wrapf(err, "failed to query the %s source tablet in order to get a primary key equivalent for the %s table", + topoproto.TabletAliasString(sourceTablet.Tablet.Alias), td.table.Name) + } + return sqltypes.Proto3ToResult(res), nil + } + pkeCols, _, err := mysqlctl.GetPrimaryKeyEquivalentColumns(ctx, executeFetch, sourceTablet.DbName(), td.table.Name) + if err != nil { + return vterrors.Wrapf(err, "failed to get a primary key equivalent for the %s table from source tablet %s", + td.table.Name, topoproto.TabletAliasString(sourceTablet.Tablet.Alias)) + } + if len(pkeCols) > 0 { + sourceTable.PrimaryKeyColumns = pkeCols + } else { + // We use every column together as a substitute PK. + sourceTable.PrimaryKeyColumns = append(sourceTable.PrimaryKeyColumns, td.table.Columns...) + } + } + + sourcePKColumns := make(map[string]struct{}, len(sourceTable.PrimaryKeyColumns)) + td.tablePlan.sourcePkCols = make([]int, 0, len(sourceTable.PrimaryKeyColumns)) + for _, pkc := range sourceTable.PrimaryKeyColumns { + sourcePKColumns[pkc] = struct{}{} + } + for i, pkc := range td.table.Columns { + if _, ok := sourcePKColumns[pkc]; ok { + td.tablePlan.sourcePkCols = append(td.tablePlan.sourcePkCols, i) + } + } + + return nil +} + func getColumnNameForSelectExpr(selectExpression sqlparser.SelectExpr) (string, error) { aliasedExpr := selectExpression.(*sqlparser.AliasedExpr) expr := aliasedExpr.Expr diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go new file mode 100644 index 00000000000..03ba218cd66 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ_test.go @@ -0,0 +1,131 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package vdiff + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/vt/binlog/binlogplayer" + + querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +func TestUpdateTableProgress(t *testing.T) { + wd := &workflowDiffer{ + ct: &controller{ + id: 1, + TableDiffRowCounts: stats.NewCountersWithSingleLabel("", "", "Rows"), + }, + opts: &tabletmanagerdatapb.VDiffOptions{ + CoreOptions: &tabletmanagerdatapb.VDiffCoreOptions{ + MaxDiffSeconds: 100, + }, + }, + } + table := &tabletmanagerdatapb.TableDefinition{ + Name: "test", + } + dr := &DiffReport{ + TableName: table.Name, + ProcessedRows: 1e9, + } + queryTemplate := `update _vt.vdiff_table set rows_compared = 1000000000, lastpk = '%s', report = '{"TableName":"test","ProcessedRows":1000000000,"MatchingRows":0,"MismatchedRows":0,"ExtraRowsSource":0,"ExtraRowsTarget":0}' where vdiff_id = 1 and table_name = 'test'` + + testCases := []struct { + name string + fields []*querypb.Field + pkCols []int + sourcePkCols []int + lastRow []sqltypes.Value + expectedLastPK string + wantErr bool + }{ + { + name: "identical PKs", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0, 1}, + sourcePkCols: []int{0, 1}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}}`, + }, + { + name: "more PK cols on target", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0, 1}, + sourcePkCols: []int{0}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}} source:{fields:{name:"a" type:INT64} rows:{lengths:1 values:"1"}}`, + }, + { + name: "more PK cols on source", + fields: []*querypb.Field{ + { + Name: "a", Type: sqltypes.Int64, + }, + { + Name: "b", Type: sqltypes.Int64, + }, + }, + pkCols: []int{0}, + sourcePkCols: []int{0, 1}, + lastRow: []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewInt64(2)}, + expectedLastPK: `target:{fields:{name:"a" type:INT64} rows:{lengths:1 values:"1"}} source:{fields:{name:"a" type:INT64} fields:{name:"b" type:INT64} rows:{lengths:1 lengths:1 values:"12"}}`, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + dbc := binlogplayer.NewMockDBClient(t) + dbc.ExpectRequest(fmt.Sprintf(queryTemplate, tc.expectedLastPK), &sqltypes.Result{}, nil) + td := &tableDiffer{ + wd: wd, + table: table, + tablePlan: &tablePlan{ + pkCols: tc.pkCols, + sourcePkCols: tc.sourcePkCols, + table: &tabletmanagerdatapb.TableDefinition{ + Fields: tc.fields, + }, + }, + } + if err := td.updateTableProgress(dbc, dr, tc.lastRow); (err != nil) != tc.wantErr { + require.FailNow(t, "tableDiffer.updateTableProgress() error = %v, wantErr %v", + err, tc.wantErr) + } + }) + } +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go index 836df8ffe94..b5ea384d864 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go @@ -53,6 +53,11 @@ type tablePlan struct { comparePKs []compareColInfo // pkCols has the indices of PK cols in the select list pkCols []int + // sourcePkCols has the indices of PK cols in the select + // list, but from the source keyspace. This is needed to + // properly store the lastpk for the source when the source + // and target have different PK columns. + sourcePkCols []int // selectPks is the list of pk columns as they appear in the select clause for the diff. selectPks []int diff --git a/go/vt/vttablet/tabletmanager/vdiff/utils.go b/go/vt/vttablet/tabletmanager/vdiff/utils.go index aeaa28972e0..68e8a6acb57 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/utils.go +++ b/go/vt/vttablet/tabletmanager/vdiff/utils.go @@ -80,17 +80,6 @@ func insertVDiffLog(ctx context.Context, dbClient binlogplayer.DBClient, vdiffID } } -func stringListContains(lst []string, item string) bool { - contains := false - for _, t := range lst { - if t == item { - contains = true - break - } - } - return contains -} - // copyNonKeyRangeExpressions copies all expressions from the input WHERE clause // to the output WHERE clause except for any in_keyrange() expressions. func copyNonKeyRangeExpressions(where *sqlparser.Where) *sqlparser.Where { diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go index ef30d8f14b0..775ae1d9179 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "reflect" + "slices" "strings" "time" @@ -33,6 +34,7 @@ import ( "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtctl/schematools" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" @@ -40,7 +42,6 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -344,7 +345,7 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl for _, table := range schm.TableDefinitions { // if user specified tables explicitly only use those, otherwise diff all tables in workflow - if len(specifiedTables) != 0 && !stringListContains(specifiedTables, table.Name) { + if len(specifiedTables) != 0 && !slices.Contains(specifiedTables, table.Name) { continue } if schema.IsInternalOperationTableName(table.Name) && !schema.IsOnlineDDLTableName(table.Name) { @@ -370,15 +371,24 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl } td := newTableDiffer(wd, table, sourceQuery) - lastpkpb, err := wd.getTableLastPK(dbClient, table.Name) + lastPK, err := wd.getTableLastPK(dbClient, table.Name) if err != nil { return err } - td.lastPK = lastpkpb + if lastPK != nil { + td.lastSourcePK = lastPK.Source + td.lastTargetPK = lastPK.Target + } wd.tableDiffers[table.Name] = td if _, err := td.buildTablePlan(dbClient, wd.ct.vde.dbName, wd.collationEnv); err != nil { return err } + // We get the PK columns from the source schema as well as they can differ + // and they determine the proper position to use when saving our progress. + if err := td.getSourcePKCols(); err != nil { + return vterrors.Wrapf(err, "could not get the primary key columns from the %s source keyspace", + wd.ct.sourceKeyspace) + } } if len(wd.tableDiffers) == 0 { return fmt.Errorf("no tables found to diff, %s:%s, on tablet %v", @@ -388,7 +398,7 @@ func (wd *workflowDiffer) buildPlan(dbClient binlogplayer.DBClient, filter *binl } // getTableLastPK gets the lastPK protobuf message for a given vdiff table. -func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableName string) (*querypb.QueryResult, error) { +func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableName string) (*tabletmanagerdatapb.VDiffTableLastPK, error) { query, err := sqlparser.ParseAndBind(sqlGetVDiffTable, sqltypes.Int64BindVariable(wd.ct.id), sqltypes.StringBindVariable(tableName), @@ -406,11 +416,15 @@ func (wd *workflowDiffer) getTableLastPK(dbClient binlogplayer.DBClient, tableNa return nil, err } if len(lastpk) != 0 { - var lastpkpb querypb.QueryResult - if err := prototext.Unmarshal(lastpk, &lastpkpb); err != nil { - return nil, err + lastPK := &tabletmanagerdatapb.VDiffTableLastPK{} + if err := prototext.Unmarshal(lastpk, lastPK); err != nil { + return nil, vterrors.Wrapf(err, "failed to unmarshal lastpk value of %s for the %s table", + string(lastpk), tableName) + } + if lastPK.Source == nil { // Then it's the same as the target + lastPK.Source = lastPK.Target } - return &lastpkpb, nil + return lastPK, nil } } return nil, nil @@ -488,3 +502,14 @@ func (wd *workflowDiffer) initVDiffTables(dbClient binlogplayer.DBClient) error } return nil } + +// getSourceTopoServer returns the source topo server as for Mount+Migrate the +// source tablets will be in a different Vitess cluster with its own TopoServer. +func (wd *workflowDiffer) getSourceTopoServer() (*topo.Server, error) { + if wd.ct.externalCluster == "" { + return wd.ct.ts, nil + } + ctx, cancel := context.WithTimeout(wd.ct.vde.ctx, topo.RemoteOperationTimeout) + defer cancel() + return wd.ct.ts.OpenExternalVitessClusterServer(ctx, wd.ct.externalCluster) +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go index c51b6fdf281..5ac0fabd726 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go @@ -51,6 +51,16 @@ func TestBuildPlanSuccess(t *testing.T) { vdiffenv.dbClient.ExpectRequest("select * from _vt.vdiff where id = 1", noResults, nil) ct, err := newController(context.Background(), controllerQR.Named().Row(), vdiffenv.dbClientFactory, tstenv.TopoServ, vdiffenv.vde, vdiffenv.opts) require.NoError(t, err) + ct.sources = map[string]*migrationSource{ + tstenv.ShardName: { + vrID: 1, + shardStreamer: &shardStreamer{ + tablet: vdenv.vde.thisTablet, + shard: tstenv.ShardName, + }, + }, + } + ct.sourceKeyspace = tstenv.KeyspaceName testcases := []struct { input *binlogdatapb.Rule @@ -63,14 +73,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -83,14 +94,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -103,14 +115,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -123,14 +136,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c2, c1 from t1 order by c1 asc", - targetQuery: "select c2, c1 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c2, c1 from t1 order by c1 asc", + targetQuery: "select c2, c1 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{1}, + sourcePkCols: []int{0}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -143,14 +157,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c0 as c1, c2 from t2 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c0 as c1, c2 from t2 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -164,14 +179,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nonpktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], - sourceQuery: "select c1, textcol from nonpktext order by c1 asc", - targetQuery: "select c1, textcol from nonpktext order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], + sourceQuery: "select c1, textcol from nonpktext order by c1 asc", + targetQuery: "select c1, textcol from nonpktext order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -185,14 +201,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nonpktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], - sourceQuery: "select textcol, c1 from nonpktext order by c1 asc", - targetQuery: "select textcol, c1 from nonpktext order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nonpktext"]], + sourceQuery: "select textcol, c1 from nonpktext order by c1 asc", + targetQuery: "select textcol, c1 from nonpktext order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{1}, + sourcePkCols: []int{0}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -206,14 +223,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select textcol, c2 from pktext order by textcol asc", - targetQuery: "select textcol, c2 from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select textcol, c2 from pktext order by textcol asc", + targetQuery: "select textcol, c2 from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{0}, + sourcePkCols: []int{}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -227,14 +245,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select c2, textcol from pktext order by textcol asc", - targetQuery: "select c2, textcol from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select c2, textcol from pktext order by textcol asc", + targetQuery: "select c2, textcol from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{1}, + sourcePkCols: []int{}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -248,14 +267,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nopk", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nopk"]], - sourceQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", - targetQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - pkCols: []int{0, 1, 2}, - selectPks: []int{0, 1, 2}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nopk"]], + sourceQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", + targetQuery: "select c1, c2, c3 from nopk order by c1 asc, c2 asc, c3 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + pkCols: []int{0, 1, 2}, + sourcePkCols: []int{0}, + selectPks: []int{0, 1, 2}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, @@ -279,14 +299,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "nopkwithpke", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["nopkwithpke"]], - sourceQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", - targetQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - comparePKs: []compareColInfo{{2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, - pkCols: []int{2}, - selectPks: []int{2}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["nopkwithpke"]], + sourceQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", + targetQuery: "select c1, c2, c3 from nopkwithpke order by c3 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + comparePKs: []compareColInfo{{2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c3"}}, + pkCols: []int{2}, + sourcePkCols: []int{0}, + selectPks: []int{2}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c3")}, @@ -302,14 +323,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "pktext", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["pktext"]], - sourceQuery: "select c2, a + b as textcol from pktext order by textcol asc", - targetQuery: "select c2, textcol from pktext order by textcol asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, - pkCols: []int{1}, - selectPks: []int{1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["pktext"]], + sourceQuery: "select c2, a + b as textcol from pktext order by textcol asc", + targetQuery: "select c2, textcol from pktext order by textcol asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + comparePKs: []compareColInfo{{1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "textcol"}}, + pkCols: []int{1}, + sourcePkCols: []int{}, + selectPks: []int{1}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("textcol")}, Direction: sqlparser.AscOrder, @@ -322,14 +344,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "multipk", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["multipk"]], - sourceQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", - targetQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, - pkCols: []int{0, 1}, - selectPks: []int{0, 1}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["multipk"]], + sourceQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", + targetQuery: "select c1, c2 from multipk order by c1 asc, c2 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c2"}}, + pkCols: []int{0, 1}, + sourcePkCols: []int{0}, + selectPks: []int{0, 1}, orderBy: sqlparser.OrderBy{ &sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, @@ -349,14 +372,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -370,14 +394,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -391,14 +416,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') and c2 = 2 order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where in_keyrange('-80') and c2 = 2 order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -412,14 +438,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 and c1 = 1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -433,14 +460,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", - targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 where c2 = 2 and in_keyrange('-80') order by c1 asc", + targetQuery: "select c1, c2 from t1 where c2 = 2 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -454,14 +482,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "t1", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["t1"]], - sourceQuery: "select c1, c2 from t1 group by c1 order by c1 asc", - targetQuery: "select c1, c2 from t1 order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["t1"]], + sourceQuery: "select c1, c2 from t1 group by c1 order by c1 asc", + targetQuery: "select c1, c2 from t1 order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -475,14 +504,15 @@ func TestBuildPlanSuccess(t *testing.T) { }, table: "aggr", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["aggr"]], - sourceQuery: "select c1, c2, count(*) as c3, sum(c4) as c4 from t1 group by c1 order by c1 asc", - targetQuery: "select c1, c2, c3, c4 from aggr order by c1 asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c3"}, {3, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c4"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["aggr"]], + sourceQuery: "select c1, c2, count(*) as c3, sum(c4) as c4 from t1 group by c1 order by c1 asc", + targetQuery: "select c1, c2, c3, c4 from aggr order by c1 asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c2"}, {2, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c3"}, {3, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "c4"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "c1"}}, + pkCols: []int{0}, + sourcePkCols: []int{0}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("c1")}, Direction: sqlparser.AscOrder, @@ -500,14 +530,15 @@ func TestBuildPlanSuccess(t *testing.T) { sourceTimeZone: "US/Pacific", table: "datze", tablePlan: &tablePlan{ - dbName: vdiffDBName, - table: testSchema.TableDefinitions[tableDefMap["datze"]], - sourceQuery: "select id, dt from datze order by id asc", - targetQuery: "select id, convert_tz(dt, 'UTC', 'US/Pacific') as dt from datze order by id asc", - compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "dt"}}, - comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}}, - pkCols: []int{0}, - selectPks: []int{0}, + dbName: vdiffDBName, + table: testSchema.TableDefinitions[tableDefMap["datze"]], + sourceQuery: "select id, dt from datze order by id asc", + targetQuery: "select id, convert_tz(dt, 'UTC', 'US/Pacific') as dt from datze order by id asc", + compareCols: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}, {1, collations.MySQL8().LookupByName(sqltypes.NULL.String()), false, "dt"}}, + comparePKs: []compareColInfo{{0, collations.MySQL8().LookupByName(sqltypes.NULL.String()), true, "id"}}, + pkCols: []int{0}, + sourcePkCols: []int{}, + selectPks: []int{0}, orderBy: sqlparser.OrderBy{&sqlparser.Order{ Expr: &sqlparser.ColName{Name: sqlparser.NewIdentifierCI("id")}, Direction: sqlparser.AscOrder, diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index 31c47674233..317936e4289 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -276,7 +276,8 @@ func (rs *rowStreamer) buildSelect(st *binlogdatapb.MinimalTable) (string, error buf.Myprintf(" from %v%s", sqlparser.NewIdentifierCS(rs.plan.Table.Name), indexHint) if len(rs.lastpk) != 0 { if len(rs.lastpk) != len(rs.pkColumns) { - return "", fmt.Errorf("primary key values don't match length: %v vs %v", rs.lastpk, rs.pkColumns) + return "", fmt.Errorf("cannot build a row streamer plan for the %s table as a lastpk value was provided and the number of primary key values within it (%v) does not match the number of primary key columns in the table (%d)", + st.Name, rs.lastpk, rs.pkColumns) } buf.WriteString(" where ") prefix := "" diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index bb20e712e7f..4a3dd20a0a1 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -760,6 +760,13 @@ message VDiffOptions { VDiffReportOptions report_options = 3; } +message VDiffTableLastPK { + query.QueryResult target = 1; + // If the source value is nil then it's the same as the target + // and the target value should be used for both. + optional query.QueryResult source = 2; +} + // UpdateVReplicationWorkflowRequest is used to update an existing VReplication // workflow. Note that the following fields MUST have an explicit value provided diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 234c7e0f323..0e6790010bc 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -34138,6 +34138,112 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a VDiffTableLastPK. */ + interface IVDiffTableLastPK { + + /** VDiffTableLastPK target */ + target?: (query.IQueryResult|null); + + /** VDiffTableLastPK source */ + source?: (query.IQueryResult|null); + } + + /** Represents a VDiffTableLastPK. */ + class VDiffTableLastPK implements IVDiffTableLastPK { + + /** + * Constructs a new VDiffTableLastPK. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IVDiffTableLastPK); + + /** VDiffTableLastPK target. */ + public target?: (query.IQueryResult|null); + + /** VDiffTableLastPK source. */ + public source?: (query.IQueryResult|null); + + /** VDiffTableLastPK _source. */ + public _source?: "source"; + + /** + * Creates a new VDiffTableLastPK instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffTableLastPK instance + */ + public static create(properties?: tabletmanagerdata.IVDiffTableLastPK): tabletmanagerdata.VDiffTableLastPK; + + /** + * Encodes the specified VDiffTableLastPK message. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @param message VDiffTableLastPK message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IVDiffTableLastPK, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffTableLastPK message, length delimited. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @param message VDiffTableLastPK message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IVDiffTableLastPK, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.VDiffTableLastPK; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.VDiffTableLastPK; + + /** + * Verifies a VDiffTableLastPK message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffTableLastPK message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffTableLastPK + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.VDiffTableLastPK; + + /** + * Creates a plain object from a VDiffTableLastPK message. Also converts values to other types if specified. + * @param message VDiffTableLastPK + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.VDiffTableLastPK, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffTableLastPK to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffTableLastPK + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of an UpdateVReplicationWorkflowRequest. */ interface IUpdateVReplicationWorkflowRequest { diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index f1935b2a9b3..ed8ce616076 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -78899,6 +78899,262 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return VDiffOptions; })(); + tabletmanagerdata.VDiffTableLastPK = (function() { + + /** + * Properties of a VDiffTableLastPK. + * @memberof tabletmanagerdata + * @interface IVDiffTableLastPK + * @property {query.IQueryResult|null} [target] VDiffTableLastPK target + * @property {query.IQueryResult|null} [source] VDiffTableLastPK source + */ + + /** + * Constructs a new VDiffTableLastPK. + * @memberof tabletmanagerdata + * @classdesc Represents a VDiffTableLastPK. + * @implements IVDiffTableLastPK + * @constructor + * @param {tabletmanagerdata.IVDiffTableLastPK=} [properties] Properties to set + */ + function VDiffTableLastPK(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * VDiffTableLastPK target. + * @member {query.IQueryResult|null|undefined} target + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + VDiffTableLastPK.prototype.target = null; + + /** + * VDiffTableLastPK source. + * @member {query.IQueryResult|null|undefined} source + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + VDiffTableLastPK.prototype.source = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * VDiffTableLastPK _source. + * @member {"source"|undefined} _source + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + */ + Object.defineProperty(VDiffTableLastPK.prototype, "_source", { + get: $util.oneOfGetter($oneOfFields = ["source"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new VDiffTableLastPK instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK=} [properties] Properties to set + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK instance + */ + VDiffTableLastPK.create = function create(properties) { + return new VDiffTableLastPK(properties); + }; + + /** + * Encodes the specified VDiffTableLastPK message. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK} message VDiffTableLastPK message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VDiffTableLastPK.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.target != null && Object.hasOwnProperty.call(message, "target")) + $root.query.QueryResult.encode(message.target, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.source != null && Object.hasOwnProperty.call(message, "source")) + $root.query.QueryResult.encode(message.source, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified VDiffTableLastPK message, length delimited. Does not implicitly {@link tabletmanagerdata.VDiffTableLastPK.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.IVDiffTableLastPK} message VDiffTableLastPK message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VDiffTableLastPK.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VDiffTableLastPK.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.VDiffTableLastPK(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.target = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + case 2: { + message.source = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a VDiffTableLastPK message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VDiffTableLastPK.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a VDiffTableLastPK message. + * @function verify + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + VDiffTableLastPK.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + let properties = {}; + if (message.target != null && message.hasOwnProperty("target")) { + let error = $root.query.QueryResult.verify(message.target); + if (error) + return "target." + error; + } + if (message.source != null && message.hasOwnProperty("source")) { + properties._source = 1; + { + let error = $root.query.QueryResult.verify(message.source); + if (error) + return "source." + error; + } + } + return null; + }; + + /** + * Creates a VDiffTableLastPK message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.VDiffTableLastPK} VDiffTableLastPK + */ + VDiffTableLastPK.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.VDiffTableLastPK) + return object; + let message = new $root.tabletmanagerdata.VDiffTableLastPK(); + if (object.target != null) { + if (typeof object.target !== "object") + throw TypeError(".tabletmanagerdata.VDiffTableLastPK.target: object expected"); + message.target = $root.query.QueryResult.fromObject(object.target); + } + if (object.source != null) { + if (typeof object.source !== "object") + throw TypeError(".tabletmanagerdata.VDiffTableLastPK.source: object expected"); + message.source = $root.query.QueryResult.fromObject(object.source); + } + return message; + }; + + /** + * Creates a plain object from a VDiffTableLastPK message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {tabletmanagerdata.VDiffTableLastPK} message VDiffTableLastPK + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + VDiffTableLastPK.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.target = null; + if (message.target != null && message.hasOwnProperty("target")) + object.target = $root.query.QueryResult.toObject(message.target, options); + if (message.source != null && message.hasOwnProperty("source")) { + object.source = $root.query.QueryResult.toObject(message.source, options); + if (options.oneofs) + object._source = "source"; + } + return object; + }; + + /** + * Converts this VDiffTableLastPK to JSON. + * @function toJSON + * @memberof tabletmanagerdata.VDiffTableLastPK + * @instance + * @returns {Object.} JSON object + */ + VDiffTableLastPK.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for VDiffTableLastPK + * @function getTypeUrl + * @memberof tabletmanagerdata.VDiffTableLastPK + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + VDiffTableLastPK.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.VDiffTableLastPK"; + }; + + return VDiffTableLastPK; + })(); + tabletmanagerdata.UpdateVReplicationWorkflowRequest = (function() { /** From cbf146b5ebefeb27acc409e105d14cfc83567b63 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Jan 2025 08:02:38 -0600 Subject: [PATCH 33/66] Security improvements to GitHub Actions (#17520) Signed-off-by: Florent Poinsard --- .github/workflows/assign_milestone.yml | 26 ++++++++----- .github/workflows/auto_approve_pr.yml | 5 ++- .../check_make_vtadmin_authz_testgen.yml | 4 +- .../check_make_vtadmin_web_proto.yml | 4 +- .github/workflows/cluster_endtoend_12.yml | 6 ++- .github/workflows/cluster_endtoend_13.yml | 6 ++- .github/workflows/cluster_endtoend_15.yml | 6 ++- .github/workflows/cluster_endtoend_18.yml | 6 ++- .github/workflows/cluster_endtoend_21.yml | 6 ++- .../cluster_endtoend_backup_pitr.yml | 6 ++- ...luster_endtoend_backup_pitr_mysqlshell.yml | 6 ++- ...luster_endtoend_backup_pitr_xtrabackup.yml | 6 ++- ...ter_endtoend_ers_prs_newfeatures_heavy.yml | 6 ++- .../workflows/cluster_endtoend_mysql80.yml | 6 ++- .../cluster_endtoend_mysql_server_vault.yml | 6 ++- .../cluster_endtoend_onlineddl_revert.yml | 6 ++- .../cluster_endtoend_onlineddl_scheduler.yml | 6 ++- .../cluster_endtoend_onlineddl_vrepl.yml | 6 ++- ...luster_endtoend_onlineddl_vrepl_stress.yml | 6 ++- ..._endtoend_onlineddl_vrepl_stress_suite.yml | 6 ++- ...cluster_endtoend_onlineddl_vrepl_suite.yml | 6 ++- .../cluster_endtoend_schemadiff_vrepl.yml | 6 ++- .../cluster_endtoend_tabletmanager_consul.yml | 6 ++- ...cluster_endtoend_tabletmanager_tablegc.yml | 6 ++- ..._endtoend_tabletmanager_throttler_topo.yml | 6 ++- ...cluster_endtoend_topo_connection_cache.yml | 6 ++- ...dtoend_vreplication_across_db_versions.yml | 6 ++- .../cluster_endtoend_vreplication_basic.yml | 6 ++- ...luster_endtoend_vreplication_cellalias.yml | 6 ++- ...er_endtoend_vreplication_copy_parallel.yml | 6 ++- ...dtoend_vreplication_foreign_key_stress.yml | 6 ++- ...endtoend_vreplication_mariadb_to_mysql.yml | 6 ++- .../cluster_endtoend_vreplication_migrate.yml | 6 ++- ...ter_endtoend_vreplication_multi_tenant.yml | 6 ++- ...ion_partial_movetables_and_materialize.yml | 6 ++- .../cluster_endtoend_vreplication_v2.yml | 6 ++- ...tion_vtctldclient_vdiff2_movetables_tz.yml | 6 ++- .../workflows/cluster_endtoend_vstream.yml | 6 ++- .../workflows/cluster_endtoend_vtbackup.yml | 6 ++- ..._vtctlbackup_sharded_clustertest_heavy.yml | 6 ++- .../cluster_endtoend_vtgate_concurrentdml.yml | 6 ++- ...ster_endtoend_vtgate_foreignkey_stress.yml | 6 ++- .../cluster_endtoend_vtgate_gen4.yml | 6 ++- .../cluster_endtoend_vtgate_general_heavy.yml | 6 ++- .../cluster_endtoend_vtgate_godriver.yml | 6 ++- ...uster_endtoend_vtgate_partial_keyspace.yml | 6 ++- .../cluster_endtoend_vtgate_plantests.yml | 6 ++- .../cluster_endtoend_vtgate_queries.yml | 6 ++- ...cluster_endtoend_vtgate_readafterwrite.yml | 6 ++- .../cluster_endtoend_vtgate_reservedconn.yml | 6 ++- .../cluster_endtoend_vtgate_schema.yml | 6 ++- ...cluster_endtoend_vtgate_schema_tracker.yml | 6 ++- ...dtoend_vtgate_tablet_healthcheck_cache.yml | 6 ++- .../cluster_endtoend_vtgate_topo.yml | 6 ++- .../cluster_endtoend_vtgate_topo_consul.yml | 6 ++- .../cluster_endtoend_vtgate_topo_etcd.yml | 6 ++- .../cluster_endtoend_vtgate_transaction.yml | 6 ++- .../cluster_endtoend_vtgate_unsharded.yml | 6 ++- .../cluster_endtoend_vtgate_vindex_heavy.yml | 6 ++- .../cluster_endtoend_vtgate_vschema.yml | 6 ++- .github/workflows/cluster_endtoend_vtorc.yml | 6 ++- .../cluster_endtoend_vttablet_prscomplex.yml | 6 ++- .../workflows/cluster_endtoend_xb_backup.yml | 6 ++- .../cluster_endtoend_xb_recovery.yml | 6 ++- .github/workflows/codecov.yml | 4 +- .github/workflows/codeql_analysis.yml | 5 ++- .github/workflows/create_release.yml | 37 ++++++++++++++++--- .github/workflows/docker_build_images.yml | 28 ++++++++------ .github/workflows/docker_test_cluster_10.yml | 4 +- .github/workflows/docker_test_cluster_25.yml | 4 +- .github/workflows/e2e_race.yml | 4 +- .github/workflows/endtoend.yml | 4 +- .github/workflows/local_example.yml | 4 +- .github/workflows/region_example.yml | 4 +- .github/workflows/static_checks_etc.yml | 4 +- .github/workflows/unit_race.yml | 4 +- .github/workflows/unit_race_evalengine.yml | 4 +- .../unit_test_evalengine_mysql57.yml | 4 +- .../unit_test_evalengine_mysql80.yml | 4 +- .../unit_test_evalengine_mysql84.yml | 4 +- .github/workflows/unit_test_mysql57.yml | 4 +- .github/workflows/unit_test_mysql80.yml | 4 +- .github/workflows/unit_test_mysql84.yml | 4 +- .../workflows/update_golang_dependencies.yml | 3 +- .github/workflows/update_golang_version.yml | 2 +- .../upgrade_downgrade_test_backups_e2e.yml | 11 ++++-- ...owngrade_test_backups_e2e_next_release.yml | 11 ++++-- .../upgrade_downgrade_test_backups_manual.yml | 11 ++++-- ...grade_test_backups_manual_next_release.yml | 11 ++++-- .../upgrade_downgrade_test_onlineddl_flow.yml | 15 ++++++-- ...e_downgrade_test_query_serving_queries.yml | 8 +++- ...downgrade_test_query_serving_queries_2.yml | 8 +++- ...t_query_serving_queries_2_next_release.yml | 12 ++++-- ...est_query_serving_queries_next_release.yml | 12 ++++-- ...de_downgrade_test_query_serving_schema.yml | 12 ++++-- ...test_query_serving_schema_next_release.yml | 12 ++++-- ...rade_downgrade_test_reparent_new_vtctl.yml | 12 ++++-- ...e_downgrade_test_reparent_new_vttablet.yml | 12 ++++-- ...rade_downgrade_test_reparent_old_vtctl.yml | 12 ++++-- ...e_downgrade_test_reparent_old_vttablet.yml | 12 ++++-- .../upgrade_downgrade_test_semi_sync.yml | 11 ++++-- .github/workflows/vitess_tester_vtgate.yml | 4 +- .github/workflows/vtadmin_web_build.yml | 4 +- .github/workflows/vtadmin_web_lint.yml | 4 +- .github/workflows/vtadmin_web_unit_tests.yml | 4 +- .github/workflows/vtop_example.yml | 4 +- test/templates/cluster_endtoend_test.tpl | 6 ++- .../cluster_endtoend_test_docker.tpl | 4 +- .../cluster_endtoend_test_mysql57.tpl | 4 +- test/templates/cluster_vitess_tester.tpl | 4 +- test/templates/unit_test.tpl | 4 +- 111 files changed, 597 insertions(+), 165 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 6687a239b57..e0c0b100a74 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -4,7 +4,9 @@ on: pull_request_target: types: [opened] -permissions: read-all +permissions: + pull-requests: write + contents: read env: GH_TOKEN: ${{ github.token }} @@ -13,18 +15,24 @@ jobs: build: name: Assign Milestone runs-on: ubuntu-24.04 - permissions: - pull-requests: write steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - go-version-file: go.mod + # We must explicitly checkout the base's SHA to avoid executing any code coming from + # the PR's SHA - Which would be executed in the base branch's context. + # This is really important to limit any sort of pwn requests. + ref: ${{ github.base_ref }} + persist-credentials: 'false' - name: Assign Milestone run: | - gh pr edit ${{ github.event.number }} --milestone "v$(sed -n 's/.*versionName.*\"\([[:digit:]\.]*\).*\"/\1/p' ./go/vt/servenv/version.go)" + # Ensure the content we sed from version.go is sanitized and match the correct format + VERSION=$(sed -n 's/.*versionName.*\"\([[:digit:]\.]*\).*\"/\1/p' ./go/vt/servenv/version.go) + if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Invalid version format: $VERSION" + exit 1 + fi + + gh pr edit ${{ github.event.number }} --milestone "v$VERSION" diff --git a/.github/workflows/auto_approve_pr.yml b/.github/workflows/auto_approve_pr.yml index e584337f78b..e76142c659f 100644 --- a/.github/workflows/auto_approve_pr.yml +++ b/.github/workflows/auto_approve_pr.yml @@ -16,7 +16,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' + - name: Auto Approve Pull Request env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 26543c8a948..4008bacb163 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 1c1bf2cae4f..4df27f4d826 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 7c98855b783..6f4c7d96b79 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (12) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index 947d393bbbb..e2745bad8cc 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (13) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index aedc1bbd691..ab4d41a76d5 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (15) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 9886b617d51..2265fa8657e 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (18) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index e6bccee0004..e7dd5a338a0 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (21) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 1f744e85004..aeaa94caaae 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml index 6ed73f260df..149d3fadcd5 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr_mysqlshell) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 9bb6a4b56f8..489bdd4b775 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (backup_pitr_xtrabackup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index e859749ceca..3e19e2e55c2 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (ers_prs_newfeatures_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 653db141b7d..9cd6db39ea9 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (mysql80) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 9de4aacd499..4fdbb6ff7ac 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (mysql_server_vault) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index 54c85944190..b894632a9b6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_revert) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 9e117ac0f04..7e1acddebf4 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_scheduler) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index ce0ba65f74f..d9b56db98ea 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index 57413f649e1..e627e3f5c19 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_stress) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index e1f949df6f8..72fb9c89221 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_stress_suite) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 18090dd2430..38d0854ac96 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (onlineddl_vrepl_suite) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 2053a75db4c..22849c09a31 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (schemadiff_vrepl) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -92,6 +95,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 3e8ffce0ac5..185a0867464 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_consul) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index cc75ef22937..0cc1384eb86 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_tablegc) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 0837be5356e..3b0f87eb3a4 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (tabletmanager_throttler_topo) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index da6ee53ad53..c0963a14e32 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (topo_connection_cache) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 6f502c94d32..62b138b6d19 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_across_db_versions) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index 120cf541305..e1df4df0a42 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_basic) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 760912b4818..f1a6b4b3688 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_cellalias) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml index d944a253ce3..b0cac4d620e 100644 --- a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml +++ b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_copy_parallel) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml index 5bba7760d7e..e241ab2e5d5 100644 --- a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml +++ b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_foreign_key_stress) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml index 1184fe493ef..96746b5b383 100644 --- a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml +++ b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_mariadb_to_mysql) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate.yml b/.github/workflows/cluster_endtoend_vreplication_migrate.yml index 009840800d2..f216f11fe0a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_migrate) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml index 9a5935a8907..f97c5b48ed9 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_multi_tenant) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml index 0a10e37e6c4..3e9529e7eaa 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_partial_movetables_and_materialize) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index f023bf9718b..5fd79c1fc6a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_v2) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml index 7d96ac60306..4b066740b5e 100644 --- a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vreplication_vtctldclient_vdiff2_movetables_tz) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vstream.yml b/.github/workflows/cluster_endtoend_vstream.yml index acfefb40758..422e673afcd 100644 --- a/.github/workflows/cluster_endtoend_vstream.yml +++ b/.github/workflows/cluster_endtoend_vstream.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vstream) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 947598bc307..ddd0a974e53 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtbackup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index c6f8712a35a..0cfd65c760a 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtctlbackup_sharded_clustertest_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 2cd81fe04ef..d5de2703ec2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_concurrentdml) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml index 19620d9e3a2..a6de1fa0b0e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml +++ b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_foreignkey_stress) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 06961af4ee7..28d499ebbeb 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_gen4) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index e0b21df421a..7151a1c0018 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_general_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 23c9da550c2..440db3314e6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_godriver) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index f5d1850aca3..744d0f3a546 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_partial_keyspace) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_plantests.yml b/.github/workflows/cluster_endtoend_vtgate_plantests.yml index 93ed6a55f05..2e84c69dcb8 100644 --- a/.github/workflows/cluster_endtoend_vtgate_plantests.yml +++ b/.github/workflows/cluster_endtoend_vtgate_plantests.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_plantests) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 80462086a57..55908bba078 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_queries) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 686db1e12ab..97ce060cbb1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_readafterwrite) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index 0f4ae20b0a7..29899131b9c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_reservedconn) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 2dca36298e1..096214047fc 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_schema) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 711f38253cb..8d3b9553488 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_schema_tracker) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 55996d7fa86..17b1d7ac53a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_tablet_healthcheck_cache) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index f47e0a8dd63..acb8b8a4ed7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 1b62ac79041..e1a3904b3ba 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo_consul) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index f88d3b9af3a..0ec518466a7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_topo_etcd) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index 9ae7b465695..eb0880b30ea 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_transaction) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index d348606dc31..011b9c74db2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_unsharded) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 16bdee60217..e266b38d934 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_vindex_heavy) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index fb176119769..0bc6e9dd4c4 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtgate_vschema) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 92c2ea3d5d7..2db26bddf6f 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vtorc) runs-on: ubuntu-24.04 @@ -54,7 +55,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -100,6 +103,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 9868c382a69..b26e602dda1 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (vttablet_prscomplex) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Get key to latest MySQL repo diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 26dbfea2def..99c30cfc83b 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (xb_backup) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 43360690d6b..fb5944c13f0 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -15,6 +15,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on Cluster (xb_recovery) runs-on: ubuntu-24.04 @@ -45,7 +46,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -91,6 +94,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | # Setup Percona Server for MySQL 8.0 diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index c971466b998..35517c4f6c5 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -13,7 +13,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in files relevant to code coverage uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index c523e34c697..864a29898fe 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -27,7 +27,9 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Set up Go uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 @@ -47,6 +49,7 @@ jobs: # queries: security-extended,security-and-quality - name: Get base dependencies + timeout-minutes: 10 run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update # Uninstall any previously installed MySQL first diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 424cc5bfe15..1d88b034164 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -7,22 +7,25 @@ on: release: types: [created] -permissions: read-all +permissions: + contents: write + actions: read jobs: build: name: Create Release runs-on: ubuntu-24.04 - permissions: - contents: write steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Set up Go uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: go-version-file: go.mod + cache: 'false' - name: Tune the OS run: | @@ -33,14 +36,36 @@ jobs: sudo apt-get update sudo apt-get install -y make ruby ruby-dev go mod download - sudo gem install fpm + + # We use fpm to package our artifacts, we want to pin the version we use and + # ensure the checksum of the package matches the one published on the package's webpage. + # https://rubygems.org/gems/fpm/versions + - name: Get fpm + run: | + FPM_VERSION=1.16.0 + gem fetch fpm -v $FPM_VERSION + + # Reviewers: The expected checksum MUST ALWAYS match the one published on this website: + # https://rubygems.org/gems/fpm/versions + EXPECTED_CHECKSUM="d9eafe613cfbdf9d3b8ef2e321e194cd0a2d300ce37f716c0be1b3a42b7db5df" + + GOT_CHECKSUM=$(sha256sum fpm-$FPM_VERSION.gem | awk '{print $1}') + + if [[ "$GOT_CHECKSUM" != "$EXPECTED_CHECKSUM" ]]; then + echo "Checksum validation failed" + echo "Expected: $EXPECTED_CHECKSUM" + echo "Got: $GOT_CHECKSUM" + exit 1 + fi + + sudo gem install fpm-$FPM_VERSION.gem - name: Make Packages run: | ./tools/make-release-packages.sh - name: Upload Files - uses: csexton/release-asset-action@master + uses: csexton/release-asset-action@3567794e918fa3068116688122a76cdeb57b5f09 # v3.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} pattern: "releases/*.{tar.gz,rpm,deb}" diff --git a/.github/workflows/docker_build_images.yml b/.github/workflows/docker_build_images.yml index 2024d677205..fea9f83b5d3 100644 --- a/.github/workflows/docker_build_images.yml +++ b/.github/workflows/docker_build_images.yml @@ -26,7 +26,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -40,7 +42,7 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -61,7 +63,7 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -80,7 +82,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -98,7 +102,7 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -123,7 +127,7 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -145,7 +149,9 @@ jobs: steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -159,7 +165,7 @@ jobs: - name: Build and push on main latest tag if: startsWith(github.ref, 'refs/tags/') == false && matrix.debian == 'bookworm' - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -170,7 +176,7 @@ jobs: - name: Build and push on main debian specific tag if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -202,7 +208,7 @@ jobs: # Build and Push component image to DOCKER_TAG, applies to both debian version - name: Build and push on tags using Debian extension if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -215,7 +221,7 @@ jobs: # It is fine to build a second time here when "matrix.debian == 'bookworm'" as we have cached the first build already - name: Build and push on tags without Debian extension if: startsWith(github.ref, 'refs/tags/') && matrix.debian == 'bookworm' - uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 with: context: ${{ env.DOCKER_CTX }} push: true diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 10a7c1551c0..090edd8ae33 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index 34463ce3830..a0159f941b0 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -27,7 +27,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 50e1e4b9485..abd7355f078 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -26,7 +26,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index f061e8bee68..71b84f7acdc 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -26,7 +26,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index fc9724aa6ac..dd173dda090 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -30,7 +30,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index c17f43eec11..421ec1bf94e 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -30,7 +30,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index cd2cce93827..2773d602ec9 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -31,7 +31,9 @@ jobs: - name: Checkout code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Run FOSSA scan and upload build data uses: fossa-contrib/fossa-action@v3 diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 8ffb74bd2cb..7c4ce8789ed 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_race_evalengine.yml b/.github/workflows/unit_race_evalengine.yml index d6d248f066e..70523aa2b8a 100644 --- a/.github/workflows/unit_race_evalengine.yml +++ b/.github/workflows/unit_race_evalengine.yml @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_evalengine_mysql57.yml b/.github/workflows/unit_test_evalengine_mysql57.yml index d55b2732c86..de98a6779d2 100644 --- a/.github/workflows/unit_test_evalengine_mysql57.yml +++ b/.github/workflows/unit_test_evalengine_mysql57.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_evalengine_mysql80.yml b/.github/workflows/unit_test_evalengine_mysql80.yml index 96af579742e..cb1db682085 100644 --- a/.github/workflows/unit_test_evalengine_mysql80.yml +++ b/.github/workflows/unit_test_evalengine_mysql80.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_evalengine_mysql84.yml b/.github/workflows/unit_test_evalengine_mysql84.yml index efbe2b0eb9f..506d68047cb 100644 --- a/.github/workflows/unit_test_evalengine_mysql84.yml +++ b/.github/workflows/unit_test_evalengine_mysql84.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index eed08e9ce4c..89aa6617db8 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 9e0ed7e6977..203763a610a 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/unit_test_mysql84.yml b/.github/workflows/unit_test_mysql84.yml index 5948eb0836a..31d7cec9946 100644 --- a/.github/workflows/unit_test_mysql84.yml +++ b/.github/workflows/unit_test_mysql84.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/update_golang_dependencies.yml b/.github/workflows/update_golang_dependencies.yml index 33c5157097c..e2a3e7bd847 100644 --- a/.github/workflows/update_golang_dependencies.yml +++ b/.github/workflows/update_golang_dependencies.yml @@ -22,9 +22,10 @@ jobs: go-version-file: go.mod - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: main + persist-credentials: 'false' - name: Upgrade the Golang Dependencies id: detect-and-update diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index ad5dceeafa5..1948caf4b82 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Check out code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ matrix.branch }} diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 0c558b00684..2ef21dbc786 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -35,9 +35,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -84,6 +85,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -107,9 +109,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -129,7 +132,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 7ee6c2db799..aa501a0c93d 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -25,9 +25,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -86,6 +87,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -109,9 +111,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -131,7 +134,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 680b0da87e0..6ab8e4bd56d 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -38,9 +38,10 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -88,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -129,9 +131,10 @@ jobs: # Checkout to the last release of Vitess - name: Checkout to the other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -151,7 +154,9 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index 768268271a1..37c7b58ca68 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -27,9 +27,10 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -89,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -130,9 +132,10 @@ jobs: # Checkout to the next release of Vitess - name: Checkout to the other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -152,7 +155,9 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index dd389663a35..12fd8735051 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Online DDL flow runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -95,6 +97,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -127,9 +130,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out last version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -150,9 +154,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out next version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -173,7 +178,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index e4ccc793933..2f56f49280e 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -87,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -135,9 +138,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml index 87a78d0b659..1c5659b4096 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -87,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -135,9 +138,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml index d3cfc662b5b..bfd2d9021ae 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries - 2) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +123,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index c65fff08c52..c8a0fe77e23 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Queries) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +123,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 5616c247888..41710de3811 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Schema) runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -87,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +122,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +145,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index 6157079db6f..f4dc2c8fcf2 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Query Serving (Schema) Next Release runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +123,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 931d9174c31..bc2bfb2bc53 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent New Vtctl runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -120,9 +123,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -142,7 +146,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index d77b7be53b3..1c196efea47 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent New VTTablet runs-on: gh-hosted-runners-16cores-1-24.04 @@ -27,9 +28,10 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-next-release-ref @@ -88,6 +90,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -127,9 +130,10 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the next release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -149,7 +153,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 532be0b998e..32a8abd0a2b 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent Old Vtctl runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -87,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +122,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +145,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 2804e757652..425f1af24c2 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -15,6 +15,7 @@ permissions: read-all jobs: upgrade_downgrade_test: + timeout-minutes: 60 name: Run Upgrade Downgrade Test - Reparent Old VTTablet runs-on: gh-hosted-runners-16cores-1-24.04 @@ -38,9 +39,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch id: output-previous-release-ref @@ -87,6 +89,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo DEBIAN_FRONTEND="noninteractive" apt-get update @@ -119,9 +122,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -141,7 +145,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index 76706f77b65..f694624d951 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -35,9 +35,10 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + persist-credentials: 'false' - name: Set output with latest release branch if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -84,6 +85,7 @@ jobs: sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - name: Get base dependencies + timeout-minutes: 10 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | sudo apt-get update @@ -107,9 +109,10 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} + persist-credentials: 'false' - name: Get dependencies for the last release if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -129,7 +132,9 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/vitess_tester_vtgate.yml b/.github/workflows/vitess_tester_vtgate.yml index 7d5cf89a3ec..f788eb9eae2 100644 --- a/.github/workflows/vitess_tester_vtgate.yml +++ b/.github/workflows/vitess_tester_vtgate.yml @@ -45,7 +45,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index 822fa8a0920..582f8b57647 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index 694c24734a6..570867f821a 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index 72a887c1926..0138f06b2b7 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -35,8 +35,10 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' + with: + persist-credentials: 'false' - uses: actions/setup-node@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtop_example.yml b/.github/workflows/vtop_example.yml index fb5ae87c101..0d27d43b959 100644 --- a/.github/workflows/vtop_example.yml +++ b/.github/workflows/vtop_example.yml @@ -36,7 +36,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index f51b06a2faf..815d895c6a3 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -13,6 +13,7 @@ env: jobs: build: + timeout-minutes: 60 name: Run endtoend tests on {{.Name}} runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1-24.04{{else}}ubuntu-24.04{{end}} @@ -56,7 +57,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' @@ -105,6 +108,7 @@ jobs: - name: Get dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 run: | {{if .InstallXtraBackup}} diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index f7e8aa2c1d8..3eb11173e8a 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -28,7 +28,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index f4152c939b0..fc7fe4bcc03 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -61,7 +61,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/test/templates/cluster_vitess_tester.tpl b/test/templates/cluster_vitess_tester.tpl index b8d77754ba6..ca5a822cf5d 100644 --- a/test/templates/cluster_vitess_tester.tpl +++ b/test/templates/cluster_vitess_tester.tpl @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index f802ee7ad4a..be78da88c34 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -43,7 +43,9 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: 'false' - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' From 72eb041781344ba81538d13e55d6b1d2ca5a773c Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:06:06 +0100 Subject: [PATCH 34/66] CVE Fix: Update glog to v1.2.4 (#17524) Signed-off-by: Rohit Nayak --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 603bc37c62e..d2cd40bc773 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/evanphx/json-patch v5.9.0+incompatible github.com/fsnotify/fsnotify v1.8.0 github.com/go-sql-driver/mysql v1.7.1 - github.com/golang/glog v1.2.3 + github.com/golang/glog v1.2.4 github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 github.com/google/go-cmp v0.6.0 diff --git a/go.sum b/go.sum index faf1e24be13..4d25efb17fa 100644 --- a/go.sum +++ b/go.sum @@ -222,8 +222,8 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= -github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= From 301c92c0c3aa6fa912eed16402965074b70aaa18 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Jan 2025 08:11:19 -0600 Subject: [PATCH 35/66] Fix how we generate the query serving error documentation (#17516) Signed-off-by: Florent Poinsard --- go/vt/vterrors/code.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 0ca275b71fc..df19fcbd408 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -243,8 +243,15 @@ func errorWithoutState(id string, code vtrpcpb.Code, short, long string) func(ar func errorWithState(id string, code vtrpcpb.Code, state State, short, long string) func(args ...any) *VitessError { return func(args ...any) *VitessError { + var err error + if len(args) != 0 { + err = NewErrorf(code, state, id+": "+short, args...) + } else { + err = NewError(code, state, id+": "+short) + } + return &VitessError{ - Err: NewErrorf(code, state, id+": "+short, args...), + Err: err, Description: long, ID: id, State: state, From 8e905aaf740ba7037e0dacbc3d4b1c09a23353d1 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:28:49 -0600 Subject: [PATCH 36/66] Use proper `groupId` for mysql connector in java (#17540) Signed-off-by: Florent Poinsard --- .../{docker_test_cluster_10.yml => java_docker_test.yml} | 5 +++-- java/example/pom.xml | 2 +- java/pom.xml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) rename .github/workflows/{docker_test_cluster_10.yml => java_docker_test.yml} (96%) diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/java_docker_test.yml similarity index 96% rename from .github/workflows/docker_test_cluster_10.yml rename to .github/workflows/java_docker_test.yml index 090edd8ae33..c49beba7b61 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/java_docker_test.yml @@ -1,10 +1,10 @@ -name: docker_test_cluster_10 +name: java_docker_test on: [push, pull_request] permissions: read-all jobs: build: - name: Docker Test Cluster 10 + name: Java Docker Test runs-on: ubuntu-24.04 steps: @@ -50,6 +50,7 @@ jobs: - 'config/**' - 'bootstrap.sh' - 'docker/**' + - 'java/**' - '.github/workflows/docker_test_cluster_10.yml' - name: Set up Go diff --git a/java/example/pom.xml b/java/example/pom.xml index 114dc9af5ff..19b5838510b 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -30,7 +30,7 @@ - mysql + com.mysql mysql-connector-j 8.4.0 false diff --git a/java/pom.xml b/java/pom.xml index 7a80212f0a9..bc173282faf 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -252,7 +252,7 @@ true true - mysql:mysql-connector-j + com.mysql:mysql-connector-j io.grpc:grpc-context From 859632ff9fdf971f7a46b83faa7dc215d4fd05d5 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:43:06 -0600 Subject: [PATCH 37/66] Rename docker clusters for more clarity and group all java test together (#17542) Signed-off-by: Florent Poinsard --- .github/workflows/cluster_endtoend_12.yml | 1 + .github/workflows/cluster_endtoend_13.yml | 1 + .github/workflows/cluster_endtoend_15.yml | 1 + .github/workflows/cluster_endtoend_18.yml | 1 + .github/workflows/cluster_endtoend_21.yml | 1 + .github/workflows/cluster_endtoend_backup_pitr.yml | 1 + .../cluster_endtoend_backup_pitr_mysqlshell.yml | 1 + .../cluster_endtoend_backup_pitr_xtrabackup.yml | 1 + .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 1 + .github/workflows/cluster_endtoend_mysql80.yml | 1 + .../workflows/cluster_endtoend_mysql_server_vault.yml | 1 + .../workflows/cluster_endtoend_onlineddl_revert.yml | 1 + .../workflows/cluster_endtoend_onlineddl_scheduler.yml | 1 + .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 1 + .../cluster_endtoend_onlineddl_vrepl_stress.yml | 1 + .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 1 + .../cluster_endtoend_onlineddl_vrepl_suite.yml | 1 + .../workflows/cluster_endtoend_schemadiff_vrepl.yml | 1 + .../cluster_endtoend_tabletmanager_consul.yml | 1 + .../cluster_endtoend_tabletmanager_tablegc.yml | 1 + .../cluster_endtoend_tabletmanager_throttler_topo.yml | 1 + .../cluster_endtoend_topo_connection_cache.yml | 1 + ...luster_endtoend_vreplication_across_db_versions.yml | 1 + .../workflows/cluster_endtoend_vreplication_basic.yml | 1 + .../cluster_endtoend_vreplication_cellalias.yml | 1 + .../cluster_endtoend_vreplication_copy_parallel.yml | 1 + ...luster_endtoend_vreplication_foreign_key_stress.yml | 1 + .../cluster_endtoend_vreplication_mariadb_to_mysql.yml | 1 + .../cluster_endtoend_vreplication_migrate.yml | 1 + .../cluster_endtoend_vreplication_multi_tenant.yml | 1 + ...vreplication_partial_movetables_and_materialize.yml | 1 + .github/workflows/cluster_endtoend_vreplication_v2.yml | 1 + ..._vreplication_vtctldclient_vdiff2_movetables_tz.yml | 1 + .github/workflows/cluster_endtoend_vstream.yml | 1 + .github/workflows/cluster_endtoend_vtbackup.yml | 1 + ..._endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 1 + .../cluster_endtoend_vtgate_concurrentdml.yml | 1 + .../cluster_endtoend_vtgate_foreignkey_stress.yml | 1 + .github/workflows/cluster_endtoend_vtgate_gen4.yml | 1 + .../cluster_endtoend_vtgate_general_heavy.yml | 1 + .github/workflows/cluster_endtoend_vtgate_godriver.yml | 1 + .../cluster_endtoend_vtgate_partial_keyspace.yml | 1 + .../workflows/cluster_endtoend_vtgate_plantests.yml | 1 + .github/workflows/cluster_endtoend_vtgate_queries.yml | 1 + .../cluster_endtoend_vtgate_readafterwrite.yml | 1 + .../workflows/cluster_endtoend_vtgate_reservedconn.yml | 1 + .github/workflows/cluster_endtoend_vtgate_schema.yml | 1 + .../cluster_endtoend_vtgate_schema_tracker.yml | 1 + ...luster_endtoend_vtgate_tablet_healthcheck_cache.yml | 1 + .github/workflows/cluster_endtoend_vtgate_topo.yml | 1 + .../workflows/cluster_endtoend_vtgate_topo_consul.yml | 1 + .../workflows/cluster_endtoend_vtgate_topo_etcd.yml | 1 + .../workflows/cluster_endtoend_vtgate_transaction.yml | 1 + .../workflows/cluster_endtoend_vtgate_unsharded.yml | 1 + .../workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 1 + .github/workflows/cluster_endtoend_vtgate_vschema.yml | 1 + .github/workflows/cluster_endtoend_vtorc.yml | 1 + .../workflows/cluster_endtoend_vttablet_prscomplex.yml | 1 + .github/workflows/cluster_endtoend_xb_backup.yml | 1 + .github/workflows/cluster_endtoend_xb_recovery.yml | 1 + ...ker_test_cluster_25.yml => docker_test_cluster.yml} | 9 +++++---- .github/workflows/java_docker_test.yml | 5 +++-- .github/workflows/local_example.yml | 1 + .github/workflows/region_example.yml | 1 + .github/workflows/unit_race.yml | 1 + .github/workflows/unit_race_evalengine.yml | 1 + .github/workflows/unit_test_evalengine_mysql57.yml | 1 + .github/workflows/unit_test_evalengine_mysql80.yml | 1 + .github/workflows/unit_test_evalengine_mysql84.yml | 1 + .github/workflows/unit_test_mysql57.yml | 1 + .github/workflows/unit_test_mysql80.yml | 1 + .github/workflows/unit_test_mysql84.yml | 1 + .../workflows/upgrade_downgrade_test_backups_e2e.yml | 1 + ...upgrade_downgrade_test_backups_e2e_next_release.yml | 1 + .../upgrade_downgrade_test_backups_manual.yml | 1 + ...rade_downgrade_test_backups_manual_next_release.yml | 1 + .../upgrade_downgrade_test_onlineddl_flow.yml | 1 + .../upgrade_downgrade_test_query_serving_queries.yml | 1 + .../upgrade_downgrade_test_query_serving_queries_2.yml | 1 + ...grade_test_query_serving_queries_2_next_release.yml | 1 + ...wngrade_test_query_serving_queries_next_release.yml | 1 + .../upgrade_downgrade_test_query_serving_schema.yml | 1 + ...owngrade_test_query_serving_schema_next_release.yml | 1 + .../upgrade_downgrade_test_reparent_new_vtctl.yml | 1 + .../upgrade_downgrade_test_reparent_new_vttablet.yml | 1 + .../upgrade_downgrade_test_reparent_old_vtctl.yml | 1 + .../upgrade_downgrade_test_reparent_old_vttablet.yml | 1 + .github/workflows/upgrade_downgrade_test_semi_sync.yml | 1 + .github/workflows/vitess_tester_vtgate.yml | 1 + test/config.json | 10 +++++----- test/templates/cluster_endtoend_test.tpl | 1 + test/templates/cluster_endtoend_test_docker.tpl | 1 + test/templates/cluster_endtoend_test_mysql57.tpl | 1 + test/templates/cluster_vitess_tester.tpl | 1 + test/templates/unit_test.tpl | 1 + 95 files changed, 105 insertions(+), 11 deletions(-) rename .github/workflows/{docker_test_cluster_25.yml => docker_test_cluster.yml} (91%) diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 6f4c7d96b79..e444858ff0d 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index e2745bad8cc..8afefa03c99 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index ab4d41a76d5..dcccc6cc187 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 2265fa8657e..347eb73f919 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index e7dd5a338a0..f2b045e155d 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index aeaa94caaae..ae7485b874e 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml index 149d3fadcd5..1794eb893b9 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 489bdd4b775..6d8f8808565 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index 3e19e2e55c2..ef256dd83af 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 9cd6db39ea9..584620fbf0f 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 4fdbb6ff7ac..6b5ecc45495 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index b894632a9b6..cb0eb7919ac 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 7e1acddebf4..da7b96b6578 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index d9b56db98ea..1d857dc2df5 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index e627e3f5c19..bb8ff9a4b1c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 72fb9c89221..ea7782d6d2f 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 38d0854ac96..2671a018541 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 22849c09a31..bdd8dac28a3 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 185a0867464..5f445a40b46 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 0cc1384eb86..af87aec2cca 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 3b0f87eb3a4..03385c6d45d 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index c0963a14e32..1e27231dc74 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 62b138b6d19..f6ab80b04da 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index e1df4df0a42..9b21f46e054 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index f1a6b4b3688..95cf9a15214 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml index b0cac4d620e..6cca449201d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml +++ b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml index e241ab2e5d5..2890abaef4c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml +++ b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml index 96746b5b383..4cf82c81f4b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml +++ b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate.yml b/.github/workflows/cluster_endtoend_vreplication_migrate.yml index f216f11fe0a..d0667c30ba4 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml index f97c5b48ed9..326591fe820 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml index 3e9529e7eaa..0124cd03832 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 5fd79c1fc6a..a8285f109a3 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml index 4b066740b5e..0b599116e4c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_vtctldclient_vdiff2_movetables_tz.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vstream.yml b/.github/workflows/cluster_endtoend_vstream.yml index 422e673afcd..c6a6bbb515f 100644 --- a/.github/workflows/cluster_endtoend_vstream.yml +++ b/.github/workflows/cluster_endtoend_vstream.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index ddd0a974e53..38ff7e41cbc 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 0cfd65c760a..6ce9887700c 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index d5de2703ec2..840e4c496b9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml index a6de1fa0b0e..39f03784840 100644 --- a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml +++ b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 28d499ebbeb..f62a830ea73 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 7151a1c0018..59db477d840 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 440db3314e6..b0a32a13b6f 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index 744d0f3a546..bca24b0a3bc 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_plantests.yml b/.github/workflows/cluster_endtoend_vtgate_plantests.yml index 2e84c69dcb8..9c2c905564d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_plantests.yml +++ b/.github/workflows/cluster_endtoend_vtgate_plantests.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 55908bba078..abd4ca2d713 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 97ce060cbb1..a6f24c0f983 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index 29899131b9c..72e7405e537 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 096214047fc..c954ac7d455 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 8d3b9553488..fa57ba09a30 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 17b1d7ac53a..520a5a72ca7 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index acb8b8a4ed7..c8151df7b79 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index e1a3904b3ba..ebde8c3d0d9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 0ec518466a7..a3e11cb8eb9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index eb0880b30ea..1014508be2a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index 011b9c74db2..fa922f575e6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index e266b38d934..36c75f52d05 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index 0bc6e9dd4c4..d0dd3c7c917 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 2db26bddf6f..dbaa4b04143 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -67,6 +67,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index b26e602dda1..ea1b662e1be 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 99c30cfc83b..8ae98fc9ffd 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index fb5944c13f0..d617e99dcb9 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster.yml similarity index 91% rename from .github/workflows/docker_test_cluster_25.yml rename to .github/workflows/docker_test_cluster.yml index a0159f941b0..6c6310a9efc 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster.yml @@ -1,10 +1,10 @@ -name: docker_test_cluster_25 +name: docker_test_cluster on: [push, pull_request] permissions: read-all jobs: build: - name: Docker Test Cluster 25 + name: Docker Test Cluster runs-on: ubuntu-24.04 steps: @@ -39,6 +39,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' @@ -50,7 +51,7 @@ jobs: - 'config/**' - 'bootstrap.sh' - 'docker/**' - - '.github/workflows/docker_test_cluster_25.yml' + - '.github/workflows/docker_test_cluster.yml' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -66,4 +67,4 @@ jobs: - name: Run tests which require docker - 2 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - go run test.go -docker=true --follow -shard 25 + go run test.go -docker=true --follow -shard docker_cluster diff --git a/.github/workflows/java_docker_test.yml b/.github/workflows/java_docker_test.yml index c49beba7b61..adb87922dfc 100644 --- a/.github/workflows/java_docker_test.yml +++ b/.github/workflows/java_docker_test.yml @@ -39,6 +39,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' @@ -51,7 +52,7 @@ jobs: - 'bootstrap.sh' - 'docker/**' - 'java/**' - - '.github/workflows/docker_test_cluster_10.yml' + - '.github/workflows/java_docker_test.yml' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -68,4 +69,4 @@ jobs: - name: Run tests which require docker - 1 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | - go run test.go -docker=true --follow -shard 10 + go run test.go -docker=true --follow -shard java diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index dd173dda090..ef3569bfb86 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -42,6 +42,7 @@ jobs: token: '' filters: | examples: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 421ec1bf94e..ed190884446 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -42,6 +42,7 @@ jobs: token: '' filters: | examples: + - 'test/config.json' - 'go/**/*.go' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 7c4ce8789ed..77f47a6c083 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -55,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_race_evalengine.yml b/.github/workflows/unit_race_evalengine.yml index 70523aa2b8a..9654209f2a9 100644 --- a/.github/workflows/unit_race_evalengine.yml +++ b/.github/workflows/unit_race_evalengine.yml @@ -55,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql57.yml b/.github/workflows/unit_test_evalengine_mysql57.yml index de98a6779d2..eea3a5aad57 100644 --- a/.github/workflows/unit_test_evalengine_mysql57.yml +++ b/.github/workflows/unit_test_evalengine_mysql57.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql80.yml b/.github/workflows/unit_test_evalengine_mysql80.yml index cb1db682085..f48e224808d 100644 --- a/.github/workflows/unit_test_evalengine_mysql80.yml +++ b/.github/workflows/unit_test_evalengine_mysql80.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_evalengine_mysql84.yml b/.github/workflows/unit_test_evalengine_mysql84.yml index 506d68047cb..6b373d96812 100644 --- a/.github/workflows/unit_test_evalengine_mysql84.yml +++ b/.github/workflows/unit_test_evalengine_mysql84.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 89aa6617db8..3644170ebdc 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 203763a610a..18bfa546124 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/unit_test_mysql84.yml b/.github/workflows/unit_test_mysql84.yml index 31d7cec9946..10b3c2b8a6c 100644 --- a/.github/workflows/unit_test_mysql84.yml +++ b/.github/workflows/unit_test_mysql84.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 2ef21dbc786..7e50c186a41 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -56,6 +56,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index aa501a0c93d..6586cca7a13 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -58,6 +58,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 6ab8e4bd56d..206a09e97bb 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -59,6 +59,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index 37c7b58ca68..96715bbe9de 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index 12fd8735051..028150e54fd 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -52,6 +52,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 2f56f49280e..aeb96066908 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml index 1c5659b4096..df09ceb720a 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml index bfd2d9021ae..32a00022737 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2_next_release.yml @@ -61,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index c8a0fe77e23..faea680e0a8 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -61,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 41710de3811..87a155df5e9 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index f4dc2c8fcf2..2450547966e 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -61,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index bc2bfb2bc53..d25a772e423 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -61,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index 1c196efea47..62cb6bf2018 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -61,6 +61,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index 32a8abd0a2b..fc010850117 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 425f1af24c2..33afe4fdf90 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -60,6 +60,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index f694624d951..a40a55f0d0c 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -56,6 +56,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**' - 'go/**/*.go' - 'test.go' diff --git a/.github/workflows/vitess_tester_vtgate.yml b/.github/workflows/vitess_tester_vtgate.yml index f788eb9eae2..f9429909374 100644 --- a/.github/workflows/vitess_tester_vtgate.yml +++ b/.github/workflows/vitess_tester_vtgate.yml @@ -57,6 +57,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/vtgate/vitess_tester/**' diff --git a/test/config.json b/test/config.json index dfc0910f10e..17cdb019e97 100644 --- a/test/config.json +++ b/test/config.json @@ -8,7 +8,7 @@ "java_test" ], "Manual": false, - "Shard": "10", + "Shard": "java", "RetryMax": 1, "Tags": [] }, @@ -19,7 +19,7 @@ "test/client_test.sh" ], "Manual": false, - "Shard": "25", + "Shard": "java", "RetryMax": 1, "Tags": [] }, @@ -483,7 +483,7 @@ ], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [ "site_test" @@ -989,7 +989,7 @@ "Args": ["vitess.io/vitess/go/test/endtoend/topotest/zk2", "--topo-flavor=zk2"], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [] }, @@ -1061,7 +1061,7 @@ "Args": ["vitess.io/vitess/go/test/endtoend/vtcombo"], "Command": [], "Manual": false, - "Shard": "25", + "Shard": "docker_cluster", "RetryMax": 1, "Tags": [] }, diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 815d895c6a3..c5129805126 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -69,6 +69,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index 3eb11173e8a..39a36b88c89 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -40,6 +40,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index fc7fe4bcc03..a6cbc969c1a 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -73,6 +73,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/onlineddl/vrepl_suite/**' diff --git a/test/templates/cluster_vitess_tester.tpl b/test/templates/cluster_vitess_tester.tpl index ca5a822cf5d..508824dde87 100644 --- a/test/templates/cluster_vitess_tester.tpl +++ b/test/templates/cluster_vitess_tester.tpl @@ -55,6 +55,7 @@ jobs: token: '' filters: | end_to_end: + - 'test/config.json' - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - 'go/test/endtoend/vtgate/vitess_tester/**' diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index be78da88c34..10c3b8c0c6a 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -55,6 +55,7 @@ jobs: token: '' filters: | unit_tests: + - 'test/config.json' - 'go/**' - 'test.go' - 'Makefile' From 5468f5db7db117f955aaf9c56182f05fc496c14b Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Thu, 16 Jan 2025 07:15:34 +0100 Subject: [PATCH 38/66] Always return a valid timezone in cursor (#17546) --- go/vt/vtgate/engine/fake_vcursor_test.go | 2 +- go/vt/vtgate/evalengine/fn_time.go | 4 ++-- go/vt/vtgate/executorcontext/safe_session.go | 11 ++++++----- go/vt/vtgate/executorcontext/safe_session_test.go | 14 ++++++++++---- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index aac3e9b584c..060d2ebcfcb 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -164,7 +164,7 @@ func (t *noopVCursor) Environment() *vtenv.Environment { } func (t *noopVCursor) TimeZone() *time.Location { - return nil + return time.Local } func (t *noopVCursor) SQLMode() string { diff --git a/go/vt/vtgate/evalengine/fn_time.go b/go/vt/vtgate/evalengine/fn_time.go index 2d5e12f518d..322b89faafb 100644 --- a/go/vt/vtgate/evalengine/fn_time.go +++ b/go/vt/vtgate/evalengine/fn_time.go @@ -256,7 +256,7 @@ func (call *builtinNow) constant() bool { func (call *builtinSysdate) eval(env *ExpressionEnv) (eval, error) { now := SystemTime() - if tz := env.currentTimezone(); tz != nil { + if tz := env.currentTimezone(); tz != time.Local { now = now.In(tz) } return newEvalDateTime(datetime.NewDateTimeFromStd(now), int(call.prec), false), nil @@ -701,7 +701,7 @@ func (b *builtinFromUnixtime) eval(env *ExpressionEnv) (eval, error) { } t := time.Unix(sec, frac) - if tz := env.currentTimezone(); tz != nil { + if tz := env.currentTimezone(); tz != time.Local { t = t.In(tz) } diff --git a/go/vt/vtgate/executorcontext/safe_session.go b/go/vt/vtgate/executorcontext/safe_session.go index c77bba76ff8..e9a25438bc4 100644 --- a/go/vt/vtgate/executorcontext/safe_session.go +++ b/go/vt/vtgate/executorcontext/safe_session.go @@ -656,17 +656,18 @@ func (session *SafeSession) TimeZone() *time.Location { session.mu.Unlock() if !ok { - return nil + return time.Local } tz, err := sqltypes.DecodeStringSQL(zoneSQL) if err != nil { - return nil + return time.Local } - loc, _ := datetime.ParseTimeZone(tz) - // it's safe to ignore the error - if we get an error, loc will be nil, - // and this is exactly the behaviour we want anyway + loc, err := datetime.ParseTimeZone(tz) + if err != nil { + return time.Local + } return loc } diff --git a/go/vt/vtgate/executorcontext/safe_session_test.go b/go/vt/vtgate/executorcontext/safe_session_test.go index 14ea2ad9dac..66130209d33 100644 --- a/go/vt/vtgate/executorcontext/safe_session_test.go +++ b/go/vt/vtgate/executorcontext/safe_session_test.go @@ -173,6 +173,10 @@ func TestTimeZone(t *testing.T) { tz string want string }{ + { + tz: "", + want: time.Local.String(), + }, { tz: "'Europe/Amsterdam'", want: "Europe/Amsterdam", @@ -183,16 +187,18 @@ func TestTimeZone(t *testing.T) { }, { tz: "foo", - want: (*time.Location)(nil).String(), + want: time.Local.String(), }, } for _, tc := range testCases { t.Run(tc.tz, func(t *testing.T) { + sysvars := map[string]string{} + if tc.tz != "" { + sysvars["time_zone"] = tc.tz + } session := NewSafeSession(&vtgatepb.Session{ - SystemVariables: map[string]string{ - "time_zone": tc.tz, - }, + SystemVariables: sysvars, }) assert.Equal(t, tc.want, session.TimeZone().String()) From b103492f4bff9bce916d36edb1a68eea9909428e Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Thu, 16 Jan 2025 11:25:15 +0100 Subject: [PATCH 39/66] fix: add missing MySQL 8.4 keywords (#17538) Signed-off-by: Leopold Jacquot Signed-off-by: Dirkjan Bussink Co-authored-by: Leopold Jacquot --- go/vt/sqlparser/keywords.go | 4 + go/vt/sqlparser/sql.go | 16454 ++++++++-------- go/vt/sqlparser/sql.y | 5 + go/vt/sqlparser/testdata/mysql_keywords.txt | 54 +- .../jdbc/VitessMySQLDatabaseMetadata.java | 25 +- 5 files changed, 8346 insertions(+), 8196 deletions(-) diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index 5c1b881df30..2f1a220066d 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -430,6 +430,7 @@ var keywords = []keyword{ {"min", MIN}, {"manifest", MANIFEST}, {"master_bind", UNUSED}, + {"manual", MANUAL}, {"match", MATCH}, {"max", MAX}, {"max_rows", MAX_ROWS}, @@ -489,6 +490,7 @@ var keywords = []keyword{ {"outer", OUTER}, {"outfile", OUTFILE}, {"over", OVER}, + {"parallel", PARALLEL}, {"overwrite", OVERWRITE}, {"pack_keys", PACK_KEYS}, {"parser", PARSER}, @@ -515,6 +517,7 @@ var keywords = []keyword{ {"procedure", PROCEDURE}, {"ps_current_thread_id", PS_CURRENT_THREAD_ID}, {"ps_thread_id", PS_THREAD_ID}, + {"qualify", QUALIFY}, {"queries", QUERIES}, {"query", QUERY}, {"range", RANGE}, @@ -696,6 +699,7 @@ var keywords = []keyword{ {"system", UNUSED}, {"table", TABLE}, {"tables", TABLES}, + {"tablesample", TABLESAMPLE}, {"tablespace", TABLESPACE}, {"temporary", TEMPORARY}, {"temptable", TEMPTABLE}, diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 0b63bdae731..4569fbc7686 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -705,67 +705,71 @@ const UNBOUNDED = 58012 const VCPU = 58013 const VISIBLE = 58014 const RETURNING = 58015 -const FORMAT_BYTES = 58016 -const FORMAT_PICO_TIME = 58017 -const PS_CURRENT_THREAD_ID = 58018 -const PS_THREAD_ID = 58019 -const GTID_SUBSET = 58020 -const GTID_SUBTRACT = 58021 -const WAIT_FOR_EXECUTED_GTID_SET = 58022 -const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58023 -const FORMAT = 58024 -const TREE = 58025 -const VITESS = 58026 -const TRADITIONAL = 58027 -const VTEXPLAIN = 58028 -const VEXPLAIN = 58029 -const PLAN = 58030 -const LOCAL = 58031 -const LOW_PRIORITY = 58032 -const NO_WRITE_TO_BINLOG = 58033 -const LOGS = 58034 -const ERROR = 58035 -const GENERAL = 58036 -const HOSTS = 58037 -const OPTIMIZER_COSTS = 58038 -const USER_RESOURCES = 58039 -const SLOW = 58040 -const CHANNEL = 58041 -const RELAY = 58042 -const EXPORT = 58043 -const CURRENT = 58044 -const ROW = 58045 -const ROWS = 58046 -const AVG_ROW_LENGTH = 58047 -const CONNECTION = 58048 -const CHECKSUM = 58049 -const DELAY_KEY_WRITE = 58050 -const ENCRYPTION = 58051 -const ENGINE = 58052 -const INSERT_METHOD = 58053 -const MAX_ROWS = 58054 -const MIN_ROWS = 58055 -const PACK_KEYS = 58056 -const PASSWORD = 58057 -const FIXED = 58058 -const DYNAMIC = 58059 -const COMPRESSED = 58060 -const REDUNDANT = 58061 -const COMPACT = 58062 -const ROW_FORMAT = 58063 -const STATS_AUTO_RECALC = 58064 -const STATS_PERSISTENT = 58065 -const STATS_SAMPLE_PAGES = 58066 -const STORAGE = 58067 -const MEMORY = 58068 -const DISK = 58069 -const PARTITIONS = 58070 -const LINEAR = 58071 -const RANGE = 58072 -const LIST = 58073 -const SUBPARTITION = 58074 -const SUBPARTITIONS = 58075 -const HASH = 58076 +const MANUAL = 58016 +const PARALLEL = 58017 +const QUALIFY = 58018 +const TABLESAMPLE = 58019 +const FORMAT_BYTES = 58020 +const FORMAT_PICO_TIME = 58021 +const PS_CURRENT_THREAD_ID = 58022 +const PS_THREAD_ID = 58023 +const GTID_SUBSET = 58024 +const GTID_SUBTRACT = 58025 +const WAIT_FOR_EXECUTED_GTID_SET = 58026 +const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58027 +const FORMAT = 58028 +const TREE = 58029 +const VITESS = 58030 +const TRADITIONAL = 58031 +const VTEXPLAIN = 58032 +const VEXPLAIN = 58033 +const PLAN = 58034 +const LOCAL = 58035 +const LOW_PRIORITY = 58036 +const NO_WRITE_TO_BINLOG = 58037 +const LOGS = 58038 +const ERROR = 58039 +const GENERAL = 58040 +const HOSTS = 58041 +const OPTIMIZER_COSTS = 58042 +const USER_RESOURCES = 58043 +const SLOW = 58044 +const CHANNEL = 58045 +const RELAY = 58046 +const EXPORT = 58047 +const CURRENT = 58048 +const ROW = 58049 +const ROWS = 58050 +const AVG_ROW_LENGTH = 58051 +const CONNECTION = 58052 +const CHECKSUM = 58053 +const DELAY_KEY_WRITE = 58054 +const ENCRYPTION = 58055 +const ENGINE = 58056 +const INSERT_METHOD = 58057 +const MAX_ROWS = 58058 +const MIN_ROWS = 58059 +const PACK_KEYS = 58060 +const PASSWORD = 58061 +const FIXED = 58062 +const DYNAMIC = 58063 +const COMPRESSED = 58064 +const REDUNDANT = 58065 +const COMPACT = 58066 +const ROW_FORMAT = 58067 +const STATS_AUTO_RECALC = 58068 +const STATS_PERSISTENT = 58069 +const STATS_SAMPLE_PAGES = 58070 +const STORAGE = 58071 +const MEMORY = 58072 +const DISK = 58073 +const PARTITIONS = 58074 +const LINEAR = 58075 +const RANGE = 58076 +const LIST = 58077 +const SUBPARTITION = 58078 +const SUBPARTITIONS = 58079 +const HASH = 58080 var yyToknames = [...]string{ "$end", @@ -1458,6 +1462,10 @@ var yyToknames = [...]string{ "VCPU", "VISIBLE", "RETURNING", + "MANUAL", + "PARALLEL", + "QUALIFY", + "TABLESAMPLE", "FORMAT_BYTES", "FORMAT_PICO_TIME", "PS_CURRENT_THREAD_ID", @@ -1539,7 +1547,7 @@ var yyExca = [...]int{ -2, 40, -1, 52, 1, 160, - 752, 160, + 756, 160, -2, 168, -1, 53, 149, 168, @@ -1561,7 +1569,7 @@ var yyExca = [...]int{ -2, 134, -1, 126, 1, 161, - 752, 161, + 756, 161, -2, 168, -1, 137, 150, 411, @@ -1572,80 +1580,80 @@ var yyExca = [...]int{ 191, 168, 364, 168, -2, 535, - -1, 751, + -1, 755, 177, 41, -2, 43, - -1, 960, + -1, 964, 95, 1647, -2, 1485, - -1, 961, + -1, 965, 95, 1648, 236, 1652, -2, 1486, - -1, 962, + -1, 966, 236, 1651, -2, 42, - -1, 1048, + -1, 1052, 65, 899, -2, 912, - -1, 1137, + -1, 1141, 264, 1112, 269, 1112, -2, 422, - -1, 1222, + -1, 1226, 1, 583, - 752, 583, + 756, 583, -2, 168, - -1, 1533, + -1, 1537, 236, 1652, -2, 1486, - -1, 1746, + -1, 1750, 65, 900, -2, 916, - -1, 1747, + -1, 1751, 65, 901, -2, 917, - -1, 1812, + -1, 1816, 149, 168, 191, 168, 364, 168, -2, 461, - -1, 1895, + -1, 1899, 150, 411, 259, 411, -2, 515, - -1, 1904, + -1, 1908, 264, 1113, 269, 1113, -2, 423, - -1, 2353, + -1, 2357, 236, 1656, -2, 1650, - -1, 2354, + -1, 2358, 236, 1652, -2, 1648, - -1, 2459, + -1, 2463, 149, 168, 191, 168, 364, 168, -2, 462, - -1, 2466, + -1, 2470, 28, 189, -2, 191, - -1, 2932, + -1, 2936, 86, 99, 96, 99, -2, 979, - -1, 3000, - 727, 705, + -1, 3004, + 731, 705, -2, 679, - -1, 3225, + -1, 3229, 55, 1589, -2, 1583, - -1, 4062, - 727, 705, + -1, 4066, + 731, 705, -2, 693, - -1, 4154, + -1, 4158, 98, 637, 104, 637, 114, 637, @@ -1691,94 +1699,94 @@ var yyExca = [...]int{ 232, 637, 233, 637, 234, 637, - -2, 2028, + -2, 2029, } const yyPrivate = 57344 -const yyLast = 55832 +const yyLast = 56577 var yyAct = [...]int{ - 976, 3713, 3714, 87, 3712, 4229, 4133, 2456, 4043, 2158, - 964, 2382, 3376, 4242, 4121, 4025, 3662, 4196, 971, 2146, - 4197, 963, 3277, 3284, 1290, 3948, 3334, 4152, 3339, 3336, - 3512, 3335, 1288, 3325, 3238, 4023, 3333, 3338, 3337, 3091, - 3649, 2384, 1815, 2084, 3176, 3354, 5, 2531, 2025, 3292, - 3353, 755, 3242, 3239, 3558, 3552, 3065, 3755, 3226, 3090, - 749, 2892, 1872, 925, 783, 924, 2966, 3356, 750, 2494, - 3047, 1766, 2430, 2967, 3383, 2997, 2499, 2518, 3542, 4094, - 2411, 2968, 2427, 2444, 2562, 165, 1046, 1169, 87, 1067, - 2431, 1043, 2898, 2917, 1074, 2882, 2866, 929, 1099, 2142, - 42, 1145, 2180, 2306, 1920, 3580, 3038, 2432, 1902, 1046, - 2305, 2540, 2338, 41, 2517, 43, 2905, 2092, 151, 2501, - 2959, 3236, 2419, 2579, 1109, 1132, 1127, 1804, 2934, 1784, - 978, 102, 106, 1770, 107, 2434, 1727, 1546, 2186, 2106, - 1471, 2117, 1454, 2021, 1909, 1103, 765, 3241, 1106, 1135, - 1881, 1138, 2001, 1107, 2490, 1133, 1134, 1803, 1084, 1789, - 2491, 1086, 2412, 760, 752, 1055, 1749, 2194, 3750, 2213, - 1052, 1529, 2864, 85, 109, 2033, 2083, 1278, 169, 3513, - 3742, 1505, 1066, 1045, 129, 1049, 127, 128, 3569, 1894, - 134, 101, 135, 1218, 1079, 1041, 1053, 1555, 1550, 753, - 84, 1050, 108, 1051, 100, 4230, 1069, 1286, 926, 1078, - 1264, 3650, 93, 2533, 2534, 2535, 2533, 742, 3322, 4078, - 3020, 3019, 2577, 2988, 685, 4179, 3642, 1040, 1986, 1772, - 3055, 130, 3056, 1059, 4074, 2379, 2380, 1472, 2099, 4073, - 1149, 1171, 1174, 136, 2098, 4079, 3605, 1100, 2097, 2096, - 2095, 2094, 2064, 1234, 1188, 1189, 1190, 2862, 1193, 1194, - 1195, 1196, 1182, 2631, 1199, 1200, 1201, 1202, 1203, 1204, - 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, - 1215, 1094, 1093, 4173, 1057, 2, 1044, 1042, 1148, 682, - 743, 683, 3222, 1124, 1060, 1775, 1773, 2566, 4200, 3344, - 3717, 4252, 4235, 1488, 1116, 130, 2403, 1175, 1178, 1179, - 727, 1123, 2894, 1122, 1121, 4052, 3717, 2990, 1111, 3180, - 4195, 1068, 4183, 4181, 3344, 1776, 1774, 4234, 4220, 113, - 114, 115, 1191, 118, 3516, 1768, 124, 3341, 727, 193, - 4074, 2565, 677, 3515, 977, 1482, 2408, 4182, 4180, 2407, - 1235, 3013, 1039, 4026, 740, 741, 2827, 3010, 1468, 3342, - 2104, 1465, 721, 1760, 1034, 1035, 1036, 1037, 192, 95, - 3402, 1048, 4148, 130, 3944, 3943, 3655, 1173, 1172, 3656, - 4210, 3954, 86, 4177, 3342, 86, 3674, 721, 3348, 86, - 1456, 131, 1092, 1096, 928, 3663, 3716, 4122, 2151, 4130, - 2559, 1081, 1082, 3953, 1125, 2908, 4157, 174, 980, 981, - 982, 3428, 3716, 3348, 1883, 980, 981, 982, 2943, 3274, - 3275, 2942, 2863, 2638, 2944, 2451, 2452, 1805, 3673, 1806, - 716, 2076, 2077, 2909, 3273, 1115, 97, 3054, 1117, 2635, - 3769, 721, 1271, 1120, 1273, 1227, 1228, 2450, 3037, 1254, - 1032, 1031, 1485, 2948, 1486, 1487, 4044, 2991, 1478, 1242, - 2955, 1470, 4134, 2564, 1243, 95, 1467, 171, 95, 1255, - 172, 1484, 95, 1259, 1260, 1248, 3410, 1230, 701, 1242, - 1283, 2029, 1270, 1272, 1243, 721, 4162, 3380, 1472, 2469, - 2468, 699, 1241, 2636, 1240, 3408, 191, 1449, 1217, 721, - 2629, 1118, 3378, 3345, 2901, 2902, 4160, 3112, 2381, 721, - 2075, 735, 2079, 739, 733, 3384, 4166, 4167, 86, 2510, - 1801, 88, 3039, 3996, 3066, 3997, 3294, 3295, 3345, 2998, - 2541, 696, 1506, 4161, 1731, 1976, 3371, 1120, 4138, 1112, - 711, 3023, 2415, 2504, 3372, 4138, 1114, 1113, 2586, 2580, - 4232, 1192, 4201, 1455, 3399, 706, 1507, 1508, 1509, 1510, - 1511, 1512, 1513, 1515, 1514, 1516, 1517, 709, 1256, 97, - 719, 1466, 2584, 4202, 1249, 2002, 1275, 722, 720, 1977, - 1448, 1978, 1261, 2605, 3381, 2606, 1280, 2607, 2632, 1263, - 2633, 3042, 1262, 1268, 1282, 1118, 1482, 1269, 3644, 3379, - 1281, 95, 722, 2587, 1257, 1258, 1223, 1274, 3068, 3643, - 2608, 175, 2582, 3027, 2583, 3028, 3928, 1147, 1198, 1197, - 181, 3640, 1147, 2030, 1085, 1520, 1128, 2585, 2544, 1158, - 1129, 3721, 1267, 2428, 1119, 3293, 1129, 1167, 686, 1140, - 688, 702, 1166, 724, 1165, 723, 692, 3296, 690, 694, - 703, 695, 1164, 689, 1163, 700, 722, 1162, 691, 704, - 705, 708, 712, 713, 714, 710, 707, 1520, 698, 725, - 1161, 1160, 1155, 1734, 1887, 1168, 3113, 3555, 3296, 4253, - 1104, 4207, 3078, 3077, 3076, 1141, 4174, 3070, 1104, 3074, - 1104, 3069, 1102, 3067, 2022, 1177, 2503, 1882, 3072, 1080, - 722, 1140, 1092, 1096, 928, 1176, 3043, 3071, 2570, 1478, - 2569, 3059, 2018, 1457, 722, 1185, 1287, 3316, 1287, 1287, - 1146, 1095, 1089, 1087, 722, 1146, 3073, 3075, 1119, 3022, - 4175, 1880, 1879, 1878, 3179, 3008, 3639, 2019, 2413, 2414, - 2593, 2589, 2591, 2592, 2590, 2594, 2595, 2596, 2597, 166, - 1876, 721, 1802, 2653, 1477, 1474, 1475, 1476, 1481, 1483, - 1480, 3207, 1479, 2992, 1233, 676, 3205, 4039, 1046, 1530, - 1535, 1536, 1473, 1539, 1541, 1542, 1543, 1544, 1545, 1159, - 1548, 1549, 1551, 1551, 3594, 1551, 1551, 1556, 1556, 1556, - 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 980, 3716, 975, 87, 4246, 2162, 3717, 4233, 3718, 3380, + 4125, 968, 4137, 4200, 3281, 967, 4201, 2150, 4047, 3516, + 2460, 3288, 1292, 4156, 2386, 3952, 3242, 4029, 3338, 2185, + 3343, 3340, 3339, 3337, 3342, 1819, 3341, 4027, 3653, 2388, + 1294, 3666, 3095, 3358, 2029, 4098, 3296, 3329, 2088, 3180, + 2535, 5, 3357, 759, 3246, 3243, 3562, 3556, 3759, 3069, + 3094, 2896, 3230, 2498, 754, 2434, 3051, 1770, 929, 787, + 3546, 3387, 933, 753, 928, 42, 3360, 3001, 2970, 2522, + 2503, 2415, 3584, 2971, 2566, 1103, 1050, 2972, 87, 165, + 2448, 2431, 1876, 2921, 1071, 1924, 1047, 2436, 2902, 1078, + 2435, 1149, 3240, 2886, 749, 1173, 2870, 2310, 41, 1050, + 43, 2342, 2146, 2184, 2544, 3042, 151, 2309, 1906, 2096, + 2521, 2423, 2583, 2505, 1113, 2963, 1136, 1808, 1131, 2938, + 982, 1788, 1774, 102, 1550, 2190, 2438, 106, 1731, 107, + 2121, 2110, 1475, 1458, 2025, 1913, 3245, 1110, 1107, 769, + 1070, 1142, 1885, 2909, 1111, 2005, 756, 2494, 1049, 1137, + 1053, 1139, 1138, 1807, 1088, 1793, 1090, 101, 3754, 2198, + 2217, 2868, 2495, 1059, 1753, 1533, 109, 1509, 2087, 1282, + 3746, 1073, 2416, 3573, 1056, 764, 2037, 85, 169, 129, + 127, 128, 3517, 1898, 1045, 134, 1054, 135, 1055, 757, + 1222, 1083, 1057, 930, 1554, 100, 4234, 1290, 3654, 3326, + 1268, 4082, 2537, 84, 1082, 93, 1559, 2537, 2538, 2539, + 3024, 3023, 108, 2992, 2581, 1476, 3646, 4183, 1044, 3609, + 1776, 3059, 3060, 4078, 4077, 1063, 2103, 4083, 746, 1990, + 1153, 130, 2102, 2101, 689, 2100, 1178, 136, 1104, 2099, + 2098, 2383, 2384, 2068, 1238, 686, 2866, 687, 2635, 1175, + 3226, 2570, 1186, 4177, 4204, 3184, 4256, 3721, 4199, 3721, + 1064, 4224, 1192, 1193, 1194, 3520, 1197, 1198, 1199, 1200, + 2898, 3519, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, + 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1048, + 1152, 1098, 2407, 2412, 1097, 2569, 731, 1046, 1239, 1061, + 2, 747, 4239, 1128, 4056, 130, 1127, 1126, 1125, 1179, + 1182, 1183, 3348, 1779, 1072, 1115, 1772, 2994, 3348, 1472, + 1764, 2411, 1469, 1486, 1492, 1120, 3017, 4238, 731, 4078, + 4030, 3345, 725, 2831, 1777, 2108, 981, 4187, 3406, 4152, + 3948, 3947, 1195, 1780, 113, 114, 115, 1043, 118, 1177, + 1176, 124, 192, 3720, 193, 3720, 3014, 681, 984, 985, + 986, 4214, 4186, 95, 1778, 1096, 1100, 932, 3958, 744, + 745, 4185, 3346, 130, 1129, 131, 4181, 725, 3346, 1038, + 1039, 1040, 1041, 3678, 3667, 1460, 1052, 984, 985, 986, + 4126, 174, 4134, 1096, 1100, 932, 4184, 3659, 2563, 3957, + 3660, 3352, 86, 2155, 4161, 3432, 1887, 3352, 3278, 3279, + 2455, 2456, 4138, 2867, 725, 2947, 1085, 1086, 2946, 3277, + 720, 2948, 3031, 3058, 3032, 4166, 2639, 1471, 86, 2080, + 2081, 1809, 3041, 1810, 2454, 2642, 1482, 2952, 1258, 1474, + 86, 1036, 725, 1035, 1287, 4164, 4048, 1246, 3677, 2995, + 1259, 171, 1247, 97, 172, 4170, 4171, 1263, 1264, 2033, + 2514, 2959, 1252, 2912, 3414, 3298, 3299, 725, 705, 2473, + 2472, 3412, 4165, 1489, 3384, 1490, 1491, 1488, 1453, 3773, + 191, 703, 2633, 2568, 2508, 95, 739, 1246, 4142, 2905, + 2906, 2913, 1247, 3382, 1124, 86, 1231, 1232, 88, 725, + 1245, 2226, 1244, 2079, 2083, 2640, 743, 737, 4205, 1476, + 725, 95, 725, 1805, 3388, 3116, 3349, 4142, 2385, 1221, + 3043, 700, 3349, 95, 1735, 4000, 1980, 4001, 1234, 4206, + 715, 3002, 1470, 2545, 3027, 3375, 2609, 4236, 2610, 2588, + 2611, 1196, 1275, 3376, 1277, 710, 97, 726, 1459, 1260, + 2584, 2590, 1122, 2419, 2006, 2419, 1279, 713, 1286, 1452, + 723, 1253, 3046, 1284, 1285, 1227, 1265, 1267, 724, 3648, + 1981, 3385, 1982, 3647, 3297, 2612, 1266, 2636, 95, 2637, + 1202, 2587, 1274, 1276, 1261, 1262, 3300, 1151, 1201, 2586, + 3383, 3932, 726, 3644, 2589, 175, 1162, 1089, 1160, 1132, + 2218, 2034, 2548, 1133, 181, 2220, 2591, 1738, 3725, 2225, + 2221, 3300, 1151, 2222, 2223, 2224, 2432, 1486, 2219, 2227, + 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 690, 726, + 692, 706, 1133, 728, 1171, 727, 696, 2507, 694, 698, + 707, 699, 1170, 693, 1169, 704, 1168, 1510, 695, 708, + 709, 712, 716, 717, 718, 714, 711, 726, 702, 729, + 4178, 1167, 1166, 3559, 1165, 1164, 1159, 1891, 1172, 3403, + 3183, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, + 1520, 1521, 726, 1108, 3117, 1123, 4257, 1524, 1145, 4211, + 1150, 1108, 1144, 1272, 1099, 1093, 1091, 1273, 2597, 2593, + 2595, 2596, 2594, 2598, 2599, 2600, 2601, 1278, 3643, 2026, + 1291, 1886, 1291, 1291, 726, 1150, 1108, 1084, 3047, 2574, + 1106, 2573, 1099, 1093, 1091, 726, 2022, 726, 1461, 1189, + 1482, 3211, 1271, 166, 3320, 3026, 1481, 1478, 1479, 1480, + 1485, 1487, 1484, 1884, 1483, 1806, 1163, 3012, 1161, 2417, + 2418, 2417, 2418, 1883, 1477, 2996, 3209, 1882, 2023, 1880, + 1237, 680, 1050, 1534, 1539, 1540, 4179, 1543, 1545, 1546, + 1547, 1548, 1549, 3063, 1552, 1553, 1555, 1555, 3029, 1555, + 1555, 1560, 1560, 1560, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, @@ -1790,296 +1798,296 @@ var yyAct = [...]int{ 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, - 1679, 1680, 1681, 1682, 1527, 4051, 1276, 2989, 1683, 1445, - 1685, 1686, 1687, 1688, 1689, 1446, 1447, 1988, 1987, 1989, - 1990, 1991, 1556, 1556, 1556, 1556, 1556, 1556, 1540, 1126, - 1772, 3672, 4246, 2563, 726, 3603, 3604, 1696, 1697, 1698, - 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, - 1709, 1523, 1524, 1525, 1526, 717, 722, 94, 3012, 3025, - 94, 1537, 4097, 1156, 94, 3400, 3715, 1531, 3346, 3347, - 718, 1552, 1229, 1553, 1554, 1557, 1558, 3556, 167, 3500, - 4136, 3350, 3715, 89, 2637, 179, 1226, 4136, 1088, 2636, - 1239, 1147, 1147, 3346, 3347, 1477, 1474, 1475, 1476, 1481, - 1483, 1480, 3011, 1479, 3046, 1908, 3350, 95, 3188, 2561, - 3576, 4165, 4135, 1473, 3036, 1464, 2939, 3035, 1724, 4135, - 2507, 1095, 1089, 1087, 1730, 2904, 187, 1238, 1759, 1244, - 1245, 1246, 1247, 1046, 1147, 2867, 2869, 1046, 721, 1521, - 1522, 2839, 2154, 1046, 1793, 1147, 1684, 1252, 1232, 3187, - 2899, 126, 684, 1284, 1285, 4164, 1221, 2457, 1520, 3272, - 1517, 2508, 2007, 2664, 1720, 1760, 1063, 2195, 2506, 168, - 173, 170, 176, 177, 178, 180, 182, 183, 184, 185, - 1721, 2415, 2178, 1500, 2196, 186, 188, 189, 190, 1279, - 1265, 2034, 1184, 94, 1146, 1146, 121, 4065, 1170, 3635, - 1150, 1140, 2509, 1237, 1147, 1152, 3568, 2581, 2088, 1153, - 1151, 2015, 2505, 1157, 1907, 1807, 2187, 2523, 3086, 1690, - 1691, 1692, 1693, 1694, 1695, 1740, 2187, 1741, 2673, 106, - 1738, 107, 1486, 1487, 1742, 2006, 4211, 1146, 1487, 3764, - 1045, 3610, 3609, 1140, 1143, 1144, 2548, 1104, 1146, 2664, - 1721, 1137, 1141, 1917, 1140, 1143, 1144, 1728, 1104, 1916, - 3049, 1906, 1137, 1141, 4244, 3048, 2558, 4245, 2556, 4243, - 1158, 109, 1136, 1156, 122, 3049, 1488, 2553, 1771, 4203, - 3048, 2170, 2159, 2160, 2161, 2162, 2172, 2163, 2164, 2165, - 2177, 2173, 2166, 2167, 2174, 2175, 2176, 2168, 2169, 2171, - 4057, 3595, 1884, 1885, 1886, 1058, 3669, 1146, 3670, 2868, - 1488, 2122, 1150, 1140, 1736, 1147, 2560, 1152, 1120, 1216, - 2557, 1153, 1151, 2193, 1900, 2123, 1518, 1519, 2121, 1488, - 1739, 2222, 1762, 1971, 2700, 1910, 1910, 1042, 1725, 4248, - 1893, 1765, 1154, 1044, 1912, 1737, 1222, 2027, 1266, 2035, - 1922, 2181, 1923, 722, 1925, 1927, 1488, 1236, 1931, 1933, - 1935, 1937, 1939, 1251, 4254, 1287, 1798, 1799, 1953, 1961, - 1962, 95, 1867, 3936, 1253, 1967, 1968, 2413, 2414, 1911, - 2660, 2343, 2011, 1220, 2009, 2010, 2008, 2012, 2013, 2014, - 2003, 2120, 2004, 2553, 1875, 2005, 3935, 1488, 1088, 1510, - 1511, 1512, 1513, 1515, 1514, 1516, 1517, 1903, 3926, 4098, - 1890, 1891, 3686, 1889, 2110, 2111, 2108, 2109, 1146, 3685, - 1183, 3958, 1743, 3617, 1180, 1485, 745, 1486, 1487, 1760, - 2214, 980, 981, 982, 3088, 2216, 2555, 2192, 1957, 2221, - 2217, 2107, 3616, 2218, 2219, 2220, 4031, 1914, 2215, 2223, - 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 4099, 1485, - 4255, 1486, 1487, 2023, 1508, 1509, 1510, 1511, 1512, 1513, - 1515, 1514, 1516, 1517, 1949, 3606, 1996, 1952, 1485, 1954, - 1486, 1487, 3280, 1512, 1513, 1515, 1514, 1516, 1517, 4216, - 1760, 130, 3323, 1219, 1488, 4032, 1994, 1123, 1506, 1122, - 1121, 1502, 1983, 1503, 3312, 1485, 2964, 1486, 1487, 1119, - 2110, 2111, 2643, 2644, 2963, 2962, 2040, 1504, 1518, 1519, - 1501, 2513, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, - 1514, 1516, 1517, 3281, 727, 1287, 1287, 1997, 1981, 1488, - 2343, 2036, 2037, 2062, 2340, 192, 1485, 1995, 1486, 1487, - 1980, 87, 1979, 2342, 87, 2041, 2993, 1488, 3283, 1969, - 1963, 1960, 2048, 2049, 2050, 2420, 2421, 1993, 131, 975, - 153, 2669, 2061, 1982, 1959, 1958, 1929, 1735, 3278, 3600, - 3375, 727, 1488, 192, 174, 1494, 1495, 1496, 1497, 1498, - 1499, 1493, 1490, 2946, 2957, 727, 4204, 1451, 3294, 3295, - 2529, 2527, 2528, 2526, 1801, 3279, 131, 1507, 1508, 1509, - 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 164, 2525, - 4060, 2524, 174, 4059, 152, 4035, 2712, 112, 1506, 4034, - 2149, 2149, 2150, 2147, 2147, 1488, 1484, 1760, 111, 3285, - 110, 2888, 4231, 1485, 171, 1486, 1487, 172, 42, 2668, - 2112, 42, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, - 1514, 1516, 1517, 4191, 1760, 1760, 103, 1778, 4033, 1896, - 1897, 163, 162, 191, 4214, 1760, 104, 3931, 2233, 2888, - 1760, 4053, 171, 1484, 1760, 172, 2888, 4129, 1485, 2038, - 1486, 1487, 2888, 4108, 2888, 4104, 2042, 3915, 2044, 2045, - 2046, 2047, 4016, 1760, 3963, 2051, 1485, 3293, 1486, 1487, - 1488, 191, 103, 1760, 95, 3914, 1779, 2063, 105, 3296, - 3763, 85, 104, 1506, 85, 3058, 3761, 4144, 1760, 1720, - 2089, 1485, 3682, 1486, 1487, 1719, 2182, 1760, 2119, 3653, - 4050, 1488, 2069, 2070, 1718, 1721, 1488, 1507, 1508, 1509, - 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 2125, 1717, - 2127, 2128, 2129, 2130, 2131, 2132, 2134, 2136, 2137, 2138, - 2139, 2140, 2141, 3614, 2124, 157, 1898, 160, 3599, 1895, - 3385, 158, 159, 1760, 1485, 3962, 1486, 1487, 175, 1488, - 3382, 2257, 2153, 1488, 2126, 3939, 1760, 181, 3315, 2353, - 2888, 3927, 4142, 1760, 3653, 1760, 3919, 2351, 3314, 1488, - 2888, 3651, 2553, 1760, 1548, 3574, 1760, 1488, 2197, 2198, - 2199, 2200, 3040, 2352, 1506, 2973, 175, 2341, 2960, 1531, - 2339, 1716, 2211, 4140, 1760, 181, 1710, 2232, 4009, 1760, - 3282, 1506, 2626, 2652, 2618, 2249, 2714, 2188, 1507, 1508, - 1509, 1510, 1511, 1512, 1513, 1515, 1514, 1516, 1517, 1485, - 2617, 1486, 1487, 2406, 1488, 1507, 1508, 1509, 1510, 1511, - 1512, 1513, 1515, 1514, 1516, 1517, 2350, 2794, 1760, 2356, - 2357, 4007, 1760, 3305, 3304, 4004, 1760, 3302, 3303, 2436, - 1485, 2662, 1486, 1487, 112, 1485, 2575, 1486, 1487, 2574, - 106, 2661, 107, 3300, 3301, 111, 2410, 110, 2353, 3986, - 1760, 3300, 3299, 2466, 105, 105, 2351, 1488, 2914, 1760, - 2636, 3021, 106, 2386, 107, 1488, 166, 1871, 3002, 3918, - 2398, 2387, 2425, 2995, 2996, 3661, 2118, 2065, 1485, 2031, - 1486, 1487, 1485, 1488, 1486, 1487, 2888, 2887, 2906, 2885, - 1488, 2152, 1760, 2935, 1992, 1488, 3541, 1760, 1485, 1984, - 1486, 1487, 1109, 105, 166, 1974, 1485, 1970, 1486, 1487, - 1488, 1966, 1965, 2470, 1964, 2471, 2472, 2473, 2474, 1760, - 1760, 1871, 1870, 2935, 1059, 1780, 2438, 1277, 2460, 2480, - 1813, 1812, 2482, 2483, 2484, 2485, 1109, 2475, 2476, 2477, - 2478, 3267, 2461, 2374, 3571, 2399, 111, 2442, 3237, 3534, - 1760, 2636, 2392, 1485, 2393, 1486, 1487, 3531, 1760, 3567, - 2401, 2936, 161, 2999, 2978, 2914, 2496, 2883, 2913, 2464, - 2465, 2938, 1488, 2554, 3567, 3529, 1760, 2542, 2502, 2906, - 2423, 1488, 3492, 1760, 1484, 4092, 4064, 3490, 1760, 2447, - 2448, 2936, 2446, 1094, 1093, 2888, 2914, 3520, 3302, 2463, - 2462, 2636, 3486, 1760, 3210, 1488, 1485, 2449, 1486, 1487, - 1488, 2794, 3570, 2697, 1485, 2696, 1486, 1487, 1488, 2553, - 1484, 2536, 3286, 1488, 1047, 2512, 3290, 2418, 2539, 2914, - 1149, 3618, 1485, 3289, 1486, 1487, 1488, 2553, 2405, 1485, - 1910, 1486, 1487, 2497, 1485, 2547, 1486, 1487, 2550, 2493, - 2551, 2486, 2488, 2489, 1764, 2511, 3567, 2516, 2515, 1485, - 2377, 1486, 1487, 2152, 3483, 1760, 2090, 3291, 2074, 2017, - 1800, 154, 3287, 3589, 155, 97, 1131, 3288, 1148, 2497, - 1945, 2567, 1130, 2549, 2546, 2545, 4170, 2571, 3619, 3620, - 3621, 2572, 2573, 4111, 3950, 2568, 3377, 3481, 1760, 1767, - 3916, 3951, 3479, 1760, 3776, 167, 3634, 95, 3631, 2510, - 3477, 1760, 179, 3612, 3326, 3475, 1760, 3433, 1488, 1761, - 1763, 1485, 3432, 1486, 1487, 1873, 2495, 1488, 3473, 1760, - 1485, 1488, 1486, 1487, 3373, 2641, 1488, 1946, 1947, 1948, - 3328, 2969, 3324, 167, 1046, 1046, 1046, 2578, 3003, 2492, - 179, 2487, 2481, 187, 1485, 1488, 1486, 1487, 2479, 1485, - 1999, 1486, 1487, 1488, 1541, 1905, 1541, 1485, 1901, 1486, - 1487, 1488, 1485, 2390, 1486, 1487, 1716, 3417, 1869, 123, - 1488, 1714, 2656, 2970, 1221, 1485, 1712, 1486, 1487, 1713, - 1711, 187, 1715, 2611, 4226, 2970, 168, 173, 170, 176, - 177, 178, 180, 182, 183, 184, 185, 1488, 2067, 2353, - 3471, 1760, 186, 188, 189, 190, 1488, 2659, 4224, 3469, - 1760, 3581, 3582, 3467, 1760, 1488, 4198, 4072, 3465, 1760, - 3991, 3584, 1488, 2352, 168, 173, 170, 176, 177, 178, - 180, 182, 183, 184, 185, 1488, 3320, 2628, 1760, 1488, - 186, 188, 189, 190, 3319, 3463, 1760, 3318, 3237, 2982, - 1488, 2634, 2612, 3461, 1760, 4068, 3259, 1485, 1722, 1486, - 1487, 3260, 3459, 1760, 3587, 2068, 1485, 2642, 1486, 1487, - 1485, 1782, 1486, 1487, 3257, 1485, 3586, 1486, 1487, 3258, - 2645, 2646, 2647, 2648, 1488, 3622, 1777, 3256, 2119, 3457, - 1760, 3255, 3952, 2409, 1485, 681, 1486, 1487, 3455, 1760, - 1061, 1488, 1485, 2396, 1486, 1487, 1941, 2649, 1760, 2651, - 1485, 3575, 1486, 1487, 3453, 1760, 1488, 3215, 2654, 1485, - 2655, 1486, 1487, 1488, 3741, 3214, 3740, 3439, 1760, 1488, - 2710, 3415, 1760, 1488, 3261, 4030, 2923, 2924, 3623, 3624, - 3625, 3754, 1781, 2650, 2672, 1488, 1485, 3756, 1486, 1487, - 1488, 1062, 2016, 3227, 3229, 1485, 3563, 1486, 1487, 1942, - 1943, 1944, 3230, 1488, 1485, 3224, 1486, 1487, 1030, 744, - 1488, 1485, 2838, 1486, 1487, 3560, 2859, 1760, 3298, 3739, - 2953, 2657, 2974, 3559, 1485, 2604, 1486, 1487, 1485, 2195, - 1486, 1487, 2603, 2857, 1760, 1488, 2826, 1064, 2602, 1485, - 2708, 1486, 1487, 1187, 2870, 1065, 2196, 2620, 2621, 1760, - 1073, 1488, 2623, 2601, 2600, 2832, 1760, 2115, 2113, 2114, - 2599, 2624, 4205, 1046, 1072, 2809, 1760, 2149, 2873, 2598, - 2147, 1488, 1186, 1485, 3393, 1486, 1487, 2801, 1760, 1488, - 2969, 103, 2792, 1760, 1488, 3052, 1450, 2871, 2911, 2912, - 1485, 104, 1486, 1487, 3009, 2790, 1760, 2436, 131, 3565, - 1046, 2931, 2777, 1760, 105, 1485, 4240, 1486, 1487, 2874, - 2986, 2876, 1485, 103, 1486, 1487, 2420, 2421, 1485, 105, - 1486, 1487, 1485, 104, 1486, 1487, 2118, 2775, 1760, 2615, - 4147, 2910, 1488, 4049, 1485, 3946, 1486, 1487, 3297, 1485, - 2927, 1486, 1487, 2773, 1760, 2402, 3543, 2640, 2073, 1488, - 3213, 2891, 1485, 2072, 1486, 1487, 1488, 110, 3212, 1485, - 1488, 1486, 1487, 2771, 1760, 4015, 4014, 2900, 112, 2929, - 1488, 2769, 1760, 1728, 2861, 111, 2767, 1760, 1488, 111, - 3751, 110, 1488, 3994, 1485, 42, 1486, 1487, 3762, 2881, - 3760, 3759, 3752, 1488, 2928, 3632, 1771, 2930, 1488, 2889, - 1485, 2906, 1486, 1487, 3564, 2949, 3562, 3329, 2903, 2886, - 1721, 2537, 2956, 2958, 1888, 3007, 112, 3553, 1071, 2933, - 1485, 3725, 1486, 1487, 2765, 1760, 2885, 111, 1485, 3116, - 1486, 1487, 2937, 1485, 2698, 1486, 1487, 2940, 2502, 3018, - 2388, 2763, 1760, 1488, 1794, 2947, 1786, 2950, 2761, 1760, - 2190, 2972, 2759, 1760, 4227, 2191, 2975, 2976, 4228, 4227, - 116, 117, 2961, 4048, 4228, 1488, 112, 4036, 3598, 2087, - 2757, 1760, 10, 2085, 2755, 1760, 9, 111, 1488, 110, - 2971, 1485, 1488, 1486, 1487, 2753, 1760, 105, 1488, 3, - 2751, 1760, 1488, 2253, 2983, 2984, 2985, 2979, 1485, 2980, - 1486, 1487, 99, 1, 3015, 1485, 1488, 1486, 1487, 1485, - 2086, 1486, 1487, 8, 1038, 1893, 1453, 3004, 3005, 1485, - 1452, 1486, 1487, 3602, 3062, 3063, 1488, 1485, 4159, 1486, - 1487, 1485, 697, 1486, 1487, 2749, 1760, 2378, 1726, 3014, - 4199, 4155, 1485, 1488, 1486, 1487, 4156, 1485, 1985, 1486, - 1487, 1975, 3664, 2304, 1488, 3947, 3332, 2747, 1760, 2543, - 1488, 2919, 2922, 2923, 2924, 2920, 1488, 2921, 2925, 3041, - 2745, 1760, 1488, 2336, 2743, 1760, 1488, 3630, 3079, 2500, - 3536, 3060, 1488, 1139, 2738, 1760, 156, 2458, 1488, 3044, - 2459, 4124, 1485, 1488, 1486, 1487, 120, 1097, 2734, 1760, - 119, 1142, 1250, 2368, 3097, 3098, 3099, 3100, 3101, 3102, - 3103, 3104, 3105, 3106, 1485, 1488, 1486, 1487, 2732, 1760, - 1761, 2375, 3080, 2538, 3114, 3654, 2954, 1485, 2467, 1486, - 1487, 1485, 1819, 1486, 1487, 2725, 1760, 1485, 3016, 1486, - 1487, 1485, 1817, 1486, 1487, 1818, 2723, 1760, 1816, 1821, - 1820, 4096, 3401, 3923, 2699, 1485, 3499, 1486, 1487, 3636, - 2078, 2400, 734, 1722, 3532, 1488, 2926, 728, 3498, 194, - 1808, 1787, 3118, 2071, 3494, 1485, 1488, 1486, 1487, 1181, - 3430, 3064, 687, 3306, 2576, 3429, 693, 1538, 3174, 3081, - 3050, 2066, 1485, 3051, 1486, 1487, 3211, 2941, 1091, 1083, - 2389, 2875, 1090, 1485, 2994, 1486, 1487, 3421, 3924, 1485, - 2247, 1486, 1487, 3061, 3245, 1485, 3557, 1486, 1487, 3223, - 3225, 1485, 2893, 1486, 1487, 1485, 3228, 1486, 1487, 3181, - 3221, 1485, 3192, 1486, 1487, 4029, 3183, 1485, 3753, 1486, - 1487, 4109, 1485, 2951, 1486, 1487, 2436, 1488, 1783, 3519, - 3107, 2341, 1488, 2341, 2339, 2671, 2339, 3419, 3154, 2185, - 1528, 759, 1488, 2435, 1485, 930, 1486, 1487, 1769, 2965, - 3244, 1488, 87, 2514, 3720, 2436, 2436, 2436, 2436, 2436, - 2105, 3164, 3165, 3166, 3167, 3168, 757, 756, 754, 2877, - 2330, 2331, 2332, 2333, 2334, 2436, 2907, 3192, 2436, 1492, - 1491, 3191, 965, 3182, 3266, 3184, 2865, 2355, 3249, 1795, - 2358, 2359, 2918, 1488, 1485, 2916, 1486, 1487, 3219, 2915, - 2613, 2443, 3203, 3583, 2027, 1485, 3579, 1486, 1487, 3204, - 3206, 3208, 1488, 4151, 2437, 3209, 2433, 3216, 3218, 2855, - 2884, 916, 915, 2438, 2854, 766, 2376, 758, 3231, 3232, - 748, 979, 1488, 914, 2850, 913, 3359, 1488, 3360, 3217, - 3024, 3349, 3374, 2849, 3026, 3250, 2952, 3268, 3253, 1049, - 3269, 3357, 2438, 2438, 2438, 2438, 2438, 3248, 106, 3262, - 107, 1488, 3270, 3251, 3252, 1050, 3254, 1051, 1488, 3370, - 1469, 1745, 2438, 1488, 3276, 2438, 1485, 1748, 1486, 1487, - 2397, 1485, 3309, 1486, 1487, 2848, 1488, 1110, 3398, 3308, - 3307, 1485, 4055, 1486, 1487, 2639, 3427, 3310, 3311, 1744, - 1485, 4062, 1486, 1487, 2847, 3340, 1488, 3648, 3321, 3000, - 2530, 69, 46, 1488, 3361, 3358, 3362, 1488, 4024, 3351, - 2502, 4093, 908, 905, 2846, 3722, 1488, 3723, 3234, 2845, - 3368, 3724, 3177, 3178, 3330, 4075, 4076, 904, 4077, 2242, - 1463, 1488, 1485, 1460, 1486, 1487, 4172, 2080, 98, 1488, - 36, 35, 3389, 2836, 34, 3388, 3386, 3240, 1488, 33, - 2835, 1485, 3240, 1486, 1487, 2834, 32, 3396, 26, 3403, - 3404, 25, 3405, 24, 23, 3407, 22, 3409, 2833, 3411, - 3406, 1485, 29, 1486, 1487, 19, 1485, 21, 1486, 1487, - 20, 18, 3422, 3423, 3424, 3425, 3426, 3343, 2830, 4194, - 4239, 125, 55, 52, 50, 2825, 133, 132, 53, 2818, - 1485, 49, 1486, 1487, 1224, 47, 96, 1485, 2817, 1486, - 1487, 31, 1485, 30, 1486, 1487, 1541, 17, 16, 15, - 1541, 14, 2658, 2816, 13, 1485, 2663, 1486, 1487, 12, - 11, 2815, 7, 6, 39, 38, 3544, 3331, 3546, 37, - 2814, 28, 27, 40, 4, 1485, 3514, 1486, 1487, 2666, - 2987, 2667, 1485, 3518, 1486, 1487, 1485, 2675, 1486, 1487, - 2532, 2677, 2678, 0, 0, 1485, 0, 1486, 1487, 0, - 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, - 1485, 2695, 1486, 1487, 3243, 0, 0, 0, 1485, 3397, - 1486, 1487, 0, 0, 0, 0, 0, 1485, 2436, 1486, - 1487, 3549, 0, 0, 2701, 2702, 2703, 2704, 0, 2706, - 2707, 3596, 2709, 3554, 3561, 3545, 2711, 3547, 0, 0, - 2716, 2717, 0, 2718, 0, 1488, 2721, 2722, 2724, 2726, - 2727, 2728, 2729, 2730, 2731, 2733, 2735, 2736, 2737, 2739, - 3352, 2741, 2742, 2744, 2746, 2748, 2750, 2752, 2754, 2756, - 2758, 2760, 2762, 2764, 2766, 2768, 2770, 2772, 2774, 2776, - 2778, 2779, 2780, 3551, 2782, 3588, 2784, 746, 2786, 2787, - 3591, 2789, 2791, 2793, 3361, 3358, 3362, 2796, 3597, 3590, - 3521, 2800, 3523, 3524, 3525, 2805, 2806, 2807, 2808, 3585, - 3566, 1488, 0, 0, 1729, 2438, 3578, 1488, 2819, 2820, - 2821, 2822, 2823, 2824, 3658, 3659, 2828, 2829, 3607, 3608, - 3613, 0, 3615, 0, 2831, 3592, 3593, 2813, 1488, 2837, - 0, 0, 0, 0, 2840, 2841, 2842, 2843, 2844, 0, - 1488, 3391, 3392, 0, 1488, 2851, 2852, 0, 2853, 0, - 1488, 2856, 2858, 2400, 1488, 2860, 0, 0, 0, 0, - 0, 0, 0, 679, 0, 2872, 0, 0, 1488, 0, - 3641, 0, 1488, 0, 3645, 3646, 3647, 1506, 1488, 0, - 0, 3660, 0, 1033, 1485, 2890, 1486, 1487, 1070, 1488, - 0, 1076, 1076, 2812, 0, 0, 2679, 0, 0, 2811, - 0, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1515, 1514, - 1516, 1517, 0, 2694, 0, 1488, 0, 0, 0, 0, - 2810, 1488, 0, 0, 0, 3676, 0, 1105, 0, 0, - 0, 0, 2804, 1488, 3687, 0, 2803, 0, 0, 0, - 1488, 0, 2802, 0, 1488, 0, 2799, 0, 0, 0, - 1485, 1488, 1486, 1487, 0, 0, 1485, 0, 1486, 1487, - 2798, 0, 0, 1488, 2797, 0, 0, 1488, 0, 0, - 2795, 3728, 0, 3729, 3730, 3731, 1488, 1485, 0, 1486, - 1487, 2788, 1488, 3738, 0, 0, 3745, 0, 3747, 1485, - 0, 1486, 1487, 1485, 1488, 1486, 1487, 3718, 0, 1485, - 3748, 1486, 1487, 1485, 0, 1486, 1487, 2785, 0, 0, - 0, 3244, 0, 2783, 87, 0, 3244, 1485, 0, 1486, - 1487, 1485, 0, 1486, 1487, 2781, 0, 1485, 0, 1486, - 1487, 0, 2740, 0, 0, 0, 2720, 0, 1485, 0, - 1486, 1487, 0, 2719, 0, 0, 0, 3749, 2149, 3778, - 3681, 2147, 3758, 3768, 3757, 2715, 0, 3770, 0, 2713, - 0, 3765, 0, 3767, 1485, 0, 1486, 1487, 2705, 0, - 1485, 0, 1486, 1487, 2676, 3637, 3638, 0, 0, 0, - 0, 3930, 1485, 2178, 1486, 1487, 2670, 0, 0, 1485, - 3782, 1486, 1487, 1485, 0, 1486, 1487, 0, 0, 0, - 1485, 0, 1486, 1487, 0, 0, 0, 0, 2376, 0, - 0, 42, 1485, 0, 1486, 1487, 1485, 0, 1486, 1487, - 3922, 0, 3921, 0, 0, 1485, 0, 1486, 1487, 3937, - 0, 1485, 0, 1486, 1487, 0, 3949, 0, 3920, 3942, - 0, 3941, 0, 1485, 0, 1486, 1487, 3779, 3780, 0, - 0, 0, 0, 0, 3988, 3989, 0, 0, 3092, 3093, - 3094, 3095, 3096, 3772, 0, 0, 0, 3746, 0, 0, - 3932, 3933, 3934, 0, 0, 0, 2149, 3992, 3111, 2147, - 0, 0, 2170, 2159, 2160, 2161, 2162, 2172, 2163, 2164, - 2165, 2177, 2173, 2166, 2167, 2174, 2175, 2176, 2168, 2169, - 2171, 0, 0, 0, 0, 0, 0, 3995, 0, 4037, - 3244, 3998, 0, 0, 3774, 0, 3240, 0, 0, 0, - 0, 0, 0, 0, 1559, 1560, 1561, 1562, 1563, 1564, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 4055, 1449, + 1280, 1531, 1687, 1130, 1689, 1690, 1691, 1692, 1693, 1450, + 1451, 2993, 3607, 3608, 1544, 1776, 1560, 1560, 1560, 1560, + 1560, 1560, 1992, 1991, 1993, 1994, 1995, 3719, 730, 3719, + 4140, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, + 1709, 1710, 1711, 1712, 1713, 1527, 1528, 1529, 1530, 721, + 4169, 3676, 1243, 2567, 1225, 1541, 1535, 3016, 2961, 4140, + 89, 2511, 167, 3560, 722, 1092, 4139, 95, 4101, 179, + 1524, 1556, 1912, 1557, 1558, 2871, 2873, 94, 2565, 1242, + 1468, 1248, 1249, 1250, 1251, 3350, 3351, 1230, 1561, 1562, + 1726, 3350, 3351, 1092, 4168, 4139, 2641, 1233, 3354, 2640, + 3504, 3015, 2512, 94, 3354, 1288, 1289, 3050, 1151, 2510, + 187, 4043, 1728, 3040, 1763, 94, 3039, 3598, 1734, 3580, + 1481, 1478, 1479, 1480, 1485, 1487, 1484, 1050, 1483, 4250, + 1181, 1050, 3192, 1724, 1525, 1526, 1144, 1050, 1477, 1119, + 1180, 2943, 1121, 2513, 1151, 2908, 1256, 2843, 2158, 1797, + 1688, 1236, 3191, 2509, 2903, 688, 2657, 168, 173, 170, + 176, 177, 178, 180, 182, 183, 184, 185, 126, 1725, + 94, 2010, 2461, 186, 188, 189, 190, 1524, 1521, 3276, + 3404, 1911, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, + 1518, 1520, 1521, 2011, 2668, 1151, 1764, 1269, 2199, 1742, + 2038, 1504, 1067, 1746, 1283, 4069, 1241, 1174, 121, 1049, + 3639, 1150, 3572, 2585, 2092, 2200, 1124, 1220, 1516, 1517, + 1519, 1518, 1520, 1521, 1744, 2019, 1745, 1811, 106, 3090, + 107, 2191, 1694, 1695, 1696, 1697, 1698, 1699, 2191, 1725, + 2677, 1124, 2527, 1116, 1490, 1491, 4215, 1150, 1188, 2872, + 1118, 1117, 1732, 1144, 1147, 1148, 1491, 1108, 3768, 4207, + 4061, 1141, 1145, 1510, 2557, 3614, 3613, 109, 3070, 2552, + 3053, 1921, 1775, 1492, 1920, 3052, 1740, 1910, 3053, 2557, + 2668, 1224, 1140, 3052, 2562, 2564, 122, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, 1150, 1122, + 2560, 1162, 1766, 1154, 1144, 1904, 1160, 2561, 1156, 1062, + 3599, 4252, 1157, 1155, 1888, 1889, 1890, 3940, 2114, 2115, + 2647, 2648, 2559, 1743, 3939, 1975, 2007, 3284, 2008, 1914, + 1914, 2009, 1897, 1158, 4258, 1926, 1151, 1927, 3930, 1929, + 1931, 1769, 1741, 1935, 1937, 1939, 1941, 1943, 1916, 1957, + 1048, 1046, 3072, 1729, 2197, 1270, 4102, 2031, 2039, 1291, + 1240, 4248, 1255, 1226, 4249, 3962, 4247, 1802, 1803, 1151, + 95, 1151, 4035, 1257, 1915, 1492, 731, 1764, 3285, 1871, + 2347, 1965, 1966, 2126, 2344, 2196, 2000, 1971, 1972, 3690, + 2124, 1223, 1492, 2346, 3673, 1879, 3674, 2127, 1522, 1523, + 2125, 2182, 1998, 3287, 1987, 4103, 2714, 1123, 1894, 979, + 1895, 3689, 1893, 2015, 1907, 2013, 2014, 2012, 2016, 2017, + 2018, 4036, 1489, 3282, 1490, 1491, 3082, 3081, 3080, 3621, + 4259, 3074, 1123, 3078, 3620, 3073, 1918, 3071, 3610, 1150, + 3327, 1747, 3076, 3298, 3299, 1144, 1147, 1148, 3316, 1108, + 3283, 3075, 1961, 1141, 1145, 1492, 2968, 1999, 2027, 2967, + 192, 1492, 2966, 1953, 2517, 2001, 1956, 1492, 1958, 2182, + 3077, 3079, 1150, 1997, 1150, 1986, 1187, 1154, 1144, 1985, + 1184, 1984, 1156, 131, 3289, 1764, 1157, 1155, 1983, 3421, + 984, 985, 986, 1492, 1973, 130, 1127, 1126, 1125, 174, + 2174, 2163, 2164, 2165, 2166, 2176, 2167, 2168, 2169, 2181, + 2177, 2170, 2171, 2178, 2179, 2180, 2172, 2173, 2175, 2424, + 2425, 2044, 1967, 1964, 1489, 1963, 1490, 1491, 1962, 1291, + 1291, 1933, 1739, 3092, 2347, 2040, 2041, 2666, 3604, 2066, + 731, 1489, 3379, 1490, 1491, 87, 1455, 2665, 87, 2045, + 1805, 4208, 3297, 4220, 1764, 1764, 2052, 2053, 2054, 171, + 1764, 4057, 172, 4064, 3300, 1510, 2065, 3062, 2174, 2163, + 2164, 2165, 2166, 2176, 2167, 2168, 2169, 2181, 2177, 2170, + 2171, 2178, 2179, 2180, 2172, 2173, 2175, 3967, 191, 1511, + 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, + 2950, 1510, 731, 2533, 1489, 2532, 1490, 1491, 2153, 2153, + 1489, 1492, 1490, 1491, 4063, 1782, 1489, 42, 1490, 1491, + 42, 2151, 2151, 2718, 2154, 1511, 1512, 1513, 1514, 1515, + 1516, 1517, 1519, 1518, 1520, 1521, 2114, 2115, 2112, 2113, + 2116, 2042, 1489, 4039, 1490, 1491, 1510, 2531, 2046, 2530, + 2048, 2049, 2050, 2051, 2529, 1726, 2528, 2055, 2892, 4235, + 4195, 1764, 1510, 2111, 1783, 1506, 4038, 1507, 2237, 2067, + 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1519, 1518, 1520, + 1521, 1508, 1522, 1523, 1505, 3286, 1511, 1512, 1513, 1514, + 1515, 1516, 1517, 1519, 1518, 1520, 1521, 4037, 1724, 3935, + 1492, 3919, 2251, 175, 1514, 1515, 1516, 1517, 1519, 1518, + 1520, 1521, 181, 1512, 1513, 1514, 1515, 1516, 1517, 1519, + 1518, 1520, 1521, 2892, 1764, 3966, 2093, 3918, 2716, 85, + 1488, 1764, 85, 3767, 1725, 2123, 2073, 2074, 1488, 1764, + 3923, 2186, 3765, 1510, 2129, 2656, 2131, 2132, 2133, 2134, + 2135, 2136, 2138, 2140, 2141, 2142, 2143, 2144, 2145, 3686, + 1489, 1492, 1490, 1491, 2128, 1492, 1723, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1519, 1518, 1520, 1521, 2892, 4133, + 2892, 4112, 2334, 2335, 2336, 2337, 2338, 1722, 2130, 1721, + 2157, 2355, 4218, 1764, 1492, 3618, 2261, 3603, 1492, 2359, + 3389, 103, 2362, 2363, 2892, 4108, 3922, 105, 1552, 2357, + 1492, 104, 3386, 2356, 2201, 2202, 2203, 2204, 1535, 1498, + 1499, 1500, 1501, 1502, 1503, 1497, 1494, 103, 2215, 2343, + 1720, 2253, 2236, 3319, 2345, 1718, 2192, 104, 2380, 3318, + 1716, 166, 3044, 1717, 1715, 2977, 1719, 4020, 1764, 1489, + 112, 1490, 1491, 4148, 1764, 112, 2964, 2410, 1764, 1492, + 1720, 111, 1714, 110, 3657, 4054, 111, 2630, 110, 3943, + 1764, 105, 1764, 3665, 1492, 2892, 3931, 3657, 1764, 2892, + 3655, 2354, 2622, 2440, 2360, 2361, 4146, 1764, 2557, 1764, + 4144, 1764, 1492, 3578, 1764, 105, 1492, 2939, 1764, 106, + 2355, 107, 4013, 1764, 2798, 1764, 3309, 3308, 3306, 3307, + 1489, 2621, 1490, 1491, 1489, 2579, 1490, 1491, 2357, 2578, + 2470, 106, 2429, 107, 3304, 3305, 2889, 3290, 2390, 2402, + 2414, 3294, 2122, 2391, 1492, 2069, 1764, 2939, 3293, 1492, + 105, 1764, 3003, 1489, 1492, 1490, 1491, 1489, 2035, 1490, + 1491, 4011, 1764, 3304, 3303, 2442, 1113, 2918, 1764, 1489, + 1764, 1490, 1491, 2640, 3025, 2940, 4008, 1764, 1875, 3006, + 2999, 3000, 3295, 2378, 2396, 2942, 2397, 3291, 2892, 2891, + 1063, 1492, 3292, 2465, 3990, 1764, 2464, 1996, 3545, 1764, + 1113, 1988, 2479, 2480, 2481, 2482, 1978, 2474, 1974, 2475, + 2476, 2477, 2478, 2446, 2887, 2940, 2982, 2403, 1489, 1970, + 1490, 1491, 1492, 2484, 2500, 2640, 2486, 2487, 2488, 2489, + 2156, 1764, 2405, 1489, 2468, 1490, 1491, 4209, 111, 2546, + 1969, 3538, 1764, 3575, 2506, 1968, 3535, 1764, 1875, 1874, + 2427, 1489, 1784, 1490, 1491, 1489, 1281, 1490, 1491, 2451, + 2452, 2450, 3271, 1492, 1817, 1816, 2469, 2467, 1492, 2917, + 2466, 3241, 2640, 1492, 2910, 2910, 3571, 1098, 1488, 2543, + 1097, 2558, 3571, 3533, 1764, 1492, 4096, 4068, 2516, 1492, + 167, 2892, 2918, 1489, 1153, 1490, 1491, 179, 1489, 3524, + 1490, 1491, 1492, 1489, 1914, 1490, 1491, 3306, 3214, 2453, + 2501, 3574, 1488, 1492, 3496, 1764, 2497, 1492, 2798, 2551, + 2515, 2701, 2554, 2520, 2555, 2519, 2704, 2490, 2492, 2493, + 2918, 2700, 2571, 1051, 1492, 2557, 2540, 2422, 187, 1492, + 1489, 2664, 1490, 1491, 2409, 2557, 2501, 2550, 2553, 2549, + 1492, 2918, 3571, 1768, 1152, 3494, 1764, 1492, 2381, 2156, + 3490, 1764, 2572, 2094, 2575, 3487, 1764, 2078, 2576, 2577, + 2021, 1489, 1804, 1490, 1491, 1135, 1134, 3485, 1764, 1765, + 1767, 3483, 1764, 95, 97, 168, 173, 170, 176, 177, + 178, 180, 182, 183, 184, 185, 4174, 4115, 3954, 2645, + 1771, 186, 188, 189, 190, 3481, 1764, 3920, 1050, 1050, + 1050, 1492, 1489, 2582, 1490, 1491, 95, 1489, 1492, 1490, + 1491, 3780, 1489, 3622, 1490, 1491, 3479, 1764, 1545, 1492, + 1545, 3477, 1764, 3638, 1489, 3635, 1490, 1491, 1489, 1492, + 1490, 1491, 3475, 1764, 1492, 3616, 2660, 3437, 1492, 3473, + 1764, 1489, 1492, 1490, 1491, 3436, 1492, 1877, 2615, 2499, + 1492, 3377, 1489, 3332, 1490, 1491, 1489, 1949, 1490, 1491, + 3328, 2663, 3007, 2496, 2491, 1492, 2485, 2483, 2003, 1492, + 3623, 3624, 3625, 1489, 1492, 1490, 1491, 1909, 1489, 2357, + 1490, 1491, 1905, 2356, 1873, 123, 3330, 2973, 2974, 1489, + 1492, 1490, 1491, 3471, 1764, 1225, 1489, 3381, 1490, 1491, + 3469, 1764, 2632, 3955, 2673, 3585, 3586, 1492, 2683, 4072, + 2514, 3467, 1764, 2394, 1950, 1951, 1952, 2638, 1492, 3591, + 4230, 3465, 1764, 3590, 4228, 2698, 3463, 1764, 4202, 2071, + 3461, 1764, 4076, 2646, 3459, 1764, 3956, 3995, 3457, 1764, + 1492, 2974, 3443, 1764, 3588, 1492, 2652, 2649, 2650, 2651, + 1489, 3324, 1490, 1491, 1492, 2123, 3323, 1489, 4052, 1490, + 1491, 3419, 1764, 2653, 3322, 2655, 2863, 1764, 1489, 3241, + 1490, 1491, 2986, 2616, 2658, 3260, 2659, 3259, 1489, 1492, + 1490, 1491, 2672, 1489, 1492, 1490, 1491, 1489, 1492, 1490, + 1491, 1489, 1492, 1490, 1491, 1489, 2072, 1490, 1491, 1489, + 3927, 1490, 1491, 3263, 3261, 2676, 1492, 2654, 3264, 3262, + 2861, 1764, 685, 2413, 1489, 1492, 1490, 1491, 1489, 1781, + 1490, 1491, 1492, 1489, 2400, 1490, 1491, 3579, 1065, 2624, + 2625, 1492, 2836, 1764, 2627, 3219, 2842, 2813, 1764, 1489, + 2661, 1490, 1491, 2628, 3218, 4034, 2805, 1764, 3758, 3760, + 1492, 3265, 1786, 2927, 2928, 3567, 1489, 1492, 1490, 1491, + 3228, 2712, 1492, 2830, 3626, 2020, 1034, 1489, 2874, 1490, + 1491, 2796, 1764, 3231, 3233, 2153, 2794, 1764, 3302, 1066, + 2781, 1764, 3234, 2957, 2779, 1764, 748, 1050, 2151, 1489, + 2877, 1490, 1491, 3564, 1489, 1492, 1490, 1491, 2777, 1764, + 2978, 3563, 1492, 1489, 2608, 1490, 1491, 2775, 1764, 2875, + 2199, 1492, 2915, 2916, 2773, 1764, 2607, 3627, 3628, 3629, + 2380, 2440, 2606, 1785, 1050, 2935, 1068, 2200, 1489, 2605, + 1490, 1491, 1492, 1489, 1069, 1490, 1491, 1489, 1492, 1490, + 1491, 1489, 3593, 1490, 1491, 1077, 2878, 2604, 2880, 2771, + 1764, 2603, 2122, 2602, 3540, 1489, 3397, 1490, 1491, 1076, + 2914, 1191, 1190, 1492, 1489, 2973, 1490, 1491, 3745, 3056, + 3744, 1489, 1454, 1490, 1491, 103, 2895, 2119, 2117, 2118, + 1489, 105, 1490, 1491, 42, 104, 2933, 2769, 1764, 3013, + 131, 3569, 105, 2932, 2767, 1764, 2934, 2904, 1732, 1489, + 2865, 1490, 1491, 2765, 1764, 4244, 1489, 103, 1490, 1491, + 1492, 1489, 2990, 1490, 1491, 2885, 2619, 104, 1492, 4151, + 1775, 4053, 2893, 3743, 2763, 1764, 1492, 2424, 2425, 1725, + 2761, 1764, 3950, 2953, 2907, 1492, 2890, 2960, 2962, 3011, + 1492, 1945, 3547, 3301, 1489, 2937, 1490, 1491, 1492, 2931, + 3217, 1489, 2406, 1490, 1491, 2759, 1764, 2941, 3216, 2644, + 1489, 2944, 1490, 1491, 2506, 1492, 2077, 112, 2076, 110, + 2194, 2951, 2954, 1492, 4019, 2195, 3022, 4018, 111, 111, + 110, 1489, 3998, 1490, 1491, 3766, 3764, 1489, 105, 1490, + 1491, 2965, 3755, 2976, 1946, 1947, 1948, 3763, 2979, 2980, + 3756, 1492, 2757, 1764, 3636, 3568, 3566, 3333, 2975, 2541, + 2755, 1764, 1489, 2257, 1490, 1491, 1492, 1892, 2753, 1764, + 2983, 1492, 2984, 1075, 2987, 2988, 2989, 2751, 1764, 3557, + 3019, 112, 2749, 1764, 1492, 112, 3729, 1897, 2910, 2889, + 2747, 1764, 111, 3120, 3066, 3067, 111, 2702, 110, 2392, + 1492, 3008, 3009, 4232, 4231, 1492, 1798, 2742, 1764, 1489, + 1790, 1490, 1491, 116, 117, 3536, 3018, 1489, 4232, 1490, + 1491, 1492, 4231, 4040, 3602, 1489, 1492, 1490, 1491, 3086, + 2091, 3, 2089, 10, 1489, 9, 1490, 1491, 99, 1489, + 1492, 1490, 1491, 2340, 3640, 2090, 1492, 1489, 8, 1490, + 1491, 3064, 3045, 1492, 1, 3083, 1042, 1457, 2738, 1764, + 1456, 1492, 3606, 3502, 1489, 3048, 1490, 1491, 4163, 701, + 2382, 1730, 1489, 2372, 1490, 1491, 2736, 1764, 4203, 3101, + 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 4159, + 1765, 2379, 2729, 1764, 4160, 1989, 1492, 2727, 1764, 3118, + 1489, 1979, 1490, 1491, 3668, 2308, 3951, 3020, 1492, 3084, + 3336, 2547, 3634, 3498, 2504, 1489, 1143, 1490, 1491, 2969, + 1489, 156, 1490, 1491, 2462, 2463, 4128, 120, 1101, 119, + 1492, 2404, 3434, 1489, 1146, 1490, 1491, 1254, 3433, 2542, + 3658, 2958, 2471, 1823, 1821, 3425, 1822, 3068, 1820, 1489, + 1492, 1490, 1491, 3423, 1489, 3085, 1490, 1491, 1825, 3122, + 1824, 3160, 3178, 3162, 3054, 4100, 3405, 3055, 2703, 3503, + 1489, 2082, 1490, 1491, 2998, 1489, 738, 1490, 1491, 3173, + 3174, 3175, 3176, 2930, 732, 194, 1812, 3065, 2859, 1489, + 1791, 1490, 1491, 2075, 1185, 1489, 3196, 1490, 1491, 691, + 2858, 3310, 1489, 2580, 1490, 1491, 3185, 697, 1542, 2070, + 1489, 3215, 1490, 1491, 2945, 3187, 1492, 1095, 1087, 2393, + 2440, 2879, 2854, 3111, 1492, 1094, 3928, 3249, 1492, 3561, + 3227, 3229, 2897, 2343, 3232, 2343, 3158, 3225, 2345, 4033, + 2345, 3757, 2853, 2518, 3248, 1489, 87, 1490, 1491, 2440, + 2440, 2440, 2440, 2440, 1492, 4113, 2955, 1489, 1787, 1490, + 1491, 3196, 3168, 3169, 3170, 3171, 3172, 3523, 2675, 2440, + 2189, 1532, 2440, 763, 3253, 2439, 3186, 934, 3188, 1489, + 1773, 1490, 1491, 3724, 2109, 3223, 3195, 761, 760, 1492, + 758, 3270, 2442, 2881, 2911, 1496, 1495, 969, 2869, 1489, + 3213, 1490, 1491, 3208, 3210, 3212, 3207, 1799, 2852, 2922, + 1492, 2920, 2919, 2617, 2031, 1492, 2851, 3222, 1053, 3220, + 2850, 2442, 2442, 2442, 2442, 2442, 1492, 2447, 3235, 3236, + 1492, 3587, 3583, 4155, 3272, 3353, 2441, 3273, 2437, 2888, + 920, 2442, 3252, 919, 2442, 3361, 2849, 3255, 3256, 3254, + 3258, 770, 3257, 3266, 1054, 762, 1055, 106, 1492, 107, + 752, 983, 1492, 3274, 918, 1489, 917, 1490, 1491, 3363, + 3221, 3364, 3280, 1489, 3028, 1490, 1491, 1489, 1492, 1490, + 1491, 2840, 1492, 3378, 3311, 3030, 3313, 2956, 3374, 3312, + 3238, 1473, 1492, 2923, 2926, 2927, 2928, 2924, 1749, 2925, + 2929, 1752, 2839, 1489, 2401, 1490, 1491, 2838, 1114, 3314, + 3315, 3402, 4059, 3365, 3362, 3334, 2506, 3355, 2837, 3366, + 2643, 3431, 2834, 1748, 4066, 3344, 3372, 3652, 3325, 3004, + 2534, 1492, 69, 46, 4028, 4097, 1492, 912, 1489, 909, + 1490, 1491, 3726, 1492, 3727, 3392, 3244, 3390, 3728, 3181, + 2829, 3244, 3182, 4079, 2822, 4080, 908, 3400, 3393, 1489, + 4081, 1490, 1491, 2246, 1489, 1467, 1490, 1491, 3410, 1464, + 2821, 4176, 2084, 98, 2820, 1489, 36, 1490, 1491, 1489, + 35, 1490, 1491, 34, 2819, 33, 32, 3426, 3427, 3428, + 3429, 3430, 26, 3407, 3408, 25, 3409, 24, 23, 3411, + 22, 3413, 29, 3415, 19, 21, 20, 1489, 18, 1490, + 1491, 1489, 3347, 1490, 1491, 4198, 4243, 125, 55, 52, + 1545, 50, 2662, 2818, 1545, 133, 2667, 1489, 2817, 1490, + 1491, 1489, 132, 1490, 1491, 2816, 3335, 53, 49, 1228, + 3548, 1489, 3550, 1490, 1491, 47, 96, 31, 30, 2670, + 17, 2671, 16, 3518, 15, 14, 13, 2679, 12, 11, + 3522, 2681, 2682, 7, 6, 39, 38, 37, 28, 27, + 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, + 1489, 2699, 1490, 1491, 40, 1489, 4, 1490, 1491, 2991, + 3247, 2536, 1489, 3401, 1490, 1491, 0, 0, 0, 0, + 0, 0, 2440, 0, 2705, 2706, 2707, 2708, 1726, 2710, + 2711, 3549, 2713, 3551, 0, 3600, 2715, 3558, 3553, 0, + 2720, 2721, 3565, 2722, 0, 0, 2725, 2726, 2728, 2730, + 2731, 2732, 2733, 2734, 2735, 2737, 2739, 2740, 2741, 2743, + 3356, 2745, 2746, 2748, 2750, 2752, 2754, 2756, 2758, 2760, + 2762, 2764, 2766, 2768, 2770, 2772, 2774, 2776, 2778, 2780, + 2782, 2783, 2784, 750, 2786, 3592, 2788, 3595, 2790, 2791, + 3589, 2793, 2795, 2797, 2442, 3570, 3525, 2800, 3527, 3528, + 3529, 2804, 0, 3365, 3362, 2809, 2810, 2811, 2812, 3366, + 1733, 3601, 3594, 3395, 3396, 0, 0, 1492, 2823, 2824, + 2825, 2826, 2827, 2828, 3555, 1492, 2832, 2833, 0, 3662, + 3663, 0, 0, 0, 2835, 3617, 0, 3619, 1492, 2841, + 0, 0, 1492, 0, 2844, 2845, 2846, 2847, 2848, 0, + 3611, 3612, 1492, 0, 0, 2855, 2856, 3582, 2857, 1492, + 0, 2860, 2862, 2404, 1492, 2864, 0, 0, 1492, 683, + 0, 0, 1492, 0, 0, 2876, 3596, 3597, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1492, 0, 1037, + 0, 3664, 0, 0, 1074, 2894, 1492, 1080, 1080, 0, + 1492, 0, 3645, 0, 1492, 0, 3649, 3650, 3651, 2815, + 0, 0, 0, 0, 0, 1492, 0, 2814, 2923, 2926, + 2927, 2928, 2924, 0, 2925, 2929, 0, 0, 3585, 3586, + 2808, 0, 0, 1109, 2807, 0, 0, 0, 0, 1492, + 3680, 0, 0, 0, 2806, 1492, 0, 0, 0, 3691, + 1492, 2803, 0, 0, 0, 0, 2802, 0, 1492, 0, + 2801, 0, 1492, 0, 2799, 0, 1489, 0, 1490, 1491, + 1492, 0, 0, 0, 1489, 0, 1490, 1491, 3713, 2792, + 1492, 3732, 0, 3733, 3734, 3735, 0, 1489, 2789, 1490, + 1491, 1489, 2787, 1490, 1491, 1492, 2785, 3742, 0, 0, + 3749, 1489, 3751, 1490, 1491, 0, 0, 2744, 1489, 0, + 1490, 1491, 0, 1489, 3722, 1490, 1491, 1489, 0, 1490, + 1491, 1489, 0, 1490, 1491, 3248, 0, 3752, 87, 0, + 3248, 2724, 3685, 0, 0, 0, 1489, 2723, 1490, 1491, + 0, 0, 2719, 0, 0, 1489, 2153, 1490, 1491, 1489, + 2717, 1490, 1491, 1489, 2709, 1490, 1491, 0, 0, 2151, + 0, 3782, 2680, 3753, 1489, 3772, 1490, 1491, 3762, 3761, + 0, 0, 2674, 0, 0, 0, 3774, 3769, 0, 3771, + 0, 0, 0, 0, 0, 3641, 3642, 2669, 1489, 0, + 1490, 1491, 0, 0, 1489, 3934, 1490, 1491, 0, 1489, + 42, 1490, 1491, 0, 0, 0, 3786, 1489, 0, 1490, + 1491, 1489, 0, 1490, 1491, 0, 0, 0, 0, 1489, + 0, 1490, 1491, 0, 0, 0, 0, 0, 0, 1489, + 0, 1490, 1491, 0, 0, 0, 0, 3926, 3925, 0, + 3953, 3941, 0, 0, 1489, 0, 1490, 1491, 3924, 0, + 0, 3946, 3945, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1754, 0, 0, 0, 0, 3096, 3097, + 3098, 3099, 3100, 3992, 2153, 3993, 3776, 1762, 0, 0, + 1755, 3750, 0, 0, 0, 0, 0, 2151, 3115, 3996, + 0, 0, 0, 0, 0, 0, 0, 0, 3783, 3784, + 0, 0, 3936, 3937, 3938, 2398, 2399, 1761, 1759, 1760, + 1756, 0, 1757, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4041, 3248, 3244, 3999, 3778, 0, 0, + 4002, 0, 0, 0, 0, 1758, 4032, 0, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, - 1575, 1576, 1577, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, @@ -2087,698 +2095,695 @@ var yyAct = [...]int{ 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 1656, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, - 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1679, 1680, 1681, - 1682, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, - 1705, 1706, 1707, 1708, 1709, 3243, 3993, 4038, 4022, 4012, - 3243, 4021, 0, 1488, 0, 0, 4018, 3082, 4020, 4056, - 0, 0, 2919, 2922, 2923, 2924, 2920, 0, 2921, 2925, - 0, 3925, 3581, 3582, 0, 0, 0, 87, 0, 1750, - 3246, 0, 0, 0, 0, 0, 0, 4041, 0, 1750, - 0, 4040, 0, 1758, 0, 0, 1751, 0, 3264, 0, - 0, 0, 0, 1758, 4058, 4045, 1751, 0, 0, 0, - 4061, 0, 0, 0, 0, 3929, 0, 0, 0, 0, - 4063, 2394, 2395, 1757, 1755, 1756, 1752, 0, 1753, 0, - 0, 1746, 1747, 1757, 1755, 1756, 1752, 0, 1753, 0, - 0, 0, 0, 0, 0, 2665, 0, 0, 0, 0, - 0, 1754, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1754, 0, 0, 0, 4081, 0, 0, 4082, 0, - 0, 1225, 0, 1231, 42, 4106, 0, 0, 0, 0, - 87, 0, 0, 0, 0, 0, 0, 0, 4091, 3156, - 0, 3158, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4100, 1485, 0, 1486, 1487, 0, 3169, 3170, 3171, - 3172, 0, 0, 4042, 0, 1489, 4112, 0, 4137, 4115, - 4123, 4120, 4117, 4110, 4116, 0, 3395, 3949, 4126, 4114, - 4119, 4118, 0, 0, 0, 1459, 0, 0, 4145, 0, - 0, 0, 0, 0, 3243, 0, 1547, 4150, 3412, 3413, - 0, 3414, 3416, 3418, 0, 4168, 0, 0, 0, 0, - 0, 0, 4158, 4163, 0, 0, 0, 0, 0, 0, - 0, 4178, 4176, 0, 0, 4137, 0, 42, 4189, 3431, - 0, 0, 0, 0, 3434, 0, 3436, 3437, 3438, 3440, - 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, - 3451, 3452, 3454, 3456, 3458, 3460, 3462, 3464, 3466, 3468, - 3470, 3472, 3474, 3476, 3478, 3480, 3482, 3484, 3485, 3487, - 3488, 3489, 3491, 4209, 4212, 3493, 4193, 3495, 3496, 3497, - 2027, 4221, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, - 3509, 3510, 3511, 2149, 4222, 4225, 2147, 4223, 4233, 4219, - 4218, 3517, 4137, 4047, 4208, 3522, 4188, 4102, 4107, 3526, - 3527, 4241, 3528, 3530, 0, 3533, 3535, 4249, 3537, 3538, - 3539, 3540, 4247, 0, 0, 3240, 0, 0, 3548, 0, - 1028, 0, 0, 2343, 0, 0, 1029, 4066, 4258, 4259, - 3989, 4257, 0, 0, 0, 0, 2148, 0, 0, 0, - 0, 2149, 4256, 4054, 2147, 0, 0, 0, 0, 0, - 0, 0, 0, 3572, 3573, 0, 0, 3577, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4184, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4101, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 0, 0, 0, - 0, 0, 3652, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1785, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3671, 0, 0, - 3675, 0, 0, 0, 1797, 0, 0, 1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1814, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3688, 0, 0, 4206, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1722, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 961, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3711, 0, - 0, 0, 0, 0, 0, 0, 1955, 0, 0, 0, - 0, 3719, 0, 0, 0, 0, 0, 0, 3726, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, - 197, 2000, 0, 197, 0, 0, 0, 732, 0, 0, - 0, 0, 738, 0, 0, 0, 0, 0, 2028, 0, - 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2039, 0, 0, 0, 0, 197, - 0, 2043, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 0, - 0, 0, 0, 0, 0, 0, 738, 197, 738, 0, + 1656, 1657, 1658, 1659, 1660, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, + 1677, 1683, 1684, 1685, 1686, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 3997, + 4042, 3247, 4026, 4016, 4025, 0, 3247, 0, 1754, 4045, + 4022, 0, 4024, 4060, 0, 0, 0, 0, 0, 0, + 0, 3929, 1762, 0, 0, 1755, 0, 0, 0, 0, + 3250, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 4044, 0, 0, 0, 1726, 0, 0, 0, 3268, 0, + 1750, 1751, 1761, 1759, 1760, 1756, 4062, 1757, 4049, 0, + 0, 0, 4065, 0, 0, 0, 0, 0, 0, 0, + 0, 3933, 0, 0, 0, 0, 0, 0, 0, 4067, + 1758, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4074, 0, 0, 42, 0, 0, 0, 0, 4084, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1229, 4085, 1235, 0, 4086, 0, 0, 0, 4110, + 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4095, 0, 0, 4104, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4046, 0, 1493, 0, 0, 0, 0, + 1726, 3953, 4130, 4141, 4127, 4119, 3399, 4124, 4121, 4120, + 4118, 4123, 4114, 4122, 4116, 1463, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1551, 0, 3416, 3417, + 3247, 3418, 3420, 3422, 4149, 4172, 42, 0, 4162, 0, + 0, 0, 0, 0, 4154, 4167, 0, 0, 0, 0, + 0, 0, 0, 4180, 0, 0, 0, 0, 0, 3435, + 4141, 4182, 4193, 0, 3438, 0, 3440, 3441, 3442, 3444, + 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 3455, 3456, 3458, 3460, 3462, 3464, 3466, 3468, 3470, 3472, + 3474, 3476, 3478, 3480, 3482, 3484, 3486, 3488, 3489, 3491, + 3492, 3493, 3495, 4197, 4216, 3497, 4192, 3499, 3500, 3501, + 4111, 2153, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, + 3513, 3514, 3515, 4222, 2151, 4229, 4226, 4227, 4225, 4223, + 2031, 3521, 4213, 4051, 4212, 3526, 4106, 4141, 4237, 3530, + 3531, 0, 3532, 3534, 0, 3537, 3539, 4251, 3541, 3542, + 3543, 3544, 0, 4253, 3244, 4245, 0, 0, 3552, 0, + 1032, 0, 0, 2347, 0, 0, 1033, 4070, 0, 2153, + 0, 0, 4261, 0, 0, 0, 2152, 4262, 4263, 0, + 3993, 0, 2151, 0, 4260, 0, 0, 0, 0, 4058, + 0, 0, 0, 3576, 3577, 0, 0, 3581, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4188, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4196, 0, 0, 0, 0, 0, 0, 0, 0, 1841, + 0, 0, 0, 0, 4105, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, + 0, 0, 3656, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1789, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, + 3679, 0, 0, 0, 1801, 0, 0, 1878, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1818, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3692, 0, 0, 4210, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3715, 0, + 0, 0, 0, 0, 0, 0, 1959, 0, 0, 0, + 0, 3723, 0, 0, 0, 0, 0, 0, 3730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3938, 0, 0, - 0, 0, 0, 0, 0, 0, 3945, 0, 0, 0, + 0, 0, 0, 0, 0, 2036, 197, 0, 0, 197, + 1842, 2004, 0, 736, 0, 0, 0, 0, 742, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2032, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3955, 3956, 3957, 0, - 3959, 0, 3960, 3961, 0, 0, 0, 0, 3964, 3965, - 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, - 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, - 0, 3987, 3990, 0, 0, 0, 3709, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3999, 4000, 4001, - 4002, 4003, 4005, 4006, 4008, 4010, 4011, 4013, 0, 0, - 0, 4017, 0, 0, 0, 4019, 0, 0, 0, 0, + 0, 0, 0, 0, 2043, 197, 0, 0, 0, 0, + 0, 2047, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 0, + 0, 0, 742, 197, 742, 0, 1855, 1858, 1859, 1860, + 1861, 1862, 1863, 0, 1864, 1865, 1867, 1868, 1866, 1869, + 1870, 1843, 1844, 1845, 1846, 1826, 1827, 1856, 0, 1829, + 0, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, + 0, 0, 1839, 1847, 1848, 1849, 1850, 3942, 1851, 1852, + 1853, 1854, 0, 0, 1840, 0, 3949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3959, 3960, 3961, 0, + 3963, 0, 3964, 3965, 0, 0, 0, 0, 3968, 3969, + 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, + 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, + 0, 3991, 3994, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4003, 4004, 4005, + 4006, 4007, 4009, 4010, 4012, 4014, 4015, 4017, 0, 0, + 0, 4021, 0, 0, 0, 4023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4046, 0, 2100, 2101, 2102, 2103, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2093, 0, 0, 2116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4050, 0, 2104, 2105, 2106, 2107, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2097, 0, 0, 2120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2155, 2156, 0, 0, 0, 0, 2179, - 0, 0, 2183, 2184, 0, 0, 0, 2189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, - 2209, 2210, 0, 2212, 0, 0, 0, 2234, 2235, 2236, - 2237, 2238, 2239, 2240, 2241, 2243, 0, 2248, 0, 2250, - 2251, 2252, 0, 2254, 2255, 2256, 0, 2258, 2259, 2260, - 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, - 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, - 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, - 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, - 2301, 2302, 2303, 2307, 2308, 2309, 2310, 2311, 2312, 2313, - 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, - 2324, 2325, 2326, 2327, 2328, 2329, 0, 0, 0, 0, - 0, 2335, 0, 2337, 4028, 2344, 2345, 2346, 2347, 2348, - 2349, 0, 0, 0, 0, 0, 0, 4071, 0, 0, - 0, 0, 0, 0, 2360, 2361, 2362, 2363, 2364, 2365, - 2366, 2367, 0, 2369, 2370, 2371, 2372, 2373, 0, 0, - 0, 4086, 0, 0, 0, 0, 0, 4089, 0, 4090, + 0, 0, 0, 2159, 2160, 0, 0, 0, 0, 2183, + 0, 0, 2187, 2188, 0, 0, 0, 2193, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1857, + 0, 0, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, + 2213, 2214, 0, 2216, 0, 0, 0, 2238, 2239, 2240, + 2241, 2242, 2243, 2244, 2245, 2247, 0, 2252, 0, 2254, + 2255, 2256, 0, 2258, 2259, 2260, 0, 2262, 2263, 2264, + 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, + 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, + 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, + 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2311, 2312, 2313, 2314, 2315, 2316, 2317, + 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, + 2328, 2329, 2330, 2331, 2332, 2333, 0, 0, 0, 0, + 0, 2339, 0, 2341, 0, 2348, 2349, 2350, 2351, 2352, + 2353, 0, 0, 0, 0, 0, 0, 4075, 0, 0, + 0, 0, 0, 0, 2364, 2365, 2366, 2367, 2368, 2369, + 2370, 2371, 0, 2373, 2374, 2375, 2376, 2377, 0, 0, + 0, 4090, 0, 0, 0, 0, 0, 4093, 0, 4094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4105, 1076, 0, 0, 0, 0, 0, 0, + 0, 0, 4109, 1080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 4131, 4132, - 0, 0, 0, 0, 0, 0, 0, 4192, 1892, 2416, - 2417, 0, 4139, 4141, 4143, 0, 1837, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 4135, 4136, + 0, 0, 0, 0, 0, 0, 0, 0, 2997, 2420, + 2421, 0, 4143, 4145, 4147, 0, 0, 0, 0, 0, 131, 0, 153, 0, 0, 0, 0, 0, 0, 0, - 4149, 0, 192, 0, 0, 2455, 174, 0, 0, 0, - 0, 2422, 4171, 0, 0, 0, 0, 0, 0, 2426, - 0, 2429, 0, 0, 2093, 131, 0, 153, 0, 0, + 4153, 0, 192, 0, 0, 2459, 174, 0, 0, 0, + 0, 2426, 4175, 0, 0, 0, 0, 0, 0, 2430, + 0, 2433, 0, 0, 2097, 131, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 174, 0, 0, 0, 0, 152, 0, 0, 0, - 4190, 0, 1722, 0, 0, 0, 0, 0, 0, 0, - 0, 197, 0, 197, 0, 0, 171, 2498, 0, 172, + 4194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 197, 0, 0, 171, 2502, 0, 172, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, - 0, 152, 0, 0, 4213, 4215, 4217, 0, 0, 0, - 0, 1896, 1897, 163, 162, 191, 0, 0, 0, 0, - 738, 171, 738, 738, 172, 0, 0, 0, 4070, 0, - 0, 0, 0, 0, 0, 0, 4080, 4238, 0, 0, - 0, 0, 0, 0, 738, 197, 140, 141, 163, 162, - 191, 0, 0, 0, 0, 4250, 4251, 0, 0, 0, - 0, 0, 0, 1824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1533, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1722, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 157, 1898, 160, - 0, 1895, 0, 158, 159, 0, 0, 0, 0, 0, - 175, 0, 0, 0, 0, 0, 0, 0, 0, 181, - 0, 0, 0, 0, 2093, 0, 0, 1838, 0, 0, - 0, 2588, 157, 138, 160, 145, 137, 0, 158, 159, - 0, 0, 2609, 2610, 0, 175, 2614, 0, 0, 0, - 0, 0, 0, 0, 181, 146, 0, 0, 2619, 0, - 0, 0, 0, 0, 0, 2622, 0, 0, 0, 149, - 147, 142, 143, 144, 148, 0, 0, 0, 0, 0, + 0, 152, 0, 0, 4217, 4219, 4221, 0, 0, 0, + 0, 1900, 1901, 163, 162, 191, 0, 0, 0, 0, + 742, 171, 742, 742, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4242, 0, 0, + 0, 0, 0, 0, 742, 197, 140, 141, 163, 162, + 191, 0, 0, 0, 0, 4254, 4255, 0, 0, 0, + 0, 0, 0, 0, 86, 44, 45, 88, 0, 0, + 0, 0, 0, 1537, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 0, 0, 0, 48, 76, 77, + 0, 74, 78, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 157, 1902, 160, + 1032, 1899, 0, 158, 159, 0, 1033, 0, 0, 0, + 175, 0, 0, 0, 0, 62, 2152, 0, 0, 181, + 0, 0, 0, 0, 2097, 0, 0, 95, 0, 0, + 0, 2592, 157, 138, 160, 145, 137, 0, 158, 159, + 0, 0, 2613, 2614, 0, 175, 2618, 0, 0, 0, + 0, 0, 0, 0, 181, 146, 0, 0, 2623, 0, + 0, 0, 0, 0, 0, 2626, 0, 0, 0, 149, + 147, 142, 143, 144, 148, 0, 0, 83, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, - 150, 2625, 0, 1851, 1854, 1855, 1856, 1857, 1858, 1859, - 0, 1860, 1861, 1863, 1864, 1862, 1865, 1866, 1839, 1840, - 1841, 1842, 1822, 1823, 1852, 0, 1825, 0, 1826, 1827, - 1828, 1829, 1830, 1831, 1832, 1833, 1834, 0, 0, 1835, - 1843, 1844, 1845, 1846, 0, 1847, 1848, 1849, 1850, 0, - 0, 1836, 0, 0, 0, 0, 0, 0, 166, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 2629, 0, 0, 0, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 166, 0, 2674, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2680, 2681, 2682, 2683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, - 738, 738, 0, 0, 0, 0, 0, 1837, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, - 1547, 0, 0, 0, 161, 0, 0, 0, 0, 0, + 0, 0, 51, 54, 57, 56, 59, 0, 73, 0, + 0, 82, 79, 166, 0, 2678, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2684, 2685, 2686, 2687, 0, + 0, 0, 0, 0, 0, 61, 91, 90, 0, 0, + 71, 72, 58, 0, 0, 0, 197, 0, 80, 81, + 742, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1841, 0, 0, 0, 197, + 1551, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 197, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 738, 0, 0, 161, - 0, 0, 0, 197, 0, 0, 0, 738, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, + 0, 742, 63, 64, 197, 65, 66, 67, 68, 0, + 0, 0, 0, 0, 0, 0, 742, 0, 0, 161, + 0, 0, 0, 197, 0, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 738, 0, 738, 0, 0, 0, 0, 0, 0, 0, - 738, 0, 0, 1533, 738, 0, 0, 738, 738, 738, - 738, 0, 738, 0, 738, 738, 1853, 738, 738, 738, - 738, 738, 738, 154, 0, 0, 155, 0, 0, 0, - 1533, 738, 738, 1533, 738, 1533, 197, 738, 0, 0, + 742, 0, 742, 0, 0, 0, 0, 0, 0, 60, + 742, 0, 0, 1537, 742, 0, 0, 742, 742, 742, + 742, 0, 742, 0, 742, 742, 0, 742, 742, 742, + 742, 742, 742, 154, 0, 0, 155, 0, 0, 0, + 1537, 742, 742, 1537, 742, 1537, 197, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1824, 0, 197, 167, 154, 0, - 0, 155, 0, 0, 179, 0, 0, 0, 0, 738, + 0, 0, 0, 0, 0, 0, 197, 167, 154, 0, + 0, 155, 1828, 0, 179, 0, 0, 0, 0, 742, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 738, 0, 0, 738, 1785, 197, 197, 0, + 0, 0, 742, 0, 0, 742, 1789, 197, 197, 89, 0, 0, 167, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 197, 187, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 738, - 0, 0, 0, 0, 0, 0, 2932, 0, 1838, 0, - 187, 0, 0, 0, 0, 0, 0, 0, 168, 173, - 170, 176, 177, 178, 180, 182, 183, 184, 185, 0, - 0, 0, 0, 0, 186, 188, 189, 190, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 168, 173, 170, 176, 177, 178, 180, - 182, 183, 184, 185, 0, 0, 0, 0, 0, 186, - 188, 189, 190, 0, 1851, 1854, 1855, 1856, 1857, 1858, - 1859, 2981, 1860, 1861, 1863, 1864, 1862, 1865, 1866, 1839, - 1840, 1841, 1842, 1822, 1823, 1852, 0, 1825, 0, 1826, - 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 0, 0, - 1835, 1843, 1844, 1845, 1846, 0, 1847, 1848, 1849, 1850, - 0, 0, 1836, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3029, 3030, 3031, - 3032, 3033, 3034, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, - 738, 0, 0, 0, 0, 0, 2093, 3045, 0, 3057, - 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 742, + 0, 0, 0, 0, 0, 0, 2936, 0, 0, 0, + 187, 0, 0, 0, 0, 0, 1842, 0, 0, 0, + 0, 0, 168, 173, 170, 176, 177, 178, 180, 182, + 183, 184, 185, 0, 0, 0, 0, 0, 186, 188, + 189, 190, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 168, 173, 170, + 176, 177, 178, 180, 182, 183, 184, 185, 0, 94, + 0, 0, 0, 186, 188, 189, 190, 0, 0, 0, + 0, 2985, 1855, 1858, 1859, 1860, 1861, 1862, 1863, 0, + 1864, 1865, 1867, 1868, 1866, 1869, 1870, 1843, 1844, 1845, + 1846, 1826, 1827, 1856, 0, 1829, 0, 1830, 1831, 1832, + 1833, 1834, 1835, 1836, 1837, 1838, 0, 0, 1839, 1847, + 1848, 1849, 1850, 0, 1851, 1852, 1853, 1854, 0, 0, + 1840, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3033, 3034, 3035, + 3036, 3037, 3038, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 742, 0, 0, 0, 0, 0, 2097, 3049, 0, 3061, + 70, 0, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, - 0, 3053, 0, 0, 0, 0, 3083, 3084, 3085, 0, - 0, 3087, 0, 0, 3089, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3108, 3109, 3110, 0, 0, 0, - 0, 0, 0, 3115, 0, 738, 0, 0, 3117, 0, - 0, 3119, 3120, 3121, 0, 1533, 917, 3122, 3123, 0, - 0, 3124, 0, 3125, 0, 0, 0, 0, 0, 0, - 3126, 0, 3127, 1533, 0, 0, 3128, 0, 3129, 0, - 0, 3130, 0, 3131, 0, 3132, 0, 3133, 0, 3134, - 0, 3135, 0, 3136, 0, 3137, 0, 3138, 0, 3139, - 0, 3140, 0, 3141, 0, 3142, 0, 3143, 0, 3144, - 0, 3145, 0, 3146, 0, 3147, 0, 0, 0, 3148, - 0, 3149, 0, 3150, 736, 0, 3151, 1853, 3152, 0, - 3153, 0, 2307, 3155, 0, 0, 3157, 0, 0, 3159, - 3160, 3161, 3162, 0, 0, 0, 0, 3163, 2307, 2307, - 2307, 2307, 2307, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3173, 0, 0, 0, 0, 0, 0, - 0, 3186, 0, 0, 3190, 0, 0, 0, 1101, 0, - 1108, 0, 0, 3193, 3194, 3195, 3196, 3197, 3198, 0, - 0, 0, 3199, 3200, 0, 3201, 0, 3202, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2354, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1076, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 44, 45, 88, 0, 960, 0, - 0, 0, 0, 0, 3235, 0, 0, 0, 0, 0, - 0, 0, 92, 0, 197, 0, 48, 76, 77, 738, - 74, 78, 0, 0, 0, 0, 0, 0, 0, 3265, - 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 0, 0, 0, 0, 197, - 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, - 715, 0, 0, 0, 62, 0, 737, 0, 0, 0, - 0, 197, 0, 0, 0, 738, 95, 0, 2354, 197, - 0, 197, 0, 197, 197, 0, 0, 0, 0, 3327, - 0, 0, 0, 0, 0, 0, 0, 0, 738, 0, - 0, 0, 0, 0, 0, 0, 0, 3317, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 737, 0, 737, 0, 0, 0, 83, 0, 0, 0, - 0, 0, 0, 3355, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3369, 0, 0, - 0, 0, 0, 0, 0, 0, 738, 0, 0, 0, - 0, 0, 0, 738, 738, 738, 197, 0, 3387, 0, - 0, 3390, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 738, 0, 3420, 0, 0, 0, - 738, 738, 0, 0, 738, 0, 738, 0, 0, 0, - 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3435, 0, 0, 0, 0, 0, - 0, 51, 54, 57, 56, 59, 0, 73, 0, 0, - 82, 79, 0, 0, 0, 0, 0, 738, 0, 0, - 0, 0, 738, 0, 0, 0, 738, 738, 0, 0, - 0, 0, 0, 0, 61, 91, 90, 0, 0, 71, - 72, 58, 0, 0, 0, 0, 0, 80, 81, 0, + 0, 3057, 0, 0, 0, 0, 3087, 3088, 3089, 0, + 0, 3091, 0, 0, 3093, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3112, 3113, 3114, 0, 0, 0, + 0, 0, 0, 3119, 0, 742, 0, 0, 3121, 0, + 0, 3123, 3124, 3125, 0, 1537, 0, 3126, 3127, 0, + 0, 3128, 0, 3129, 0, 0, 0, 0, 0, 0, + 3130, 0, 3131, 1537, 0, 0, 3132, 0, 3133, 0, + 0, 3134, 0, 3135, 0, 3136, 0, 3137, 0, 3138, + 0, 3139, 0, 3140, 0, 3141, 0, 3142, 0, 3143, + 0, 3144, 0, 3145, 0, 3146, 0, 3147, 0, 3148, + 0, 3149, 0, 3150, 0, 3151, 0, 0, 0, 3152, + 0, 3153, 0, 3154, 0, 0, 3155, 0, 3156, 0, + 3157, 0, 2311, 3159, 0, 1857, 3161, 0, 0, 3163, + 3164, 3165, 3166, 0, 0, 0, 0, 3167, 2311, 2311, + 2311, 2311, 2311, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3177, 0, 0, 0, 0, 0, 0, + 0, 3190, 0, 0, 3194, 0, 0, 0, 0, 0, + 0, 0, 0, 3197, 3198, 3199, 3200, 3201, 3202, 0, + 0, 0, 3203, 3204, 0, 3205, 0, 3206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2358, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1080, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 964, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3239, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 0, 0, 0, 0, 742, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, + 0, 0, 742, 0, 0, 0, 719, 0, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 0, 0, 742, 0, 0, 2358, 197, + 0, 197, 0, 197, 197, 0, 0, 0, 0, 3331, + 0, 0, 0, 0, 0, 0, 0, 0, 742, 0, + 0, 0, 0, 0, 0, 0, 0, 3321, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 741, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3359, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3373, 0, 0, + 0, 0, 0, 0, 0, 0, 742, 0, 0, 0, + 0, 0, 0, 742, 742, 742, 197, 0, 3391, 0, + 0, 3394, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 742, 0, 3424, 0, 0, 0, + 742, 742, 0, 0, 742, 0, 742, 0, 0, 0, + 0, 0, 742, 0, 921, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3439, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, + 0, 0, 742, 0, 0, 0, 742, 742, 0, 0, + 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1896, 0, 0, 0, 0, + 0, 0, 740, 0, 0, 0, 0, 131, 0, 153, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, - 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 197, 197, 0, 0, 197, 0, 197, 0, - 0, 63, 64, 0, 65, 66, 67, 68, 197, 0, - 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3550, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 197, 0, 0, 0, 0, 0, 0, 197, 0, - 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1028, 0, 0, 0, 60, 0, - 1029, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2148, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3611, 3633, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1533, 0, 2354, - 0, 3626, 0, 3627, 3628, 3629, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3657, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, - 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, - 1026, 0, 0, 3677, 0, 3678, 0, 3679, 0, 3680, - 0, 0, 0, 0, 0, 0, 0, 3683, 3684, 0, - 0, 0, 1289, 0, 1289, 1289, 0, 3689, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3690, 0, 3691, 0, 3692, 1458, 3693, 0, 3694, - 0, 3695, 0, 3696, 0, 3697, 0, 3698, 0, 3699, - 0, 3700, 0, 3701, 0, 3702, 0, 3703, 94, 3704, - 0, 3705, 0, 0, 3706, 0, 0, 0, 3707, 0, - 3708, 0, 0, 0, 0, 0, 3710, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3727, 0, - 0, 0, 0, 0, 0, 0, 0, 3732, 0, 3733, - 3734, 0, 3735, 0, 3736, 0, 0, 0, 0, 3737, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 197, 0, 0, 0, 3766, 0, 0, 0, - 197, 0, 0, 0, 0, 0, 0, 0, 0, 3775, - 0, 738, 3777, 0, 0, 70, 0, 0, 0, 0, - 0, 0, 0, 0, 3781, 0, 0, 738, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3917, 0, 0, 0, 737, 1444, 737, 737, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 0, 0, 0, 0, 197, 1105, 164, 1112, 0, + 0, 0, 0, 152, 0, 0, 3554, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 0, 171, 0, 0, 172, 0, 197, 0, + 0, 0, 0, 742, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1900, 1901, + 163, 162, 191, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3615, 3637, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1537, 0, 2358, + 0, 3630, 0, 3631, 3632, 3633, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3661, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 157, 1902, 160, 0, 1899, 0, + 158, 159, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 3681, 0, 3682, 0, 3683, 0, 3684, + 0, 0, 0, 0, 0, 0, 0, 3687, 3688, 0, + 0, 0, 0, 0, 0, 0, 0, 3693, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3694, 0, 3695, 0, 3696, 0, 3697, 0, 3698, + 0, 3699, 0, 3700, 0, 3701, 0, 3702, 0, 3703, + 0, 3704, 0, 3705, 0, 3706, 0, 3707, 0, 3708, + 0, 3709, 0, 0, 3710, 0, 0, 0, 3711, 0, + 3712, 0, 0, 0, 0, 0, 3714, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3731, 0, + 0, 0, 0, 0, 0, 0, 0, 3736, 0, 3737, + 3738, 0, 3739, 0, 3740, 166, 0, 0, 0, 3741, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 0, 3770, 0, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 3779, + 0, 742, 3781, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3785, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3921, 0, 0, 0, 741, 1448, 741, 741, 0, 0, 0, 197, 0, 0, 0, 0, 197, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, + 0, 161, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1532, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 738, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 742, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 738, 0, 0, 0, 0, 0, 0, 738, - 0, 0, 0, 738, 738, 0, 0, 0, 738, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4027, - 0, 0, 1732, 1733, 1533, 738, 0, 0, 0, 0, + 0, 0, 742, 0, 0, 0, 0, 0, 0, 742, + 0, 0, 0, 742, 742, 0, 0, 0, 742, 0, + 154, 0, 0, 155, 0, 0, 0, 0, 0, 4031, + 0, 0, 0, 0, 1537, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 197, 197, - 197, 197, 197, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1791, 0, 0, 197, 197, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1809, 918, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1868, - 0, 197, 0, 0, 0, 0, 0, 0, 0, 1877, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, - 0, 0, 1101, 0, 1904, 0, 0, 0, 0, 0, - 0, 0, 1913, 0, 0, 195, 1915, 0, 680, 1918, - 1919, 1921, 1921, 0, 1921, 0, 1921, 1921, 0, 1930, - 1921, 1921, 1921, 1921, 1921, 0, 0, 0, 680, 0, - 0, 0, 0, 1950, 1951, 0, 1101, 738, 0, 1956, - 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1077, 1077, 0, 0, 0, 0, 0, - 0, 1998, 680, 0, 737, 737, 0, 0, 0, 0, - 0, 0, 0, 0, 2020, 0, 0, 2024, 0, 0, - 0, 0, 0, 0, 0, 0, 4069, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 4067, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 737, 1289, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 737, 4083, 0, 0, 4084, 0, 4085, 0, 0, - 0, 737, 738, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 738, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 737, 0, 737, 0, 0, 0, - 0, 0, 0, 0, 737, 0, 0, 1532, 737, 0, - 0, 737, 737, 737, 737, 738, 737, 0, 737, 737, - 0, 737, 737, 737, 737, 737, 737, 0, 0, 0, - 197, 0, 0, 738, 1532, 737, 737, 1532, 737, 1532, - 0, 737, 0, 0, 0, 0, 0, 0, 0, 738, - 0, 0, 0, 1533, 0, 0, 738, 738, 1533, 197, - 197, 197, 197, 197, 0, 0, 0, 0, 0, 4169, - 0, 197, 0, 737, 0, 0, 0, 197, 0, 197, - 0, 0, 197, 197, 197, 0, 737, 0, 0, 737, - 0, 0, 0, 0, 0, 0, 0, 0, 4185, 0, - 4186, 0, 4187, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1289, 1289, 0, 0, 0, 0, 197, 0, 0, - 0, 0, 0, 737, 0, 0, 2081, 0, 0, 0, - 738, 0, 0, 1533, 0, 0, 95, 0, 738, 1028, - 0, 0, 0, 197, 966, 1029, 980, 981, 982, 967, - 0, 0, 968, 969, 0, 970, 0, 197, 0, 0, - 0, 0, 4236, 0, 4237, 0, 0, 0, 0, 0, - 0, 975, 0, 983, 984, 0, 0, 0, 197, 0, - 0, 197, 0, 0, 0, 0, 0, 2143, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3363, 3364, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, - 1021, 1022, 1023, 1024, 1025, 1026, 0, 0, 0, 0, + 197, 197, 197, 0, 167, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 197, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 737, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 738, - 0, 0, 0, 0, 0, 0, 0, 3365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 197, 187, 0, 1293, 0, 1293, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 1462, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, + 173, 170, 176, 177, 178, 180, 182, 183, 184, 185, + 0, 0, 0, 0, 0, 186, 188, 189, 190, 0, + 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4073, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 4071, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 4087, 0, 0, 4088, 0, 4089, 0, 0, + 0, 741, 742, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 742, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 741, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 0, 1536, 741, 0, + 0, 741, 741, 741, 741, 742, 741, 0, 741, 741, + 0, 741, 741, 741, 741, 741, 741, 0, 0, 0, + 197, 0, 0, 742, 1536, 741, 741, 1536, 741, 1536, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 742, + 0, 0, 0, 1537, 0, 0, 742, 742, 1537, 197, + 197, 197, 197, 197, 0, 0, 0, 0, 0, 4173, + 0, 197, 0, 741, 0, 0, 0, 197, 0, 197, + 0, 0, 197, 197, 197, 0, 741, 0, 0, 741, + 0, 0, 0, 0, 0, 0, 0, 0, 4189, 0, + 4190, 0, 4191, 0, 1736, 1737, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, + 742, 0, 0, 1537, 0, 1795, 0, 0, 742, 0, + 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, + 1813, 0, 0, 0, 0, 0, 0, 197, 0, 0, + 0, 1872, 4240, 0, 4241, 0, 0, 0, 0, 0, + 0, 1881, 0, 0, 0, 0, 0, 0, 197, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1105, 0, 1908, 0, 0, 0, + 0, 0, 0, 0, 1917, 0, 0, 0, 1919, 0, + 0, 1922, 1923, 1925, 1925, 0, 1925, 0, 1925, 1925, + 0, 1934, 1925, 1925, 1925, 1925, 1925, 0, 0, 0, + 0, 0, 0, 0, 0, 1954, 1955, 0, 1105, 0, + 0, 1960, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 922, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2002, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2024, 0, 0, 2028, + 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 742, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 684, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, - 0, 1289, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1532, - 0, 0, 0, 0, 0, 0, 0, 0, 2157, 0, - 0, 0, 0, 0, 0, 0, 0, 1532, 3366, 3367, - 0, 2391, 197, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1060, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 0, 0, 1081, 1081, 0, 0, 0, 1536, + 0, 0, 0, 684, 0, 0, 0, 0, 2161, 0, + 0, 0, 0, 0, 0, 0, 0, 1536, 0, 0, + 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 197, 0, 0, 2404, 0, 680, 0, 680, 0, + 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 197, 0, 197, 197, 197, 0, 1791, 0, 0, - 1289, 0, 0, 738, 738, 0, 0, 0, 0, 0, + 0, 197, 0, 197, 197, 197, 0, 0, 0, 0, + 0, 0, 0, 742, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1101, 0, 0, 931, 0, 0, 0, 0, 0, 935, - 0, 0, 0, 932, 933, 0, 0, 0, 934, 936, - 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 738, 738, 738, 738, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, - 0, 0, 0, 737, 0, 0, 0, 0, 1108, 0, - 0, 0, 0, 0, 0, 2519, 2520, 2521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1101, 0, 0, 0, - 0, 0, 1108, 1913, 0, 0, 1913, 0, 1913, 0, - 0, 0, 0, 737, 2552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 1293, 0, 0, 0, 0, 0, + 0, 0, 742, 742, 742, 742, 0, 0, 2085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 737, 0, 0, 1101, - 0, 0, 0, 0, 2143, 0, 0, 0, 2143, 2143, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, - 0, 738, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1533, 0, 0, 0, 197, 0, 0, 738, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 737, 0, 0, 0, 0, 0, 0, 737, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2630, 0, 0, 737, 0, - 0, 0, 0, 0, 737, 737, 0, 0, 737, 0, - 737, 0, 0, 0, 0, 0, 737, 0, 0, 738, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 197, 0, 0, 738, 0, 0, 0, 0, - 0, 680, 0, 0, 0, 0, 0, 0, 738, 0, - 0, 737, 0, 0, 0, 0, 737, 0, 0, 0, - 737, 737, 0, 0, 1056, 0, 0, 0, 0, 0, - 0, 1289, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 680, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, - 738, 0, 738, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, - 0, 0, 0, 0, 0, 1534, 0, 0, 1534, 0, - 1534, 680, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 0, 742, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, + 0, 0, 1537, 0, 0, 0, 197, 0, 0, 742, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 741, 0, 0, 0, 0, 0, 0, 741, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2026, 680, 0, 0, 0, 0, 0, 0, - 0, 1532, 0, 737, 0, 0, 0, 0, 0, 680, - 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, - 0, 0, 0, 0, 0, 2052, 2053, 680, 680, 680, - 680, 680, 680, 680, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 741, 0, + 0, 0, 0, 0, 741, 741, 0, 0, 741, 0, + 741, 0, 0, 0, 0, 0, 741, 0, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2878, 0, 0, 0, 197, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2895, - 0, 0, 0, 0, 0, 738, 197, 0, 0, 0, + 0, 0, 197, 0, 0, 742, 0, 0, 0, 0, + 0, 0, 0, 2395, 0, 0, 0, 0, 742, 0, + 0, 741, 0, 0, 0, 0, 741, 0, 0, 0, + 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1795, + 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1105, 742, 0, 0, 0, 0, 0, 0, + 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 2523, 2524, 2525, + 0, 684, 0, 684, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1105, 0, + 0, 0, 0, 0, 1112, 1917, 0, 0, 1917, 0, + 1917, 0, 0, 0, 0, 0, 2556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1533, 738, 0, 738, 0, 0, 2977, 0, 0, + 0, 1536, 0, 741, 0, 684, 0, 0, 0, 0, + 0, 1105, 0, 0, 0, 0, 2147, 0, 0, 0, + 2147, 2147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 738, - 2354, 0, 0, 0, 2404, 0, 0, 0, 0, 0, - 0, 3001, 0, 0, 0, 1913, 1913, 0, 0, 0, - 3006, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 680, 0, 0, 0, 0, 0, 0, 3017, 0, 0, - 197, 738, 0, 0, 0, 737, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 742, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, - 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 738, 2945, 0, 1534, 0, - 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 738, 0, 738, 0, 0, 2143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2143, - 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, - 0, 0, 0, 737, 0, 0, 0, 737, 737, 0, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1532, 737, + 0, 0, 0, 0, 0, 0, 0, 2634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1537, 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2026, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 742, + 2358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 197, 742, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1972, - 0, 0, 0, 0, 3175, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1077, 1289, 0, 0, 0, - 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1056, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1921, 0, 0, - 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, - 0, 0, 0, 2026, 680, 3220, 680, 0, 680, 2445, - 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1289, 0, 0, 0, 0, 0, 0, 3247, 1921, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, + 0, 0, 0, 0, 0, 742, 2949, 0, 0, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 1060, + 0, 0, 0, 0, 742, 0, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 741, 741, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 1536, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1538, 0, 0, 1538, 0, 1538, 684, 0, 0, 0, + 0, 0, 0, 0, 0, 2882, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1976, 0, 0, 0, + 0, 2899, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2030, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2522, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 2056, 2057, 684, 684, 684, 684, 684, 684, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1101, 0, 0, 0, 0, 0, 0, 0, - 2404, 0, 0, 0, 0, 0, 737, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 741, 0, 0, 0, 0, 0, 0, 0, 2981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, + 0, 0, 0, 3005, 0, 0, 0, 1917, 1917, 0, + 0, 0, 3010, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 0, 0, 0, 1532, 0, 680, - 737, 737, 1532, 0, 0, 0, 680, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 680, 680, 0, - 0, 680, 0, 2616, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, - 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3313, 0, 0, 680, 0, 0, 0, - 0, 0, 0, 2627, 0, 0, 0, 0, 0, 0, - 0, 1868, 0, 0, 737, 0, 0, 1532, 0, 0, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3394, 0, 0, 0, 0, - 0, 0, 1534, 0, 2026, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, + 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 684, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 1536, 0, 0, + 741, 741, 1536, 0, 0, 0, 0, 0, 0, 0, + 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 741, 0, 0, 1536, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1293, 0, + 0, 0, 0, 0, 0, 3398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2404, 2404, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3224, 0, 2030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1293, 0, 0, 0, 0, 0, 0, + 3251, 1925, 0, 0, 0, 0, 0, 0, 0, 95, + 0, 0, 1032, 0, 0, 0, 0, 970, 1033, 984, + 985, 986, 971, 0, 1976, 972, 973, 0, 974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3665, 3666, 3667, 3668, 0, 0, + 1081, 0, 0, 0, 979, 0, 987, 988, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 1060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 1105, 0, 0, 0, 2030, 684, + 0, 684, 2408, 684, 2449, 3367, 3368, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3605, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3369, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3601, 0, 0, 680, 0, 0, - 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 741, 741, 741, 741, + 0, 0, 0, 1872, 0, 0, 0, 0, 0, 0, + 0, 3370, 3371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 684, 684, 0, 0, 684, 0, 2620, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 684, 0, + 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 737, 737, 0, + 0, 0, 0, 0, 0, 0, 935, 0, 0, 0, + 0, 684, 939, 0, 0, 0, 936, 937, 2631, 0, + 0, 938, 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, - 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3743, 0, 3743, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 737, 737, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3771, 0, 3773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2408, 2408, 0, + 0, 0, 0, 741, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1536, 1538, 0, 2030, + 0, 0, 0, 741, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3669, 3670, 3671, 3672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2404, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3940, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1534, - 1289, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 680, 680, 680, 680, 680, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 680, 680, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 0, 737, 680, 0, 0, 0, - 0, 0, 0, 0, 0, 3743, 0, 0, 0, 0, - 0, 0, 3743, 0, 3743, 0, 1532, 0, 0, 0, - 0, 0, 0, 737, 0, 737, 0, 0, 0, 0, + 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, + 0, 0, 0, 0, 741, 0, 741, 0, 0, 0, + 0, 0, 0, 3747, 0, 3747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 3775, 0, 3777, 0, 0, 0, 0, + 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, + 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 684, 0, 0, 3944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2404, 0, 0, 0, 737, 0, 0, - 0, 0, 0, 0, 737, 0, 737, 0, 0, 0, + 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2404, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1077, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, - 0, 0, 0, 1534, 680, 680, 680, 680, 680, 0, - 0, 0, 0, 4087, 0, 0, 3263, 0, 0, 0, - 0, 0, 1972, 4095, 680, 0, 0, 680, 3271, 2026, - 0, 0, 0, 0, 2404, 0, 4103, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3747, 0, 741, + 0, 0, 0, 0, 3747, 0, 3747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1289, 1289, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1534, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 680, 0, - 0, 0, 0, 4153, 0, 0, 0, 0, 0, 0, - 0, 0, 680, 0, 3803, 3805, 3804, 3870, 3871, 3872, - 3873, 3874, 3875, 3876, 3806, 3807, 808, 0, 0, 737, - 0, 0, 0, 680, 0, 0, 680, 0, 0, 0, - 0, 0, 0, 4095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2404, 0, 0, + 0, 0, 0, 0, 1538, 2408, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 684, 684, + 684, 684, 684, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 684, 684, 0, 0, + 0, 0, 0, 0, 0, 1536, 741, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1868, 0, 4153, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1532, 737, 0, 737, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 741, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 737, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2408, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, + 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, - 0, 0, 0, 0, 0, 0, 0, 680, 3811, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, - 737, 0, 0, 3819, 3820, 0, 0, 3895, 3894, 3893, - 0, 0, 3891, 3892, 3890, 0, 680, 0, 0, 0, + 0, 0, 0, 0, 0, 4091, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4099, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2408, 0, 4107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 680, 0, 680, 680, - 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3896, 931, - 0, 784, 785, 3897, 3898, 935, 3899, 787, 788, 932, - 933, 0, 782, 786, 934, 936, 0, 0, 0, 0, + 0, 0, 0, 1293, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1081, 0, + 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4157, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 1538, 684, + 684, 684, 684, 684, 0, 0, 0, 0, 0, 0, + 0, 3267, 0, 0, 0, 0, 0, 1976, 0, 684, + 0, 0, 684, 3275, 2030, 4099, 0, 0, 0, 3807, + 3809, 3808, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3810, + 3811, 812, 0, 0, 0, 0, 0, 0, 0, 2408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 1872, 0, + 4157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3800, 3801, 3802, 3808, 3809, 3810, 3821, 3868, 3869, - 3877, 3879, 887, 3878, 3880, 3881, 3882, 3885, 3886, 3887, - 3888, 3883, 3884, 3889, 3783, 3787, 3784, 3785, 3786, 3798, - 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, - 3799, 3900, 3901, 3902, 3903, 3904, 3905, 3814, 3818, 3817, - 3815, 3816, 3812, 3813, 3840, 3839, 3841, 3842, 3843, 3844, - 3845, 3846, 3848, 3847, 3849, 3850, 3851, 3852, 3853, 3854, - 3822, 3823, 3826, 3827, 3825, 3824, 3828, 3837, 3838, 3829, - 3830, 3831, 3832, 3833, 3834, 3836, 3835, 3855, 3856, 3857, - 3858, 3859, 3861, 3860, 3864, 3865, 3863, 3862, 3867, 3866, + 0, 0, 0, 0, 0, 0, 0, 0, 684, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 937, 0, 938, 0, 0, 942, 0, - 0, 0, 944, 943, 0, 945, 907, 906, 0, 0, - 939, 940, 0, 941, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1534, 0, 0, - 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3906, 3907, - 3908, 3909, 3910, 3911, 3912, 3913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2786,20 +2791,45 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3815, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3823, 3824, + 0, 0, 3899, 3898, 3897, 0, 684, 3895, 3896, 3894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 684, 3900, 935, 0, 788, 789, 3901, 3902, + 939, 3903, 791, 792, 936, 937, 0, 786, 790, 938, + 940, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 684, 0, 684, 684, 684, 3804, 3805, 3806, 3812, + 3813, 3814, 3825, 3872, 3873, 3881, 3883, 891, 3882, 3884, + 3885, 3886, 3889, 3890, 3891, 3892, 3887, 3888, 3893, 3787, + 3791, 3788, 3789, 3790, 3802, 3792, 3793, 3794, 3795, 3796, + 3797, 3798, 3799, 3800, 3801, 3803, 3904, 3905, 3906, 3907, + 3908, 3909, 3818, 3822, 3821, 3819, 3820, 3816, 3817, 3844, + 3843, 3845, 3846, 3847, 3848, 3849, 3850, 3852, 3851, 3853, + 3854, 3855, 3856, 3857, 3858, 3826, 3827, 3830, 3831, 3829, + 3828, 3832, 3841, 3842, 3833, 3834, 3835, 3836, 3837, 3838, + 3840, 3839, 3859, 3860, 3861, 3862, 3863, 3865, 3864, 3868, + 3869, 3867, 3866, 3871, 3870, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 941, 0, + 942, 0, 0, 946, 0, 0, 0, 948, 947, 0, + 949, 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3910, 3911, 3912, + 3913, 3914, 3915, 3916, 3917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1538, 0, 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2807,9 +2837,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2817,4496 +2846,4548 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1972, 0, 0, 399, 0, - 0, 0, 0, 0, 0, 1427, 1411, 531, 0, 1353, - 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, - 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, - 1372, 1429, 369, 270, 1301, 1292, 206, 508, 1326, 433, - 1342, 205, 1392, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 1436, 373, 1378, - 0, 500, 404, 0, 0, 2026, 1417, 1416, 1347, 1357, - 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, - 1432, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 4127, 510, 962, 0, 0, 0, 0, 4128, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 1334, 1384, 612, 1426, 1335, 1386, 268, - 324, 275, 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, - 599, 0, 0, 231, 1428, 1359, 0, 1389, 0, 1443, - 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, 278, 0, - 0, 0, 0, 0, 0, 0, 1356, 1367, 1401, 1405, - 1350, 0, 0, 0, 0, 0, 0, 0, 0, 1327, - 0, 1376, 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1354, - 0, 0, 0, 0, 1308, 0, 1328, 1402, 0, 1291, - 300, 1302, 405, 260, 0, 456, 1409, 1422, 1351, 632, - 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, - 199, 227, 0, 1339, 415, 464, 476, 1414, 1324, 1333, - 256, 1331, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 1375, 1394, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 1303, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 1319, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 1410, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 1399, 1442, - 428, 475, 242, 609, 499, 201, 1313, 1318, 1311, 0, - 257, 258, 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, - 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 1403, 1307, 0, 1316, 1317, 401, 1412, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 1374, 198, 223, - 371, 1438, 457, 291, 653, 621, 487, 616, 208, 225, - 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, - 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, - 1407, 1421, 1441, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 1373, 1379, 384, 284, 308, 323, 1388, 620, 505, - 229, 469, 293, 253, 1406, 1408, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 1369, 1397, 379, 579, 580, 319, 399, 0, 0, 0, - 0, 0, 0, 1427, 1411, 531, 0, 1353, 1430, 1321, - 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, - 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, - 369, 270, 1301, 1292, 206, 508, 1326, 433, 1342, 205, - 1392, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 1436, 373, 1378, 0, 500, - 404, 0, 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, - 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 1334, 1384, 612, 1426, 1335, 1386, 268, 324, 275, - 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, - 0, 231, 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, - 0, 1296, 1300, 1439, 1423, 1329, 278, 0, 0, 0, - 0, 0, 0, 0, 1356, 1367, 1401, 1405, 1350, 0, - 0, 0, 0, 0, 0, 3272, 0, 1327, 0, 1376, - 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1354, 0, 0, - 0, 0, 1308, 0, 1328, 1402, 0, 1291, 300, 1302, - 405, 260, 0, 456, 1409, 1422, 1351, 632, 1424, 1349, - 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, 199, 227, - 0, 1339, 415, 464, 476, 1414, 1324, 1333, 256, 1331, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 1375, 1394, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 1303, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 1319, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 1410, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 1399, 1442, 428, 475, - 242, 609, 499, 201, 1313, 1318, 1311, 0, 257, 258, - 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, - 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 1403, - 1307, 0, 1316, 1317, 401, 1412, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 1374, 198, 223, 371, 1438, - 457, 291, 653, 621, 487, 616, 208, 225, 1310, 265, - 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, - 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, - 1441, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 1373, - 1379, 384, 284, 308, 323, 1388, 620, 505, 229, 469, - 293, 253, 1406, 1408, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 1369, 1397, - 379, 579, 580, 319, 399, 0, 0, 0, 0, 0, - 0, 1427, 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, - 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, - 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, 369, 270, - 1301, 1292, 206, 508, 1326, 433, 1342, 205, 1392, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 1436, 373, 1378, 0, 500, 404, 0, - 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, - 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 1334, - 1384, 612, 1426, 1335, 1386, 268, 324, 275, 267, 583, - 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, 0, 231, - 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, 0, 1296, - 1300, 1439, 1423, 1329, 278, 0, 0, 0, 0, 0, - 0, 0, 1356, 1367, 1401, 1405, 1350, 0, 0, 0, - 0, 0, 0, 3233, 0, 1327, 0, 1376, 0, 0, - 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1354, 0, 0, 0, 0, - 1308, 0, 1328, 1402, 0, 1291, 300, 1302, 405, 260, - 0, 456, 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, - 1306, 1415, 1341, 368, 1304, 333, 199, 227, 0, 1339, - 415, 464, 476, 1414, 1324, 1333, 256, 1331, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 1375, 1394, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 1303, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 1319, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 1410, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 1399, 1442, 428, 475, 242, 609, - 499, 201, 1313, 1318, 1311, 0, 257, 258, 1381, 578, - 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 1403, 1307, 0, - 1316, 1317, 401, 1412, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 1374, 198, 223, 371, 1438, 457, 291, - 653, 621, 487, 616, 208, 225, 1310, 265, 1322, 1330, - 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, - 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 1373, 1379, 384, - 284, 308, 323, 1388, 620, 505, 229, 469, 293, 253, - 1406, 1408, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 1369, 1397, 379, 579, - 580, 319, 399, 0, 0, 0, 0, 0, 0, 1427, - 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, 1343, 1346, - 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, 1295, 1323, - 1355, 273, 1320, 1413, 1372, 1429, 369, 270, 1301, 1292, - 206, 508, 1326, 433, 1342, 205, 1392, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 1436, 373, 1378, 0, 500, 404, 0, 0, 0, - 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, 1391, 1309, - 1377, 1431, 1338, 1387, 1432, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 962, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 1334, 1384, 612, - 1426, 1335, 1386, 268, 324, 275, 267, 583, 1437, 1418, - 1298, 1365, 1425, 1360, 599, 0, 0, 231, 1428, 1359, - 0, 1389, 0, 1443, 1293, 1380, 0, 1296, 1300, 1439, - 1423, 1329, 278, 0, 0, 0, 0, 0, 0, 0, - 1356, 1367, 1401, 1405, 1350, 0, 0, 0, 0, 0, - 0, 2424, 0, 1327, 0, 1376, 0, 0, 0, 1305, - 1297, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1354, 0, 0, 0, 0, 1308, 0, - 1328, 1402, 0, 1291, 300, 1302, 405, 260, 0, 456, - 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, 1306, 1415, - 1341, 368, 1304, 333, 199, 227, 0, 1339, 415, 464, - 476, 1414, 1324, 1333, 256, 1331, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 1375, 1394, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 1303, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 1319, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 1410, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 1399, 1442, 428, 475, 242, 609, 499, 201, - 1313, 1318, 1311, 0, 257, 258, 1381, 578, 1314, 1312, - 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 1403, 1307, 0, 1316, 1317, - 401, 1412, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 1374, 198, 223, 371, 1438, 457, 291, 653, 621, - 487, 616, 208, 225, 1310, 265, 1322, 1330, 0, 1336, - 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, 1383, 1385, - 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 1373, 1379, 384, 284, 308, - 323, 1388, 620, 505, 229, 469, 293, 253, 1406, 1408, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 1369, 1397, 379, 579, 580, 319, - 399, 0, 0, 0, 0, 0, 0, 1427, 1411, 531, - 0, 1353, 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, - 1368, 419, 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, - 1320, 1413, 1372, 1429, 369, 270, 1301, 1292, 206, 508, - 1326, 433, 1342, 205, 1392, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 1436, - 373, 1378, 0, 500, 404, 0, 0, 0, 1417, 1416, - 1347, 1357, 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, - 1338, 1387, 1432, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 0, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 1334, 1384, 612, 1426, 1335, - 1386, 268, 324, 275, 267, 583, 1437, 1418, 1298, 1365, - 1425, 1360, 599, 0, 0, 231, 1428, 1359, 0, 1389, - 0, 1443, 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, - 278, 0, 0, 0, 0, 0, 0, 0, 1356, 1367, - 1401, 1405, 1350, 0, 0, 0, 0, 0, 0, 0, - 0, 1327, 0, 1376, 0, 0, 0, 1305, 1297, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1354, 0, 0, 0, 0, 1308, 0, 1328, 1402, - 0, 1291, 300, 1302, 405, 260, 0, 456, 1409, 1422, - 1351, 632, 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, - 1304, 333, 199, 227, 0, 1339, 415, 464, 476, 1414, - 1324, 1333, 256, 1331, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 1375, 1394, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 1303, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 1319, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 1410, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 1399, 1442, 428, 475, 242, 609, 499, 201, 1313, 1318, - 1311, 0, 257, 258, 1381, 578, 1314, 1312, 1370, 1371, - 1315, 1433, 1434, 1435, 1420, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 1403, 1307, 0, 1316, 1317, 401, 1412, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 1374, - 198, 223, 371, 1438, 457, 291, 653, 621, 487, 616, - 208, 225, 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, - 1358, 1361, 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, - 1398, 1400, 1407, 1421, 1441, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 1373, 1379, 384, 284, 308, 323, 1388, - 620, 505, 229, 469, 293, 253, 1406, 1408, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 1369, 1397, 379, 579, 580, 319, 399, 0, - 0, 0, 0, 0, 0, 1427, 1411, 531, 0, 1353, - 1430, 1321, 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, - 1337, 1325, 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, - 1372, 1429, 369, 270, 1301, 1292, 206, 508, 1326, 433, - 1342, 205, 1392, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 1436, 373, 1378, - 0, 500, 404, 0, 0, 0, 1417, 1416, 1347, 1357, - 1419, 1366, 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, - 1432, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 1334, 1384, 612, 1426, 1335, 1386, 268, - 324, 275, 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, - 599, 0, 0, 231, 1428, 1359, 0, 1389, 0, 1443, - 1293, 1380, 0, 1296, 1300, 1439, 1423, 1329, 278, 0, - 0, 0, 0, 0, 0, 0, 1356, 1367, 1401, 1405, - 1350, 0, 0, 0, 0, 0, 0, 0, 0, 1327, - 0, 1376, 0, 0, 0, 1305, 1297, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1354, - 0, 0, 0, 0, 1308, 0, 1328, 1402, 0, 1291, - 300, 1302, 405, 260, 0, 456, 1409, 1422, 1351, 632, - 1424, 1349, 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, - 199, 227, 0, 1339, 415, 464, 476, 1414, 1324, 1333, - 256, 1331, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 1375, 1394, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 1303, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 1319, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 1410, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 1399, 1442, - 428, 475, 242, 609, 499, 201, 1313, 1318, 1311, 0, - 257, 258, 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, - 1434, 1435, 1420, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 1403, 1307, 0, 1316, 1317, 401, 1412, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 1374, 198, 223, - 371, 1438, 457, 291, 653, 621, 487, 616, 208, 225, - 1310, 265, 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, - 1362, 1363, 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, - 1407, 1421, 1441, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 1373, 1379, 384, 284, 308, 323, 1388, 620, 505, - 229, 469, 293, 253, 1406, 1408, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 1369, 1397, 379, 579, 580, 319, 399, 0, 0, 0, - 0, 0, 0, 1427, 1411, 531, 0, 1353, 1430, 1321, - 1340, 1440, 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, - 1294, 1332, 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, - 369, 270, 1301, 1292, 206, 508, 1326, 433, 1342, 205, - 1392, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 1436, 373, 1378, 0, 500, - 404, 0, 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, - 1404, 1352, 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 1334, 1384, 612, 1426, 1335, 1386, 268, 324, 275, - 267, 583, 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, - 0, 231, 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, - 0, 1296, 1300, 1439, 1423, 1329, 278, 0, 0, 0, - 0, 0, 0, 0, 1356, 1367, 1401, 1405, 1350, 0, - 0, 0, 0, 0, 0, 0, 0, 1327, 0, 1376, - 0, 0, 0, 1305, 1297, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1354, 0, 0, - 0, 0, 1308, 0, 1328, 1402, 0, 1291, 300, 1302, - 405, 260, 0, 456, 1409, 1422, 1351, 632, 1424, 1349, - 1348, 1396, 1306, 1415, 1341, 368, 1304, 333, 199, 227, - 0, 1339, 415, 464, 476, 1414, 1324, 1333, 256, 1331, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 1375, 1394, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 1303, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 1319, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 1410, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 1399, 1442, 428, 475, - 242, 609, 499, 201, 1313, 1318, 1311, 0, 257, 258, - 1381, 578, 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, - 1420, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 1403, - 1307, 0, 1316, 1317, 401, 1412, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 1374, 198, 223, 371, 1438, - 457, 291, 653, 621, 487, 616, 208, 225, 1310, 265, - 1322, 1330, 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, - 1364, 1382, 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, - 1441, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 1373, - 1379, 384, 284, 308, 323, 1388, 620, 505, 229, 469, - 293, 253, 1406, 1408, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 1369, 1397, - 379, 579, 580, 319, 399, 0, 0, 0, 0, 0, - 0, 1427, 1411, 531, 0, 1353, 1430, 1321, 1340, 1440, - 1343, 1346, 1390, 1299, 1368, 419, 1337, 1325, 1294, 1332, - 1295, 1323, 1355, 273, 1320, 1413, 1372, 1429, 369, 270, - 1301, 1292, 206, 508, 1326, 433, 1342, 205, 1392, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 1436, 373, 1378, 0, 500, 404, 0, - 0, 0, 1417, 1416, 1347, 1357, 1419, 1366, 1404, 1352, - 1391, 1309, 1377, 1431, 1338, 1387, 1432, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 1334, - 1384, 612, 1426, 1335, 1386, 268, 324, 275, 267, 583, - 1437, 1418, 1298, 1365, 1425, 1360, 599, 0, 0, 231, - 1428, 1359, 0, 1389, 0, 1443, 1293, 1380, 0, 1296, - 1300, 1439, 1423, 1329, 278, 0, 0, 0, 0, 0, - 0, 0, 1356, 1367, 1401, 1405, 1350, 0, 0, 0, - 0, 0, 0, 0, 0, 1327, 0, 1376, 0, 0, - 0, 1305, 1297, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1354, 0, 0, 0, 0, - 1308, 0, 1328, 1402, 0, 1291, 300, 1302, 405, 260, - 0, 456, 1409, 1422, 1351, 632, 1424, 1349, 1348, 1396, - 1306, 1415, 1341, 368, 1304, 333, 199, 227, 0, 1339, - 415, 464, 476, 1414, 1324, 1333, 256, 1331, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 1375, 1394, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 1303, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 1319, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 1410, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 1399, 1442, 428, 475, 242, 609, - 499, 201, 1313, 1318, 1311, 0, 257, 258, 1381, 578, - 1314, 1312, 1370, 1371, 1315, 1433, 1434, 1435, 1420, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 1403, 1307, 0, - 1316, 1317, 401, 1412, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 1374, 198, 223, 371, 1438, 457, 291, - 653, 621, 487, 616, 208, 225, 1310, 265, 1322, 1330, - 0, 1336, 1344, 1345, 1358, 1361, 1362, 1363, 1364, 1382, - 1383, 1385, 1393, 1395, 1398, 1400, 1407, 1421, 1441, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 1373, 1379, 384, - 284, 308, 323, 1388, 620, 505, 229, 469, 293, 253, - 1406, 1408, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 1369, 1397, 379, 579, - 580, 319, 399, 0, 0, 0, 0, 0, 0, 0, - 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, - 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 95, 0, 0, 1028, 510, 962, 751, - 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, - 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, - 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, - 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, - 2244, 2245, 2246, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 747, 764, 0, 778, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, - 762, 0, 0, 0, 0, 922, 0, 763, 0, 0, - 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 773, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, - 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, - 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, - 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, - 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, - 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, - 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, - 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, - 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, - 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, - 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, - 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, - 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, - 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, - 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, - 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, - 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, - 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, - 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, - 0, 0, 0, 0, 0, 2453, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, - 962, 751, 928, 966, 1029, 980, 981, 982, 967, 0, - 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, - 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, - 975, 612, 983, 984, 2454, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 747, 764, 0, - 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, - 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, - 1022, 1023, 1024, 1025, 1026, 773, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, - 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, - 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, - 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, - 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, - 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, - 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, - 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, - 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, - 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, - 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, - 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, - 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, - 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, - 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, - 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, - 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 86, 531, 0, 780, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 767, 0, 0, 0, 273, 772, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 1723, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 774, - 775, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 95, 0, 0, - 1028, 510, 962, 751, 928, 966, 1029, 980, 981, 982, - 967, 0, 240, 968, 969, 247, 970, 0, 927, 810, - 812, 811, 877, 878, 879, 880, 881, 882, 883, 813, - 814, 808, 975, 612, 983, 984, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 747, - 764, 0, 778, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 761, 762, 0, 0, 0, 0, 922, - 0, 763, 0, 0, 771, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 773, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 921, 0, 0, 632, 0, 0, - 919, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 972, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 973, - 974, 259, 655, 818, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 826, 827, - 283, 310, 903, 902, 901, 309, 311, 899, 900, 898, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 909, 931, 920, 784, 785, 910, 911, - 935, 912, 787, 788, 932, 933, 781, 782, 786, 934, - 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 923, - 770, 769, 0, 776, 777, 0, 806, 807, 809, 815, - 816, 817, 828, 875, 876, 884, 886, 887, 885, 888, - 889, 890, 893, 894, 895, 896, 891, 892, 897, 789, - 793, 790, 791, 792, 804, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 805, 946, 947, 948, 949, - 950, 951, 821, 825, 824, 822, 823, 819, 820, 847, - 846, 848, 849, 850, 851, 852, 853, 855, 854, 856, - 857, 858, 859, 860, 861, 829, 830, 833, 834, 832, - 831, 835, 844, 845, 836, 837, 838, 839, 840, 841, - 843, 842, 862, 863, 864, 865, 866, 868, 867, 871, - 872, 870, 869, 874, 873, 768, 198, 223, 371, 94, - 457, 291, 653, 621, 487, 616, 208, 225, 937, 265, - 938, 0, 0, 942, 0, 0, 0, 944, 943, 0, - 945, 907, 906, 0, 0, 939, 940, 0, 941, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 952, 953, 954, 955, 956, 957, 958, - 959, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 1027, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 780, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 767, 0, 0, 0, 273, 772, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 779, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 774, 775, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, - 0, 0, 1028, 510, 962, 751, 928, 966, 1029, 980, - 981, 982, 967, 0, 240, 968, 969, 247, 970, 0, - 927, 810, 812, 811, 877, 878, 879, 880, 881, 882, - 883, 813, 814, 808, 975, 612, 983, 984, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 747, 764, 0, 778, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 761, 762, 0, 0, 0, - 0, 922, 0, 763, 0, 0, 771, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 773, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 921, 0, 0, 632, - 0, 0, 919, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 972, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 4113, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 973, 974, 259, 655, 818, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 826, 827, 283, 310, 903, 902, 901, 309, 311, 899, - 900, 898, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 909, 931, 920, 784, 785, - 910, 911, 935, 912, 787, 788, 932, 933, 781, 782, - 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 923, 770, 769, 0, 776, 777, 0, 806, 807, - 809, 815, 816, 817, 828, 875, 876, 884, 886, 887, - 885, 888, 889, 890, 893, 894, 895, 896, 891, 892, - 897, 789, 793, 790, 791, 792, 804, 794, 795, 796, - 797, 798, 799, 800, 801, 802, 803, 805, 946, 947, - 948, 949, 950, 951, 821, 825, 824, 822, 823, 819, - 820, 847, 846, 848, 849, 850, 851, 852, 853, 855, - 854, 856, 857, 858, 859, 860, 861, 829, 830, 833, - 834, 832, 831, 835, 844, 845, 836, 837, 838, 839, - 840, 841, 843, 842, 862, 863, 864, 865, 866, 868, - 867, 871, 872, 870, 869, 874, 873, 768, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 937, 265, 938, 0, 0, 942, 0, 0, 0, 944, - 943, 0, 945, 907, 906, 0, 0, 939, 940, 0, - 941, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 952, 953, 954, 955, 956, - 957, 958, 959, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 1027, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 780, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 767, 0, 0, 0, 273, - 772, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 779, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 774, 775, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 1760, 1028, 510, 962, 751, 928, 966, - 1029, 980, 981, 982, 967, 0, 240, 968, 969, 247, - 970, 0, 927, 810, 812, 811, 877, 878, 879, 880, - 881, 882, 883, 813, 814, 808, 975, 612, 983, 984, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 747, 764, 0, 778, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 761, 762, 0, - 0, 0, 0, 922, 0, 763, 0, 0, 771, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, - 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, - 1026, 773, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 921, 0, - 0, 632, 0, 0, 919, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 972, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 973, 974, 259, 655, 818, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 826, 827, 283, 310, 903, 902, 901, 309, - 311, 899, 900, 898, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 909, 931, 920, - 784, 785, 910, 911, 935, 912, 787, 788, 932, 933, - 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 923, 770, 769, 0, 776, 777, 0, - 806, 807, 809, 815, 816, 817, 828, 875, 876, 884, - 886, 887, 885, 888, 889, 890, 893, 894, 895, 896, - 891, 892, 897, 789, 793, 790, 791, 792, 804, 794, - 795, 796, 797, 798, 799, 800, 801, 802, 803, 805, - 946, 947, 948, 949, 950, 951, 821, 825, 824, 822, - 823, 819, 820, 847, 846, 848, 849, 850, 851, 852, - 853, 855, 854, 856, 857, 858, 859, 860, 861, 829, - 830, 833, 834, 832, 831, 835, 844, 845, 836, 837, - 838, 839, 840, 841, 843, 842, 862, 863, 864, 865, - 866, 868, 867, 871, 872, 870, 869, 874, 873, 768, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 937, 265, 938, 0, 0, 942, 0, 0, - 0, 944, 943, 0, 945, 907, 906, 0, 0, 939, - 940, 0, 941, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 952, 953, 954, - 955, 956, 957, 958, 959, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 1027, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, - 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 95, 0, 0, 1028, 510, 962, 751, - 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, - 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, - 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, - 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 747, 764, 0, 778, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, - 762, 1075, 0, 0, 0, 922, 0, 763, 0, 0, - 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 773, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, - 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, - 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, - 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, - 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, - 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, - 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, - 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, - 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, - 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, - 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, - 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, - 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, - 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, - 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, - 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, - 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, - 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, - 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, - 962, 751, 928, 966, 1029, 980, 981, 982, 967, 0, - 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, - 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, - 975, 612, 983, 984, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 747, 764, 0, - 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, - 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, - 1022, 1023, 1024, 1025, 1026, 773, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, - 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, - 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, - 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, - 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, - 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, - 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, - 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, - 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, - 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, - 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, - 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, - 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, - 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, - 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, - 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, - 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 780, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 767, 0, 0, 0, 273, 772, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 779, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 774, - 775, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 95, 0, 0, - 1028, 510, 962, 751, 928, 966, 1029, 980, 981, 982, - 967, 0, 240, 968, 969, 247, 970, 0, 927, 810, - 812, 811, 877, 878, 879, 880, 881, 882, 883, 813, - 814, 808, 975, 612, 983, 984, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 747, - 764, 0, 778, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 761, 762, 0, 0, 0, 0, 922, - 0, 763, 0, 0, 771, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 3189, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 921, 0, 0, 632, 0, 0, - 919, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 972, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 973, - 974, 259, 655, 818, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 826, 827, - 283, 310, 903, 902, 901, 309, 311, 899, 900, 898, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 909, 931, 920, 784, 785, 910, 911, - 935, 912, 787, 788, 932, 933, 781, 782, 786, 934, - 936, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 923, - 770, 769, 0, 776, 777, 0, 806, 807, 809, 815, - 816, 817, 828, 875, 876, 884, 886, 887, 885, 888, - 889, 890, 893, 894, 895, 896, 891, 892, 897, 789, - 793, 790, 791, 792, 804, 794, 795, 796, 797, 798, - 799, 800, 801, 802, 803, 805, 946, 947, 948, 949, - 950, 951, 821, 825, 824, 822, 823, 819, 820, 847, - 846, 848, 849, 850, 851, 852, 853, 855, 854, 856, - 857, 858, 859, 860, 861, 829, 830, 833, 834, 832, - 831, 835, 844, 845, 836, 837, 838, 839, 840, 841, - 843, 842, 862, 863, 864, 865, 866, 868, 867, 871, - 872, 870, 869, 874, 873, 768, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 937, 265, - 938, 0, 0, 942, 0, 0, 0, 944, 943, 0, - 945, 907, 906, 0, 0, 939, 940, 0, 941, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 952, 953, 954, 955, 956, 957, 958, - 959, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 1027, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 780, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 767, 0, 0, 0, 273, 772, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 779, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 774, 775, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, - 0, 0, 1028, 510, 962, 751, 928, 966, 1029, 980, - 981, 982, 967, 0, 240, 968, 969, 247, 970, 0, - 927, 810, 812, 811, 877, 878, 879, 880, 881, 882, - 883, 813, 814, 808, 975, 612, 983, 984, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 747, 764, 0, 778, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 761, 762, 0, 0, 0, - 0, 922, 0, 763, 0, 0, 771, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, - 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, - 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 3185, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 921, 0, 0, 632, - 0, 0, 919, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 972, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 973, 974, 259, 655, 818, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 826, 827, 283, 310, 903, 902, 901, 309, 311, 899, - 900, 898, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 909, 931, 920, 784, 785, - 910, 911, 935, 912, 787, 788, 932, 933, 781, 782, - 786, 934, 936, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 923, 770, 769, 0, 776, 777, 0, 806, 807, - 809, 815, 816, 817, 828, 875, 876, 884, 886, 887, - 885, 888, 889, 890, 893, 894, 895, 896, 891, 892, - 897, 789, 793, 790, 791, 792, 804, 794, 795, 796, - 797, 798, 799, 800, 801, 802, 803, 805, 946, 947, - 948, 949, 950, 951, 821, 825, 824, 822, 823, 819, - 820, 847, 846, 848, 849, 850, 851, 852, 853, 855, - 854, 856, 857, 858, 859, 860, 861, 829, 830, 833, - 834, 832, 831, 835, 844, 845, 836, 837, 838, 839, - 840, 841, 843, 842, 862, 863, 864, 865, 866, 868, - 867, 871, 872, 870, 869, 874, 873, 768, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 937, 265, 938, 0, 0, 942, 0, 0, 0, 944, - 943, 0, 945, 907, 906, 0, 0, 939, 940, 0, - 941, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 952, 953, 954, 955, 956, - 957, 958, 959, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 1027, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 780, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 767, 0, 0, 0, 273, - 772, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 779, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 774, 775, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 0, 1028, 510, 962, 1096, 928, 966, - 1029, 980, 981, 982, 967, 0, 240, 968, 969, 247, - 970, 0, 927, 810, 812, 811, 877, 878, 879, 880, - 881, 882, 883, 813, 814, 808, 975, 612, 983, 984, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 764, 0, 778, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 761, 762, 0, - 0, 0, 0, 922, 0, 763, 0, 0, 771, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, - 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, - 1026, 773, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 921, 0, - 0, 632, 0, 0, 919, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 972, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 973, 974, 259, 655, 818, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 826, 827, 283, 310, 903, 902, 901, 309, - 311, 899, 900, 898, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 909, 931, 920, - 784, 785, 910, 911, 935, 912, 787, 788, 932, 933, - 781, 782, 786, 934, 936, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 923, 770, 769, 0, 776, 777, 0, - 806, 807, 809, 815, 816, 817, 828, 875, 876, 884, - 886, 887, 885, 888, 889, 890, 893, 894, 895, 896, - 891, 892, 897, 789, 793, 790, 791, 792, 804, 794, - 795, 796, 797, 798, 799, 800, 801, 802, 803, 805, - 946, 947, 948, 949, 950, 951, 821, 825, 824, 822, - 823, 819, 820, 847, 846, 848, 849, 850, 851, 852, - 853, 855, 854, 856, 857, 858, 859, 860, 861, 829, - 830, 833, 834, 832, 831, 835, 844, 845, 836, 837, - 838, 839, 840, 841, 843, 842, 862, 863, 864, 865, - 866, 868, 867, 871, 872, 870, 869, 874, 873, 768, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 937, 265, 938, 0, 0, 942, 0, 0, - 0, 944, 943, 0, 945, 907, 906, 0, 0, 939, - 940, 0, 941, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 952, 953, 954, - 955, 956, 957, 958, 959, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 1027, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 780, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 767, 0, 0, - 0, 273, 772, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 779, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 774, 775, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 95, 0, 0, 1028, 510, 962, 1096, - 928, 966, 1029, 980, 981, 982, 967, 0, 240, 968, - 969, 247, 970, 0, 927, 810, 812, 811, 877, 878, - 879, 880, 881, 882, 883, 813, 814, 808, 975, 612, - 983, 984, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 764, 0, 778, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, - 762, 0, 0, 0, 0, 922, 0, 763, 0, 0, - 771, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 2135, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 921, 0, 0, 632, 0, 0, 919, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 972, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 973, 974, 259, 655, 818, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 826, 827, 283, 310, 903, 902, - 901, 309, 311, 899, 900, 898, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 909, - 931, 920, 784, 785, 910, 911, 935, 912, 787, 788, - 932, 933, 781, 782, 786, 934, 936, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 923, 770, 769, 0, 776, - 777, 0, 806, 807, 809, 815, 816, 817, 828, 875, - 876, 884, 886, 887, 885, 888, 889, 890, 893, 894, - 895, 896, 891, 892, 897, 789, 793, 790, 791, 792, - 804, 794, 795, 796, 797, 798, 799, 800, 801, 802, - 803, 805, 946, 947, 948, 949, 950, 951, 821, 825, - 824, 822, 823, 819, 820, 847, 846, 848, 849, 850, - 851, 852, 853, 855, 854, 856, 857, 858, 859, 860, - 861, 829, 830, 833, 834, 832, 831, 835, 844, 845, - 836, 837, 838, 839, 840, 841, 843, 842, 862, 863, - 864, 865, 866, 868, 867, 871, 872, 870, 869, 874, - 873, 768, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 937, 265, 938, 0, 0, 942, - 0, 0, 0, 944, 943, 0, 945, 907, 906, 0, - 0, 939, 940, 0, 941, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 952, - 953, 954, 955, 956, 957, 958, 959, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 1027, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 780, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 767, - 0, 0, 0, 273, 772, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 779, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 774, 775, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 95, 0, 0, 1028, 510, - 962, 1096, 928, 966, 1029, 980, 981, 982, 967, 0, - 240, 968, 969, 247, 970, 0, 927, 810, 812, 811, - 877, 878, 879, 880, 881, 882, 883, 813, 814, 808, - 975, 612, 983, 984, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, - 778, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 761, 762, 0, 0, 0, 0, 922, 0, 763, - 0, 0, 771, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, - 1022, 1023, 1024, 1025, 1026, 2133, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 921, 0, 0, 632, 0, 0, 919, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 972, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 973, 974, 259, - 655, 818, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 826, 827, 283, 310, - 903, 902, 901, 309, 311, 899, 900, 898, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 909, 931, 920, 784, 785, 910, 911, 935, 912, - 787, 788, 932, 933, 781, 782, 786, 934, 936, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 923, 770, 769, - 0, 776, 777, 0, 806, 807, 809, 815, 816, 817, - 828, 875, 876, 884, 886, 887, 885, 888, 889, 890, - 893, 894, 895, 896, 891, 892, 897, 789, 793, 790, - 791, 792, 804, 794, 795, 796, 797, 798, 799, 800, - 801, 802, 803, 805, 946, 947, 948, 949, 950, 951, - 821, 825, 824, 822, 823, 819, 820, 847, 846, 848, - 849, 850, 851, 852, 853, 855, 854, 856, 857, 858, - 859, 860, 861, 829, 830, 833, 834, 832, 831, 835, - 844, 845, 836, 837, 838, 839, 840, 841, 843, 842, - 862, 863, 864, 865, 866, 868, 867, 871, 872, 870, - 869, 874, 873, 768, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 937, 265, 938, 0, - 0, 942, 0, 0, 0, 944, 943, 0, 945, 907, - 906, 0, 0, 939, 940, 0, 941, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 952, 953, 954, 955, 956, 957, 958, 959, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 1027, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 1147, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 1146, 632, 0, 0, - 0, 0, 0, 1143, 1144, 368, 1104, 333, 199, 227, - 1137, 1141, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 86, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 97, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 95, - 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 94, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 2440, 0, - 0, 2439, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 86, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 97, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 1760, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 94, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 1788, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 1790, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 1792, 510, 727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 1485, 0, 1486, 1487, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 95, 0, 0, 0, 510, - 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 2440, 0, 0, 2439, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 2385, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 1973, 510, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 2383, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 1098, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 1104, 333, - 199, 227, 1102, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 2385, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 0, 0, 0, 1973, 510, 196, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 1760, 0, 510, 727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 3744, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 2144, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2145, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 2896, 510, 727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2897, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 727, 0, 0, 0, 0, 2879, - 0, 0, 0, 0, 240, 0, 0, 247, 2880, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 1811, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 0, 0, 0, 1810, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 729, 730, - 731, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 4088, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 1973, 510, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 3744, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 0, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 2441, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 196, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 1792, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 2091, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 2082, 510, 727, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 1940, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 1938, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 1936, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 1934, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 1932, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 1928, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 1926, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 1924, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 1899, 0, 0, - 0, 510, 727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 0, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 1796, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 196, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 412, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 95, 0, 0, 0, 510, 962, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 196, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1462, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 1461, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1054, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 399, 0, 379, 579, - 580, 319, 0, 0, 0, 531, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, - 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, - 369, 270, 0, 0, 206, 508, 0, 433, 0, 205, - 0, 490, 255, 380, 377, 586, 285, 276, 272, 252, - 320, 388, 431, 521, 425, 0, 373, 0, 0, 500, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 250, 328, 204, 416, 501, 289, 0, 0, 0, 0, - 0, 510, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 247, 0, 0, 0, 354, - 363, 362, 342, 343, 345, 347, 353, 360, 366, 339, - 348, 0, 0, 612, 0, 0, 0, 268, 324, 275, - 267, 583, 0, 0, 0, 0, 0, 0, 599, 0, - 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, - 405, 260, 0, 456, 0, 678, 0, 632, 0, 0, - 0, 0, 0, 0, 0, 368, 0, 333, 199, 227, - 0, 0, 415, 464, 476, 0, 0, 0, 256, 0, - 474, 429, 607, 235, 287, 461, 435, 472, 443, 290, - 0, 0, 473, 375, 588, 453, 604, 633, 634, 266, - 409, 618, 525, 626, 651, 228, 263, 423, 509, 610, - 497, 400, 584, 585, 332, 496, 298, 203, 372, 639, - 226, 482, 374, 244, 233, 590, 615, 302, 254, 292, - 459, 646, 215, 520, 601, 241, 486, 0, 0, 654, - 249, 507, 613, 602, 217, 597, 506, 396, 329, 330, - 216, 0, 460, 271, 296, 0, 0, 261, 418, 592, - 593, 259, 655, 230, 625, 222, 0, 624, 411, 587, - 598, 397, 386, 221, 596, 395, 385, 337, 358, 359, - 283, 310, 450, 378, 451, 309, 311, 407, 406, 408, - 209, 611, 629, 0, 210, 0, 502, 614, 656, 455, - 214, 236, 237, 239, 0, 282, 286, 294, 297, 306, - 307, 316, 370, 422, 449, 445, 454, 0, 582, 605, - 619, 631, 637, 638, 640, 641, 642, 643, 644, 647, - 645, 410, 314, 498, 336, 376, 0, 0, 428, 475, - 242, 609, 499, 201, 0, 0, 0, 0, 257, 258, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, 674, 652, - 511, 517, 512, 513, 514, 515, 516, 0, 518, 0, - 0, 0, 0, 0, 401, 0, 594, 595, 675, 387, - 489, 606, 338, 352, 355, 344, 364, 0, 365, 340, - 341, 346, 349, 350, 351, 356, 357, 361, 367, 251, - 212, 393, 402, 581, 315, 218, 219, 220, 527, 528, - 529, 530, 622, 623, 627, 207, 465, 466, 467, 468, - 295, 617, 312, 471, 470, 334, 335, 382, 452, 543, - 545, 556, 560, 562, 564, 570, 573, 544, 546, 557, - 561, 563, 565, 571, 574, 533, 535, 537, 539, 552, - 551, 548, 576, 577, 554, 559, 538, 550, 555, 568, - 575, 572, 532, 536, 540, 549, 567, 566, 547, 558, - 569, 553, 541, 534, 542, 0, 198, 223, 371, 0, - 457, 291, 653, 621, 487, 616, 208, 225, 0, 265, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 200, 202, 211, 224, 234, 238, 245, 264, 279, - 281, 288, 301, 313, 321, 322, 325, 331, 383, 389, - 390, 391, 392, 412, 413, 414, 417, 420, 421, 424, - 426, 427, 430, 434, 438, 439, 440, 442, 444, 446, - 458, 463, 477, 478, 479, 480, 481, 484, 485, 491, - 492, 493, 494, 495, 503, 504, 519, 589, 591, 608, - 628, 635, 483, 304, 305, 447, 448, 317, 318, 649, - 650, 303, 603, 636, 600, 648, 630, 441, 381, 0, - 0, 384, 284, 308, 323, 0, 620, 505, 229, 469, - 293, 253, 0, 0, 213, 248, 232, 262, 277, 280, - 327, 394, 403, 432, 437, 299, 274, 246, 462, 243, - 488, 522, 523, 524, 526, 398, 269, 436, 399, 0, - 379, 579, 580, 319, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, - 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, - 0, 0, 369, 270, 0, 0, 206, 508, 0, 433, - 0, 205, 0, 490, 255, 380, 377, 586, 285, 276, - 272, 252, 320, 388, 431, 521, 425, 0, 373, 0, - 0, 500, 404, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 250, 328, 204, 416, 501, 289, 0, 0, - 0, 0, 0, 510, 727, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 247, 0, 0, - 0, 354, 363, 362, 342, 343, 345, 347, 353, 360, - 366, 339, 348, 0, 0, 612, 0, 0, 0, 268, - 324, 275, 267, 583, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 300, 0, 405, 260, 0, 456, 0, 0, 0, 632, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 333, - 199, 227, 0, 0, 415, 464, 476, 0, 0, 0, - 256, 0, 474, 429, 607, 235, 287, 461, 435, 472, - 443, 290, 0, 0, 473, 375, 588, 453, 604, 633, - 634, 266, 409, 618, 525, 626, 651, 228, 263, 423, - 509, 610, 497, 400, 584, 585, 332, 496, 298, 203, - 372, 639, 226, 482, 374, 244, 233, 590, 615, 302, - 254, 292, 459, 646, 215, 520, 601, 241, 486, 0, - 0, 654, 249, 507, 613, 602, 217, 597, 506, 396, - 329, 330, 216, 0, 460, 271, 296, 0, 0, 261, - 418, 592, 593, 259, 655, 230, 625, 222, 0, 624, - 411, 587, 598, 397, 386, 221, 596, 395, 385, 337, - 358, 359, 283, 310, 450, 378, 451, 309, 311, 407, - 406, 408, 209, 611, 629, 0, 210, 0, 502, 614, - 656, 455, 214, 236, 237, 239, 0, 282, 286, 294, - 297, 306, 307, 316, 370, 422, 449, 445, 454, 0, - 582, 605, 619, 631, 637, 638, 640, 641, 642, 643, - 644, 647, 645, 410, 314, 498, 336, 376, 0, 0, - 428, 475, 242, 609, 499, 201, 0, 0, 0, 0, - 257, 258, 0, 578, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 652, 511, 517, 512, 513, 514, 515, 516, 0, - 518, 0, 0, 0, 0, 0, 401, 0, 594, 595, - 675, 387, 489, 606, 338, 352, 355, 344, 364, 0, - 365, 340, 341, 346, 349, 350, 351, 356, 357, 361, - 367, 251, 212, 393, 402, 581, 315, 218, 219, 220, - 527, 528, 529, 530, 622, 623, 627, 207, 465, 466, - 467, 468, 295, 617, 312, 471, 470, 334, 335, 382, - 452, 543, 545, 556, 560, 562, 564, 570, 573, 544, - 546, 557, 561, 563, 565, 571, 574, 533, 535, 537, - 539, 552, 551, 548, 576, 577, 554, 559, 538, 550, - 555, 568, 575, 572, 532, 536, 540, 549, 567, 566, - 547, 558, 569, 553, 541, 534, 542, 0, 198, 223, - 371, 0, 457, 291, 653, 621, 487, 616, 208, 225, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 200, 202, 211, 224, 234, 238, 245, - 264, 279, 281, 288, 301, 313, 321, 322, 325, 331, - 383, 389, 390, 391, 392, 4154, 413, 414, 417, 420, - 421, 424, 426, 427, 430, 434, 438, 439, 440, 442, - 444, 446, 458, 463, 477, 478, 479, 480, 481, 484, - 485, 491, 492, 493, 494, 495, 503, 504, 519, 589, - 591, 608, 628, 635, 483, 304, 305, 447, 448, 317, - 318, 649, 650, 303, 603, 636, 600, 648, 630, 441, - 381, 0, 0, 384, 284, 308, 323, 0, 620, 505, - 229, 469, 293, 253, 0, 0, 213, 248, 232, 262, - 277, 280, 327, 394, 403, 432, 437, 299, 274, 246, - 462, 243, 488, 522, 523, 524, 526, 398, 269, 436, - 399, 0, 379, 579, 580, 319, 0, 0, 0, 531, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 0, 0, 0, 369, 270, 0, 0, 206, 508, - 0, 433, 0, 205, 0, 490, 255, 380, 377, 586, - 285, 276, 272, 252, 320, 388, 431, 521, 425, 0, - 373, 0, 0, 500, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 250, 328, 204, 416, 501, 289, - 0, 0, 0, 0, 0, 510, 727, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 247, - 0, 0, 0, 354, 363, 362, 342, 343, 345, 347, - 353, 360, 366, 339, 348, 0, 0, 612, 0, 0, - 0, 268, 324, 275, 267, 583, 0, 0, 0, 0, - 0, 0, 599, 0, 0, 231, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 300, 0, 405, 260, 0, 456, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 368, - 0, 333, 199, 227, 0, 0, 415, 464, 476, 0, - 0, 0, 256, 0, 474, 429, 607, 235, 287, 461, - 435, 472, 443, 290, 0, 0, 473, 375, 588, 453, - 604, 633, 634, 266, 409, 618, 525, 626, 651, 228, - 263, 423, 509, 610, 497, 400, 584, 585, 332, 496, - 298, 203, 372, 639, 226, 482, 374, 244, 233, 590, - 615, 302, 254, 292, 459, 646, 215, 520, 601, 241, - 486, 0, 0, 654, 249, 507, 613, 602, 217, 597, - 506, 396, 329, 330, 216, 0, 460, 271, 296, 0, - 0, 261, 418, 592, 593, 259, 655, 230, 625, 222, - 0, 624, 411, 587, 598, 397, 386, 221, 596, 395, - 385, 337, 358, 359, 283, 310, 450, 378, 451, 309, - 311, 407, 406, 408, 209, 611, 629, 0, 210, 0, - 502, 614, 656, 455, 214, 236, 237, 239, 0, 282, - 286, 294, 297, 306, 307, 316, 370, 422, 449, 445, - 454, 0, 582, 605, 619, 631, 637, 638, 640, 641, - 642, 643, 644, 647, 645, 410, 314, 498, 336, 376, - 0, 0, 428, 475, 242, 609, 499, 201, 0, 0, - 0, 0, 257, 258, 0, 578, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 652, 511, 517, 512, 513, 514, 515, - 516, 0, 518, 0, 0, 0, 0, 0, 401, 0, - 594, 595, 675, 387, 489, 606, 338, 352, 355, 344, - 364, 0, 365, 340, 341, 346, 349, 350, 351, 356, - 357, 361, 367, 251, 212, 393, 402, 581, 315, 218, - 219, 220, 527, 528, 529, 530, 622, 623, 627, 207, - 465, 466, 467, 468, 295, 617, 312, 471, 470, 334, - 335, 382, 452, 543, 545, 556, 560, 562, 564, 570, - 573, 544, 546, 557, 561, 563, 565, 571, 574, 533, - 535, 537, 539, 552, 551, 548, 576, 577, 554, 559, - 538, 550, 555, 568, 575, 572, 532, 536, 540, 549, - 567, 566, 547, 558, 569, 553, 541, 534, 542, 0, - 198, 223, 371, 0, 457, 291, 653, 621, 487, 616, - 208, 225, 0, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 211, 224, 234, - 238, 245, 264, 279, 281, 288, 301, 313, 321, 322, - 325, 331, 383, 389, 390, 391, 392, 412, 413, 414, - 417, 420, 421, 424, 426, 427, 430, 434, 438, 439, - 440, 442, 444, 446, 458, 463, 477, 478, 479, 480, - 481, 484, 485, 491, 492, 493, 494, 495, 503, 504, - 519, 589, 591, 608, 628, 635, 483, 304, 305, 447, - 448, 317, 318, 649, 650, 303, 603, 636, 600, 648, - 630, 441, 381, 0, 0, 384, 284, 308, 323, 0, - 620, 505, 229, 469, 293, 253, 0, 0, 213, 248, - 232, 262, 277, 280, 327, 394, 403, 432, 437, 299, - 274, 246, 462, 243, 488, 522, 523, 524, 526, 398, - 269, 436, 399, 0, 379, 579, 580, 319, 0, 0, - 0, 531, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 419, 0, 0, 0, 0, 0, 0, - 0, 273, 0, 0, 0, 0, 369, 270, 0, 0, - 206, 508, 0, 433, 0, 205, 0, 490, 255, 380, - 377, 586, 285, 276, 272, 252, 320, 388, 431, 521, - 425, 0, 373, 0, 0, 500, 404, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 250, 328, 204, 416, - 501, 289, 0, 0, 0, 0, 0, 510, 962, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 247, 0, 0, 0, 354, 363, 362, 342, 343, - 345, 347, 353, 360, 366, 339, 348, 0, 0, 612, - 0, 0, 0, 268, 324, 275, 267, 583, 0, 0, - 0, 0, 0, 0, 599, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 300, 0, 405, 260, 0, 456, - 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, - 0, 368, 0, 333, 199, 227, 0, 0, 415, 464, - 476, 0, 0, 0, 256, 0, 474, 429, 607, 235, - 287, 461, 435, 472, 443, 290, 0, 0, 473, 375, - 588, 453, 604, 633, 634, 266, 409, 618, 525, 626, - 651, 228, 263, 423, 509, 610, 497, 400, 584, 585, - 332, 496, 298, 203, 372, 639, 226, 482, 374, 244, - 233, 590, 615, 302, 254, 292, 459, 646, 215, 520, - 601, 241, 486, 0, 0, 654, 249, 507, 613, 602, - 217, 597, 506, 396, 329, 330, 216, 0, 460, 271, - 296, 0, 0, 261, 418, 592, 593, 259, 655, 230, - 625, 222, 0, 624, 411, 587, 598, 397, 386, 221, - 596, 395, 385, 337, 358, 359, 283, 310, 450, 378, - 451, 309, 311, 407, 406, 408, 209, 611, 629, 0, - 210, 0, 502, 614, 656, 455, 214, 236, 237, 239, - 0, 282, 286, 294, 297, 306, 307, 316, 370, 422, - 449, 445, 454, 0, 582, 605, 619, 631, 637, 638, - 640, 641, 642, 643, 644, 647, 645, 410, 314, 498, - 336, 376, 0, 0, 428, 475, 242, 609, 499, 201, - 0, 0, 0, 0, 257, 258, 0, 578, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 652, 511, 517, 512, 513, - 514, 515, 516, 0, 518, 0, 0, 0, 0, 0, - 401, 0, 594, 595, 675, 387, 489, 606, 338, 352, - 355, 344, 364, 0, 365, 340, 341, 346, 349, 350, - 351, 356, 357, 361, 367, 251, 212, 393, 402, 581, - 315, 218, 219, 220, 527, 528, 529, 530, 622, 623, - 627, 207, 465, 466, 467, 468, 295, 617, 312, 471, - 470, 334, 335, 382, 452, 543, 545, 556, 560, 562, - 564, 570, 573, 544, 546, 557, 561, 563, 565, 571, - 574, 533, 535, 537, 539, 552, 551, 548, 576, 577, - 554, 559, 538, 550, 555, 568, 575, 572, 532, 536, - 540, 549, 567, 566, 547, 558, 569, 553, 541, 534, - 542, 0, 198, 223, 371, 0, 457, 291, 653, 621, - 487, 616, 208, 225, 0, 265, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 200, 202, 211, - 224, 234, 238, 245, 264, 279, 281, 288, 301, 313, - 321, 322, 325, 331, 383, 389, 390, 391, 392, 412, - 413, 414, 417, 420, 421, 424, 426, 427, 430, 434, - 438, 439, 440, 442, 444, 446, 458, 463, 477, 478, - 479, 480, 481, 484, 485, 491, 492, 493, 494, 495, - 503, 504, 519, 589, 591, 608, 628, 635, 483, 304, - 305, 447, 448, 317, 318, 649, 650, 303, 603, 636, - 600, 648, 630, 441, 381, 0, 0, 384, 284, 308, - 323, 0, 620, 505, 229, 469, 293, 253, 0, 0, - 213, 248, 232, 262, 277, 280, 327, 394, 403, 432, - 437, 299, 274, 246, 462, 243, 488, 522, 523, 524, - 526, 398, 269, 436, 399, 0, 379, 579, 580, 319, - 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 273, 0, 0, 0, 0, 369, 270, - 0, 0, 206, 508, 0, 433, 0, 205, 0, 490, - 255, 380, 377, 586, 285, 276, 272, 252, 320, 388, - 431, 521, 425, 0, 373, 0, 0, 500, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 326, 250, 328, - 204, 416, 501, 289, 0, 0, 0, 0, 0, 510, - 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 247, 0, 0, 0, 354, 363, 362, - 342, 343, 345, 347, 353, 360, 366, 339, 348, 0, - 0, 612, 0, 0, 0, 268, 324, 275, 267, 583, - 0, 0, 0, 0, 0, 0, 599, 0, 0, 231, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 405, 260, - 0, 456, 0, 0, 0, 632, 0, 0, 0, 0, - 0, 0, 0, 368, 0, 333, 199, 227, 0, 0, - 415, 464, 476, 0, 0, 0, 256, 0, 474, 429, - 607, 235, 287, 461, 435, 472, 443, 290, 0, 0, - 473, 375, 588, 453, 604, 633, 634, 266, 409, 618, - 525, 626, 651, 228, 263, 423, 509, 610, 497, 400, - 584, 585, 332, 496, 298, 203, 372, 639, 226, 482, - 374, 244, 233, 590, 615, 302, 254, 292, 459, 646, - 215, 520, 601, 241, 486, 0, 0, 654, 249, 507, - 613, 602, 217, 597, 506, 396, 329, 330, 216, 0, - 460, 271, 296, 0, 0, 261, 418, 592, 593, 259, - 655, 230, 625, 222, 0, 624, 411, 587, 598, 397, - 386, 221, 596, 395, 385, 337, 358, 359, 283, 310, - 450, 378, 451, 309, 311, 407, 406, 408, 209, 611, - 629, 0, 210, 0, 502, 614, 656, 455, 214, 236, - 237, 239, 0, 282, 286, 294, 297, 306, 307, 316, - 370, 422, 449, 445, 454, 0, 582, 605, 619, 631, - 637, 638, 640, 641, 642, 643, 644, 647, 645, 410, - 314, 498, 336, 376, 0, 0, 428, 475, 242, 609, - 499, 201, 0, 0, 0, 0, 257, 258, 0, 578, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 652, 511, 517, - 512, 513, 514, 515, 516, 0, 518, 0, 0, 0, - 0, 0, 401, 0, 594, 595, 675, 387, 489, 606, - 338, 352, 355, 344, 364, 0, 365, 340, 341, 346, - 349, 350, 351, 356, 357, 361, 367, 251, 212, 393, - 402, 581, 315, 218, 219, 220, 527, 528, 529, 530, - 622, 623, 627, 207, 465, 466, 467, 468, 295, 617, - 312, 471, 470, 334, 335, 382, 452, 543, 545, 556, - 560, 562, 564, 570, 573, 544, 546, 557, 561, 563, - 565, 571, 574, 533, 535, 537, 539, 552, 551, 548, - 576, 577, 554, 559, 538, 550, 555, 568, 575, 572, - 532, 536, 540, 549, 567, 566, 547, 558, 569, 553, - 541, 534, 542, 0, 198, 223, 371, 0, 457, 291, - 653, 621, 487, 616, 208, 225, 0, 265, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, - 202, 211, 224, 234, 238, 245, 264, 279, 281, 288, - 301, 313, 321, 322, 325, 331, 383, 389, 390, 391, - 392, 412, 413, 414, 417, 420, 421, 424, 426, 427, - 430, 434, 438, 439, 440, 442, 444, 446, 458, 463, - 477, 478, 479, 480, 481, 484, 485, 491, 492, 493, - 494, 495, 503, 504, 519, 589, 591, 608, 628, 635, - 483, 304, 305, 447, 448, 317, 318, 649, 650, 303, - 603, 636, 600, 648, 630, 441, 381, 0, 0, 384, - 284, 308, 323, 0, 620, 505, 229, 469, 293, 253, - 0, 0, 213, 248, 232, 262, 277, 280, 327, 394, - 403, 432, 437, 299, 274, 246, 462, 243, 488, 522, - 523, 524, 526, 398, 269, 436, 0, 0, 379, 579, - 580, 319, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1976, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 684, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4129, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1976, 0, 0, 400, 0, 0, 0, 0, 0, 0, + 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, + 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, + 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, 270, 1305, + 1296, 206, 511, 1330, 435, 1346, 205, 1396, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 1440, 373, 1382, 0, 503, 405, 0, 0, + 2030, 1421, 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, + 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 4131, 513, 966, + 0, 0, 0, 0, 4132, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 1338, 1388, + 616, 1430, 1339, 1390, 268, 324, 275, 267, 587, 1441, + 1422, 1302, 1369, 1429, 1364, 603, 0, 0, 231, 1432, + 1363, 0, 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, + 1443, 1427, 1333, 278, 0, 0, 0, 0, 0, 0, + 0, 1360, 1371, 1405, 1409, 1354, 0, 0, 0, 0, + 0, 0, 0, 0, 1331, 0, 1380, 0, 0, 0, + 1309, 1301, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1358, 0, 0, 0, 0, 1312, + 0, 1332, 1406, 0, 1295, 300, 1306, 406, 260, 0, + 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, + 1419, 1345, 368, 1308, 333, 199, 227, 0, 1343, 416, + 467, 479, 1418, 1328, 1337, 256, 1335, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 1379, 1398, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 1307, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 1323, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 1414, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 1403, 1446, 429, 478, 242, 613, 502, + 201, 1317, 1322, 1315, 0, 257, 258, 1385, 581, 1318, + 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 1407, 1311, 0, 1320, + 1321, 402, 1416, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 1378, 198, 223, 371, 1442, 460, 291, 657, + 625, 490, 620, 208, 225, 1314, 265, 1326, 1334, 0, + 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, + 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 1377, 1383, 384, 284, 308, 323, 1392, 624, 508, 229, + 472, 293, 253, 1410, 1412, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1373, + 1401, 379, 582, 583, 319, 400, 0, 0, 0, 0, + 0, 0, 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, + 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, + 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, + 270, 1305, 1296, 206, 511, 1330, 435, 1346, 205, 1396, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 1440, 373, 1382, 0, 503, 405, + 0, 0, 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, + 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 1338, 1388, 616, 1430, 1339, 1390, 268, 324, 275, 267, + 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, 0, 0, + 231, 1432, 1363, 0, 1393, 0, 1447, 1297, 1384, 0, + 1300, 1304, 1443, 1427, 1333, 278, 0, 0, 0, 0, + 0, 0, 0, 1360, 1371, 1405, 1409, 1354, 0, 0, + 0, 0, 0, 0, 3276, 0, 1331, 0, 1380, 0, + 0, 0, 1309, 1301, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1358, 0, 0, 0, + 0, 1312, 0, 1332, 1406, 0, 1295, 300, 1306, 406, + 260, 0, 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, + 1400, 1310, 1419, 1345, 368, 1308, 333, 199, 227, 0, + 1343, 416, 467, 479, 1418, 1328, 1337, 256, 1335, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 1379, + 1398, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 1307, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 1323, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 1414, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 1403, 1446, 429, 478, 242, + 613, 502, 201, 1317, 1322, 1315, 0, 257, 258, 1385, + 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 1407, 1311, + 0, 1320, 1321, 402, 1416, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 1378, 198, 223, 371, 1442, 460, + 291, 657, 625, 490, 620, 208, 225, 1314, 265, 1326, + 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, + 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 1377, 1383, 384, 284, 308, 323, 1392, 624, + 508, 229, 472, 293, 253, 1410, 1412, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 1373, 1401, 379, 582, 583, 319, 400, 0, 0, + 0, 0, 0, 0, 1431, 1415, 534, 0, 1357, 1434, + 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, + 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, + 1433, 369, 270, 1305, 1296, 206, 511, 1330, 435, 1346, + 205, 1396, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 1440, 373, 1382, 0, + 503, 405, 0, 0, 0, 1421, 1420, 1351, 1361, 1423, + 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 1338, 1388, 616, 1430, 1339, 1390, 268, 324, + 275, 267, 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, + 0, 0, 231, 1432, 1363, 0, 1393, 0, 1447, 1297, + 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, 0, 0, + 0, 0, 0, 0, 0, 1360, 1371, 1405, 1409, 1354, + 0, 0, 0, 0, 0, 0, 3237, 0, 1331, 0, + 1380, 0, 0, 0, 1309, 1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1358, 0, + 0, 0, 0, 1312, 0, 1332, 1406, 0, 1295, 300, + 1306, 406, 260, 0, 459, 1413, 1426, 1355, 636, 1428, + 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, 333, 199, + 227, 0, 1343, 416, 467, 479, 1418, 1328, 1337, 256, + 1335, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 1379, 1398, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 1307, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 1323, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 1414, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 1403, 1446, 429, + 478, 242, 613, 502, 201, 1317, 1322, 1315, 0, 257, + 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, + 1439, 1424, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 1407, 1311, 0, 1320, 1321, 402, 1416, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 1378, 198, 223, 371, + 1442, 460, 291, 657, 625, 490, 620, 208, 225, 1314, + 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, + 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, + 1425, 1445, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 1377, 1383, 384, 284, 308, 323, + 1392, 624, 508, 229, 472, 293, 253, 1410, 1412, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 1373, 1401, 379, 582, 583, 319, 400, + 0, 0, 0, 0, 0, 0, 1431, 1415, 534, 0, + 1357, 1434, 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, + 420, 1341, 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, + 1417, 1376, 1433, 369, 270, 1305, 1296, 206, 511, 1330, + 435, 1346, 205, 1396, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 1440, 373, + 1382, 0, 503, 405, 0, 0, 0, 1421, 1420, 1351, + 1361, 1423, 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, + 1391, 1436, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 966, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 1338, 1388, 616, 1430, 1339, 1390, + 268, 324, 275, 267, 587, 1441, 1422, 1302, 1369, 1429, + 1364, 603, 0, 0, 231, 1432, 1363, 0, 1393, 0, + 1447, 1297, 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, + 0, 0, 0, 0, 0, 0, 0, 1360, 1371, 1405, + 1409, 1354, 0, 0, 0, 0, 0, 0, 2428, 0, + 1331, 0, 1380, 0, 0, 0, 1309, 1301, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1358, 0, 0, 0, 0, 1312, 0, 1332, 1406, 0, + 1295, 300, 1306, 406, 260, 0, 459, 1413, 1426, 1355, + 636, 1428, 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, + 333, 199, 227, 0, 1343, 416, 467, 479, 1418, 1328, + 1337, 256, 1335, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 1379, 1398, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 1307, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 1323, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 1414, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 1403, + 1446, 429, 478, 242, 613, 502, 201, 1317, 1322, 1315, + 0, 257, 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, + 1437, 1438, 1439, 1424, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 1407, 1311, 0, 1320, 1321, 402, 1416, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 1378, 198, + 223, 371, 1442, 460, 291, 657, 625, 490, 620, 208, + 225, 1314, 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, + 1365, 1366, 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, + 1404, 1411, 1425, 1445, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 1377, 1383, 384, 284, + 308, 323, 1392, 624, 508, 229, 472, 293, 253, 1410, + 1412, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 1373, 1401, 379, 582, 583, + 319, 400, 0, 0, 0, 0, 0, 0, 1431, 1415, + 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, 1350, 1394, + 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, 1327, 1359, + 273, 1324, 1417, 1376, 1433, 369, 270, 1305, 1296, 206, + 511, 1330, 435, 1346, 205, 1396, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 1440, 373, 1382, 0, 503, 405, 0, 0, 0, 1421, + 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, 1313, 1381, + 1435, 1342, 1391, 1436, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 1338, 1388, 616, 1430, + 1339, 1390, 268, 324, 275, 267, 587, 1441, 1422, 1302, + 1369, 1429, 1364, 603, 0, 0, 231, 1432, 1363, 0, + 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, 1443, 1427, + 1333, 278, 0, 0, 0, 0, 0, 0, 0, 1360, + 1371, 1405, 1409, 1354, 0, 0, 0, 0, 0, 0, + 0, 0, 1331, 0, 1380, 0, 0, 0, 1309, 1301, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1358, 0, 0, 0, 0, 1312, 0, 1332, + 1406, 0, 1295, 300, 1306, 406, 260, 0, 459, 1413, + 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, 1419, 1345, + 368, 1308, 333, 199, 227, 0, 1343, 416, 467, 479, + 1418, 1328, 1337, 256, 1335, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 1379, 1398, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 1307, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 1323, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 1414, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 1403, 1446, 429, 478, 242, 613, 502, 201, 1317, + 1322, 1315, 0, 257, 258, 1385, 581, 1318, 1316, 1374, + 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 1407, 1311, 0, 1320, 1321, 402, + 1416, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 1378, 198, 223, 371, 1442, 460, 291, 657, 625, 490, + 620, 208, 225, 1314, 265, 1326, 1334, 0, 1340, 1348, + 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, 1389, 1397, + 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 1377, 1383, + 384, 284, 308, 323, 1392, 624, 508, 229, 472, 293, + 253, 1410, 1412, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 1373, 1401, 379, + 582, 583, 319, 400, 0, 0, 0, 0, 0, 0, + 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, 1444, 1347, + 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, 1336, 1299, + 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, 270, 1305, + 1296, 206, 511, 1330, 435, 1346, 205, 1396, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 1440, 373, 1382, 0, 503, 405, 0, 0, + 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, 1356, 1395, + 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 1338, 1388, + 616, 1430, 1339, 1390, 268, 324, 275, 267, 587, 1441, + 1422, 1302, 1369, 1429, 1364, 603, 0, 0, 231, 1432, + 1363, 0, 1393, 0, 1447, 1297, 1384, 0, 1300, 1304, + 1443, 1427, 1333, 278, 0, 0, 0, 0, 0, 0, + 0, 1360, 1371, 1405, 1409, 1354, 0, 0, 0, 0, + 0, 0, 0, 0, 1331, 0, 1380, 0, 0, 0, + 1309, 1301, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1358, 0, 0, 0, 0, 1312, + 0, 1332, 1406, 0, 1295, 300, 1306, 406, 260, 0, + 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, 1400, 1310, + 1419, 1345, 368, 1308, 333, 199, 227, 0, 1343, 416, + 467, 479, 1418, 1328, 1337, 256, 1335, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 1379, 1398, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 1307, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 1323, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 1414, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 1403, 1446, 429, 478, 242, 613, 502, + 201, 1317, 1322, 1315, 0, 257, 258, 1385, 581, 1318, + 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 1407, 1311, 0, 1320, + 1321, 402, 1416, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 1378, 198, 223, 371, 1442, 460, 291, 657, + 625, 490, 620, 208, 225, 1314, 265, 1326, 1334, 0, + 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, 1386, 1387, + 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 1377, 1383, 384, 284, 308, 323, 1392, 624, 508, 229, + 472, 293, 253, 1410, 1412, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1373, + 1401, 379, 582, 583, 319, 400, 0, 0, 0, 0, + 0, 0, 1431, 1415, 534, 0, 1357, 1434, 1325, 1344, + 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, 1329, 1298, + 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, 1433, 369, + 270, 1305, 1296, 206, 511, 1330, 435, 1346, 205, 1396, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 1440, 373, 1382, 0, 503, 405, + 0, 0, 0, 1421, 1420, 1351, 1361, 1423, 1370, 1408, + 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 1338, 1388, 616, 1430, 1339, 1390, 268, 324, 275, 267, + 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, 0, 0, + 231, 1432, 1363, 0, 1393, 0, 1447, 1297, 1384, 0, + 1300, 1304, 1443, 1427, 1333, 278, 0, 0, 0, 0, + 0, 0, 0, 1360, 1371, 1405, 1409, 1354, 0, 0, + 0, 0, 0, 0, 0, 0, 1331, 0, 1380, 0, + 0, 0, 1309, 1301, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1358, 0, 0, 0, + 0, 1312, 0, 1332, 1406, 0, 1295, 300, 1306, 406, + 260, 0, 459, 1413, 1426, 1355, 636, 1428, 1353, 1352, + 1400, 1310, 1419, 1345, 368, 1308, 333, 199, 227, 0, + 1343, 416, 467, 479, 1418, 1328, 1337, 256, 1335, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 1379, + 1398, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 1307, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 1323, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 1414, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 1403, 1446, 429, 478, 242, + 613, 502, 201, 1317, 1322, 1315, 0, 257, 258, 1385, + 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, 1439, 1424, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 1407, 1311, + 0, 1320, 1321, 402, 1416, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 1378, 198, 223, 371, 1442, 460, + 291, 657, 625, 490, 620, 208, 225, 1314, 265, 1326, + 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, 1367, 1368, + 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, 1425, 1445, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 1377, 1383, 384, 284, 308, 323, 1392, 624, + 508, 229, 472, 293, 253, 1410, 1412, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 1373, 1401, 379, 582, 583, 319, 400, 0, 0, + 0, 0, 0, 0, 1431, 1415, 534, 0, 1357, 1434, + 1325, 1344, 1444, 1347, 1350, 1394, 1303, 1372, 420, 1341, + 1329, 1298, 1336, 1299, 1327, 1359, 273, 1324, 1417, 1376, + 1433, 369, 270, 1305, 1296, 206, 511, 1330, 435, 1346, + 205, 1396, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 1440, 373, 1382, 0, + 503, 405, 0, 0, 0, 1421, 1420, 1351, 1361, 1423, + 1370, 1408, 1356, 1395, 1313, 1381, 1435, 1342, 1391, 1436, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 966, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 1338, 1388, 616, 1430, 1339, 1390, 268, 324, + 275, 267, 587, 1441, 1422, 1302, 1369, 1429, 1364, 603, + 0, 0, 231, 1432, 1363, 0, 1393, 0, 1447, 1297, + 1384, 0, 1300, 1304, 1443, 1427, 1333, 278, 0, 0, + 0, 0, 0, 0, 0, 1360, 1371, 1405, 1409, 1354, + 0, 0, 0, 0, 0, 0, 0, 0, 1331, 0, + 1380, 0, 0, 0, 1309, 1301, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1358, 0, + 0, 0, 0, 1312, 0, 1332, 1406, 0, 1295, 300, + 1306, 406, 260, 0, 459, 1413, 1426, 1355, 636, 1428, + 1353, 1352, 1400, 1310, 1419, 1345, 368, 1308, 333, 199, + 227, 0, 1343, 416, 467, 479, 1418, 1328, 1337, 256, + 1335, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 1379, 1398, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 1307, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 1323, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 1414, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 1403, 1446, 429, + 478, 242, 613, 502, 201, 1317, 1322, 1315, 0, 257, + 258, 1385, 581, 1318, 1316, 1374, 1375, 1319, 1437, 1438, + 1439, 1424, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 1407, 1311, 0, 1320, 1321, 402, 1416, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 1378, 198, 223, 371, + 1442, 460, 291, 657, 625, 490, 620, 208, 225, 1314, + 265, 1326, 1334, 0, 1340, 1348, 1349, 1362, 1365, 1366, + 1367, 1368, 1386, 1387, 1389, 1397, 1399, 1402, 1404, 1411, + 1425, 1445, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 1377, 1383, 384, 284, 308, 323, + 1392, 624, 508, 229, 472, 293, 253, 1410, 1412, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 1373, 1401, 379, 582, 583, 319, 400, + 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 755, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 2248, 2249, 2250, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 751, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 0, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 2457, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 755, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 2458, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 751, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 86, + 534, 0, 784, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 771, 0, 0, 0, + 273, 776, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 1727, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 778, 779, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 1032, 513, 966, 755, 932, + 970, 1033, 984, 985, 986, 971, 0, 240, 972, 973, + 247, 974, 0, 931, 814, 816, 815, 881, 882, 883, + 884, 885, 886, 887, 817, 818, 812, 979, 616, 987, + 988, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 751, 768, 0, 782, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 765, 766, + 0, 0, 0, 0, 926, 0, 767, 0, 0, 775, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 777, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 925, + 0, 0, 636, 0, 0, 923, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 976, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 977, 978, 259, 659, 822, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 830, 831, 283, 310, 907, 906, 905, + 309, 311, 903, 904, 902, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 913, 935, + 924, 788, 789, 914, 915, 939, 916, 791, 792, 936, + 937, 785, 786, 790, 938, 940, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 927, 774, 773, 0, 780, 781, + 0, 810, 811, 813, 819, 820, 821, 832, 879, 880, + 888, 890, 891, 889, 892, 893, 894, 897, 898, 899, + 900, 895, 896, 901, 793, 797, 794, 795, 796, 808, + 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, + 809, 950, 951, 952, 953, 954, 955, 825, 829, 828, + 826, 827, 823, 824, 851, 850, 852, 853, 854, 855, + 856, 857, 859, 858, 860, 861, 862, 863, 864, 865, + 833, 834, 837, 838, 836, 835, 839, 848, 849, 840, + 841, 842, 843, 844, 845, 847, 846, 866, 867, 868, + 869, 870, 872, 871, 875, 876, 874, 873, 878, 877, + 772, 198, 223, 371, 94, 460, 291, 657, 625, 490, + 620, 208, 225, 941, 265, 942, 0, 0, 946, 0, + 0, 0, 948, 947, 0, 949, 911, 910, 0, 0, + 943, 944, 0, 945, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 956, 957, 958, 959, 960, 961, 962, 963, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 1031, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 771, 0, 0, 0, 273, 776, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 783, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 778, 779, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 1032, 513, 966, 755, 932, 970, 1033, 984, 985, + 986, 971, 0, 240, 972, 973, 247, 974, 0, 931, + 814, 816, 815, 881, 882, 883, 884, 885, 886, 887, + 817, 818, 812, 979, 616, 987, 988, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 751, 768, 0, 782, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 765, 766, 0, 0, 0, 0, + 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 925, 0, 0, 636, 0, + 0, 923, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 976, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 4117, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 977, 978, 259, 659, 822, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 830, + 831, 283, 310, 907, 906, 905, 309, 311, 903, 904, + 902, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 913, 935, 924, 788, 789, 914, + 915, 939, 916, 791, 792, 936, 937, 785, 786, 790, + 938, 940, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 927, 774, 773, 0, 780, 781, 0, 810, 811, 813, + 819, 820, 821, 832, 879, 880, 888, 890, 891, 889, + 892, 893, 894, 897, 898, 899, 900, 895, 896, 901, + 793, 797, 794, 795, 796, 808, 798, 799, 800, 801, + 802, 803, 804, 805, 806, 807, 809, 950, 951, 952, + 953, 954, 955, 825, 829, 828, 826, 827, 823, 824, + 851, 850, 852, 853, 854, 855, 856, 857, 859, 858, + 860, 861, 862, 863, 864, 865, 833, 834, 837, 838, + 836, 835, 839, 848, 849, 840, 841, 842, 843, 844, + 845, 847, 846, 866, 867, 868, 869, 870, 872, 871, + 875, 876, 874, 873, 878, 877, 772, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 941, + 265, 942, 0, 0, 946, 0, 0, 0, 948, 947, + 0, 949, 911, 910, 0, 0, 943, 944, 0, 945, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 956, 957, + 958, 959, 960, 961, 962, 963, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 1031, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 784, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 771, 0, + 0, 0, 273, 776, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 783, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 778, 779, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 1764, 1032, 513, 966, + 755, 932, 970, 1033, 984, 985, 986, 971, 0, 240, + 972, 973, 247, 974, 0, 931, 814, 816, 815, 881, + 882, 883, 884, 885, 886, 887, 817, 818, 812, 979, + 616, 987, 988, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 751, 768, 0, 782, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 765, 766, 0, 0, 0, 0, 926, 0, 767, 0, + 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 925, 0, 0, 636, 0, 0, 923, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 976, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 977, 978, 259, 659, + 822, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 830, 831, 283, 310, 907, + 906, 905, 309, 311, 903, 904, 902, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 913, 935, 924, 788, 789, 914, 915, 939, 916, 791, + 792, 936, 937, 785, 786, 790, 938, 940, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 927, 774, 773, 0, + 780, 781, 0, 810, 811, 813, 819, 820, 821, 832, + 879, 880, 888, 890, 891, 889, 892, 893, 894, 897, + 898, 899, 900, 895, 896, 901, 793, 797, 794, 795, + 796, 808, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 809, 950, 951, 952, 953, 954, 955, 825, + 829, 828, 826, 827, 823, 824, 851, 850, 852, 853, + 854, 855, 856, 857, 859, 858, 860, 861, 862, 863, + 864, 865, 833, 834, 837, 838, 836, 835, 839, 848, + 849, 840, 841, 842, 843, 844, 845, 847, 846, 866, + 867, 868, 869, 870, 872, 871, 875, 876, 874, 873, + 878, 877, 772, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 941, 265, 942, 0, 0, + 946, 0, 0, 0, 948, 947, 0, 949, 911, 910, + 0, 0, 943, 944, 0, 945, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 956, 957, 958, 959, 960, 961, + 962, 963, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 1031, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 755, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 751, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 1079, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 755, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 751, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 777, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 784, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 771, 0, 0, 0, + 273, 776, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 783, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 778, 779, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 95, 0, 0, 1032, 513, 966, 755, 932, + 970, 1033, 984, 985, 986, 971, 0, 240, 972, 973, + 247, 974, 0, 931, 814, 816, 815, 881, 882, 883, + 884, 885, 886, 887, 817, 818, 812, 979, 616, 987, + 988, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 751, 768, 0, 782, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 765, 766, + 0, 0, 0, 0, 926, 0, 767, 0, 0, 775, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 3193, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 925, + 0, 0, 636, 0, 0, 923, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 976, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 977, 978, 259, 659, 822, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 830, 831, 283, 310, 907, 906, 905, + 309, 311, 903, 904, 902, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 913, 935, + 924, 788, 789, 914, 915, 939, 916, 791, 792, 936, + 937, 785, 786, 790, 938, 940, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 927, 774, 773, 0, 780, 781, + 0, 810, 811, 813, 819, 820, 821, 832, 879, 880, + 888, 890, 891, 889, 892, 893, 894, 897, 898, 899, + 900, 895, 896, 901, 793, 797, 794, 795, 796, 808, + 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, + 809, 950, 951, 952, 953, 954, 955, 825, 829, 828, + 826, 827, 823, 824, 851, 850, 852, 853, 854, 855, + 856, 857, 859, 858, 860, 861, 862, 863, 864, 865, + 833, 834, 837, 838, 836, 835, 839, 848, 849, 840, + 841, 842, 843, 844, 845, 847, 846, 866, 867, 868, + 869, 870, 872, 871, 875, 876, 874, 873, 878, 877, + 772, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 941, 265, 942, 0, 0, 946, 0, + 0, 0, 948, 947, 0, 949, 911, 910, 0, 0, + 943, 944, 0, 945, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 956, 957, 958, 959, 960, 961, 962, 963, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 1031, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 771, 0, 0, 0, 273, 776, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 783, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 778, 779, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 1032, 513, 966, 755, 932, 970, 1033, 984, 985, + 986, 971, 0, 240, 972, 973, 247, 974, 0, 931, + 814, 816, 815, 881, 882, 883, 884, 885, 886, 887, + 817, 818, 812, 979, 616, 987, 988, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 751, 768, 0, 782, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 765, 766, 0, 0, 0, 0, + 926, 0, 767, 0, 0, 775, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 3189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 925, 0, 0, 636, 0, + 0, 923, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 976, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 977, 978, 259, 659, 822, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 830, + 831, 283, 310, 907, 906, 905, 309, 311, 903, 904, + 902, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 913, 935, 924, 788, 789, 914, + 915, 939, 916, 791, 792, 936, 937, 785, 786, 790, + 938, 940, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 927, 774, 773, 0, 780, 781, 0, 810, 811, 813, + 819, 820, 821, 832, 879, 880, 888, 890, 891, 889, + 892, 893, 894, 897, 898, 899, 900, 895, 896, 901, + 793, 797, 794, 795, 796, 808, 798, 799, 800, 801, + 802, 803, 804, 805, 806, 807, 809, 950, 951, 952, + 953, 954, 955, 825, 829, 828, 826, 827, 823, 824, + 851, 850, 852, 853, 854, 855, 856, 857, 859, 858, + 860, 861, 862, 863, 864, 865, 833, 834, 837, 838, + 836, 835, 839, 848, 849, 840, 841, 842, 843, 844, + 845, 847, 846, 866, 867, 868, 869, 870, 872, 871, + 875, 876, 874, 873, 878, 877, 772, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 941, + 265, 942, 0, 0, 946, 0, 0, 0, 948, 947, + 0, 949, 911, 910, 0, 0, 943, 944, 0, 945, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 956, 957, + 958, 959, 960, 961, 962, 963, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 1031, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 784, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 771, 0, + 0, 0, 273, 776, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 783, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 778, 779, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 1032, 513, 966, + 1100, 932, 970, 1033, 984, 985, 986, 971, 0, 240, + 972, 973, 247, 974, 0, 931, 814, 816, 815, 881, + 882, 883, 884, 885, 886, 887, 817, 818, 812, 979, + 616, 987, 988, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 768, 0, 782, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 765, 766, 0, 0, 0, 0, 926, 0, 767, 0, + 0, 775, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 925, 0, 0, 636, 0, 0, 923, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 976, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 977, 978, 259, 659, + 822, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 830, 831, 283, 310, 907, + 906, 905, 309, 311, 903, 904, 902, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 913, 935, 924, 788, 789, 914, 915, 939, 916, 791, + 792, 936, 937, 785, 786, 790, 938, 940, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 927, 774, 773, 0, + 780, 781, 0, 810, 811, 813, 819, 820, 821, 832, + 879, 880, 888, 890, 891, 889, 892, 893, 894, 897, + 898, 899, 900, 895, 896, 901, 793, 797, 794, 795, + 796, 808, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 809, 950, 951, 952, 953, 954, 955, 825, + 829, 828, 826, 827, 823, 824, 851, 850, 852, 853, + 854, 855, 856, 857, 859, 858, 860, 861, 862, 863, + 864, 865, 833, 834, 837, 838, 836, 835, 839, 848, + 849, 840, 841, 842, 843, 844, 845, 847, 846, 866, + 867, 868, 869, 870, 872, 871, 875, 876, 874, 873, + 878, 877, 772, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 941, 265, 942, 0, 0, + 946, 0, 0, 0, 948, 947, 0, 949, 911, 910, + 0, 0, 943, 944, 0, 945, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 956, 957, 958, 959, 960, 961, + 962, 963, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 1031, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 784, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 771, 0, 0, 0, 273, 776, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 783, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 778, 779, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 95, 0, 0, 1032, 513, 966, 1100, 932, 970, 1033, + 984, 985, 986, 971, 0, 240, 972, 973, 247, 974, + 0, 931, 814, 816, 815, 881, 882, 883, 884, 885, + 886, 887, 817, 818, 812, 979, 616, 987, 988, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 768, 0, 782, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 765, 766, 0, 0, + 0, 0, 926, 0, 767, 0, 0, 775, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 2139, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 925, 0, 0, + 636, 0, 0, 923, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 976, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 977, 978, 259, 659, 822, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 830, 831, 283, 310, 907, 906, 905, 309, 311, + 903, 904, 902, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 913, 935, 924, 788, + 789, 914, 915, 939, 916, 791, 792, 936, 937, 785, + 786, 790, 938, 940, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 927, 774, 773, 0, 780, 781, 0, 810, + 811, 813, 819, 820, 821, 832, 879, 880, 888, 890, + 891, 889, 892, 893, 894, 897, 898, 899, 900, 895, + 896, 901, 793, 797, 794, 795, 796, 808, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 809, 950, + 951, 952, 953, 954, 955, 825, 829, 828, 826, 827, + 823, 824, 851, 850, 852, 853, 854, 855, 856, 857, + 859, 858, 860, 861, 862, 863, 864, 865, 833, 834, + 837, 838, 836, 835, 839, 848, 849, 840, 841, 842, + 843, 844, 845, 847, 846, 866, 867, 868, 869, 870, + 872, 871, 875, 876, 874, 873, 878, 877, 772, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 941, 265, 942, 0, 0, 946, 0, 0, 0, + 948, 947, 0, 949, 911, 910, 0, 0, 943, 944, + 0, 945, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 956, 957, 958, 959, 960, 961, 962, 963, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 1031, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 784, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 771, 0, 0, 0, 273, 776, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 783, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 778, 779, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 1032, + 513, 966, 1100, 932, 970, 1033, 984, 985, 986, 971, + 0, 240, 972, 973, 247, 974, 0, 931, 814, 816, + 815, 881, 882, 883, 884, 885, 886, 887, 817, 818, + 812, 979, 616, 987, 988, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 768, + 0, 782, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 765, 766, 0, 0, 0, 0, 926, 0, + 767, 0, 0, 775, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, + 1025, 1026, 1027, 1028, 1029, 1030, 2137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 925, 0, 0, 636, 0, 0, 923, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 976, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 977, 978, + 259, 659, 822, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 830, 831, 283, + 310, 907, 906, 905, 309, 311, 903, 904, 902, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 913, 935, 924, 788, 789, 914, 915, 939, + 916, 791, 792, 936, 937, 785, 786, 790, 938, 940, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 927, 774, + 773, 0, 780, 781, 0, 810, 811, 813, 819, 820, + 821, 832, 879, 880, 888, 890, 891, 889, 892, 893, + 894, 897, 898, 899, 900, 895, 896, 901, 793, 797, + 794, 795, 796, 808, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 809, 950, 951, 952, 953, 954, + 955, 825, 829, 828, 826, 827, 823, 824, 851, 850, + 852, 853, 854, 855, 856, 857, 859, 858, 860, 861, + 862, 863, 864, 865, 833, 834, 837, 838, 836, 835, + 839, 848, 849, 840, 841, 842, 843, 844, 845, 847, + 846, 866, 867, 868, 869, 870, 872, 871, 875, 876, + 874, 873, 878, 877, 772, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 941, 265, 942, + 0, 0, 946, 0, 0, 0, 948, 947, 0, 949, + 911, 910, 0, 0, 943, 944, 0, 945, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 956, 957, 958, 959, + 960, 961, 962, 963, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 1031, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 1151, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 1150, 636, 0, 0, 0, 0, 0, 1147, 1148, + 368, 1108, 333, 199, 227, 1141, 1145, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 86, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 97, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 95, 0, + 0, 0, 513, 196, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 94, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 2444, 0, 0, + 2443, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 86, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 97, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 1764, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 94, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 1792, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 1794, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 1796, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 1489, 0, + 1490, 1491, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 95, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 2444, 0, 0, 2443, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 2389, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 1977, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 2387, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 1108, 333, 199, + 227, 1106, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 2389, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 1977, 513, 196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 1764, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 3748, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 2148, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 2900, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2901, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 2883, 0, + 0, 0, 0, 240, 0, 0, 247, 2884, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 1815, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 1814, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 733, 734, 735, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 4092, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 1977, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 3748, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 2445, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 1796, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 2095, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 2086, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 1944, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 1942, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 1940, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 1938, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 1936, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 1932, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 1930, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 731, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 1928, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 731, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 1903, 0, 0, 0, 513, 731, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 1800, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 196, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 413, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 95, 0, 0, 0, 513, 966, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 196, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1466, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 1465, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 400, 0, 379, 582, 583, 319, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 0, 0, 0, 369, 270, 0, 0, 206, + 511, 0, 435, 0, 205, 0, 493, 255, 380, 377, + 590, 285, 276, 272, 252, 320, 389, 432, 524, 426, + 0, 373, 0, 0, 503, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 326, 250, 328, 204, 417, 504, + 289, 0, 0, 0, 0, 0, 513, 196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 247, 0, 0, 0, 354, 363, 362, 342, 343, 345, + 347, 353, 360, 366, 339, 348, 0, 0, 616, 0, + 0, 0, 268, 324, 275, 267, 587, 0, 0, 0, + 0, 0, 0, 603, 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 300, 0, 406, 260, 0, 459, 0, + 682, 0, 636, 0, 0, 0, 0, 0, 0, 0, + 368, 0, 333, 199, 227, 0, 0, 416, 467, 479, + 0, 0, 0, 256, 0, 477, 430, 611, 235, 287, + 464, 437, 475, 445, 290, 0, 0, 476, 375, 592, + 455, 608, 637, 638, 266, 410, 622, 528, 630, 655, + 228, 263, 424, 512, 614, 500, 401, 588, 589, 332, + 499, 298, 203, 372, 643, 226, 485, 374, 244, 233, + 594, 619, 302, 254, 292, 462, 650, 215, 523, 605, + 241, 489, 0, 0, 658, 249, 510, 617, 606, 217, + 601, 509, 397, 329, 330, 216, 0, 463, 271, 296, + 0, 0, 261, 419, 596, 597, 259, 659, 230, 629, + 222, 0, 628, 412, 591, 602, 398, 386, 221, 600, + 396, 385, 337, 358, 359, 283, 310, 452, 378, 453, + 309, 311, 408, 407, 409, 209, 615, 633, 0, 210, + 0, 505, 618, 660, 457, 214, 236, 237, 239, 0, + 282, 286, 294, 297, 306, 307, 316, 370, 423, 451, + 447, 456, 0, 585, 609, 623, 635, 641, 642, 644, + 645, 646, 647, 648, 651, 649, 411, 314, 501, 336, + 376, 0, 0, 429, 478, 242, 613, 502, 201, 0, + 0, 0, 0, 257, 258, 0, 581, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 656, 514, 520, 515, 516, 517, + 518, 519, 0, 521, 0, 0, 0, 0, 0, 402, + 0, 598, 599, 679, 387, 492, 610, 338, 352, 355, + 344, 364, 0, 365, 340, 341, 346, 349, 350, 351, + 356, 357, 361, 367, 251, 212, 394, 403, 584, 315, + 218, 219, 220, 530, 531, 532, 533, 626, 627, 631, + 207, 468, 469, 470, 471, 295, 621, 312, 474, 473, + 334, 335, 382, 454, 546, 548, 559, 563, 565, 567, + 573, 576, 547, 549, 560, 564, 566, 568, 574, 577, + 536, 538, 540, 542, 555, 554, 551, 579, 580, 557, + 562, 541, 553, 558, 571, 578, 575, 535, 539, 543, + 552, 570, 569, 550, 561, 572, 556, 544, 537, 545, + 0, 198, 223, 371, 0, 460, 291, 657, 625, 490, + 620, 208, 225, 0, 265, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 200, 202, 211, 224, + 234, 238, 245, 264, 279, 281, 288, 301, 313, 321, + 322, 325, 331, 383, 390, 391, 392, 393, 413, 414, + 415, 418, 421, 422, 425, 427, 428, 431, 436, 440, + 441, 442, 444, 446, 448, 461, 466, 480, 481, 482, + 483, 484, 487, 488, 494, 495, 496, 497, 498, 506, + 507, 522, 593, 595, 612, 632, 639, 486, 388, 434, + 458, 586, 304, 305, 449, 450, 317, 318, 653, 654, + 303, 607, 640, 604, 652, 634, 443, 381, 0, 0, + 384, 284, 308, 323, 0, 624, 508, 229, 472, 293, + 253, 0, 0, 213, 248, 232, 262, 277, 280, 327, + 395, 404, 433, 439, 299, 274, 246, 465, 243, 491, + 525, 526, 527, 529, 399, 269, 438, 400, 0, 379, + 582, 583, 319, 0, 0, 0, 534, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 369, 270, 0, 0, 206, 511, 0, 435, 0, + 205, 0, 493, 255, 380, 377, 590, 285, 276, 272, + 252, 320, 389, 432, 524, 426, 0, 373, 0, 0, + 503, 405, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 326, 250, 328, 204, 417, 504, 289, 0, 0, 0, + 0, 0, 513, 731, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 247, 0, 0, 0, + 354, 363, 362, 342, 343, 345, 347, 353, 360, 366, + 339, 348, 0, 0, 616, 0, 0, 0, 268, 324, + 275, 267, 587, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, + 0, 406, 260, 0, 459, 0, 0, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 368, 0, 333, 199, + 227, 0, 0, 416, 467, 479, 0, 0, 0, 256, + 0, 477, 430, 611, 235, 287, 464, 437, 475, 445, + 290, 0, 0, 476, 375, 592, 455, 608, 637, 638, + 266, 410, 622, 528, 630, 655, 228, 263, 424, 512, + 614, 500, 401, 588, 589, 332, 499, 298, 203, 372, + 643, 226, 485, 374, 244, 233, 594, 619, 302, 254, + 292, 462, 650, 215, 523, 605, 241, 489, 0, 0, + 658, 249, 510, 617, 606, 217, 601, 509, 397, 329, + 330, 216, 0, 463, 271, 296, 0, 0, 261, 419, + 596, 597, 259, 659, 230, 629, 222, 0, 628, 412, + 591, 602, 398, 386, 221, 600, 396, 385, 337, 358, + 359, 283, 310, 452, 378, 453, 309, 311, 408, 407, + 409, 209, 615, 633, 0, 210, 0, 505, 618, 660, + 457, 214, 236, 237, 239, 0, 282, 286, 294, 297, + 306, 307, 316, 370, 423, 451, 447, 456, 0, 585, + 609, 623, 635, 641, 642, 644, 645, 646, 647, 648, + 651, 649, 411, 314, 501, 336, 376, 0, 0, 429, + 478, 242, 613, 502, 201, 0, 0, 0, 0, 257, + 258, 0, 581, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 656, 514, 520, 515, 516, 517, 518, 519, 0, 521, + 0, 0, 0, 0, 0, 402, 0, 598, 599, 679, + 387, 492, 610, 338, 352, 355, 344, 364, 0, 365, + 340, 341, 346, 349, 350, 351, 356, 357, 361, 367, + 251, 212, 394, 403, 584, 315, 218, 219, 220, 530, + 531, 532, 533, 626, 627, 631, 207, 468, 469, 470, + 471, 295, 621, 312, 474, 473, 334, 335, 382, 454, + 546, 548, 559, 563, 565, 567, 573, 576, 547, 549, + 560, 564, 566, 568, 574, 577, 536, 538, 540, 542, + 555, 554, 551, 579, 580, 557, 562, 541, 553, 558, + 571, 578, 575, 535, 539, 543, 552, 570, 569, 550, + 561, 572, 556, 544, 537, 545, 0, 198, 223, 371, + 0, 460, 291, 657, 625, 490, 620, 208, 225, 0, + 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 200, 202, 211, 224, 234, 238, 245, 264, + 279, 281, 288, 301, 313, 321, 322, 325, 331, 383, + 390, 391, 392, 393, 4158, 414, 415, 418, 421, 422, + 425, 427, 428, 431, 436, 440, 441, 442, 444, 446, + 448, 461, 466, 480, 481, 482, 483, 484, 487, 488, + 494, 495, 496, 497, 498, 506, 507, 522, 593, 595, + 612, 632, 639, 486, 388, 434, 458, 586, 304, 305, + 449, 450, 317, 318, 653, 654, 303, 607, 640, 604, + 652, 634, 443, 381, 0, 0, 384, 284, 308, 323, + 0, 624, 508, 229, 472, 293, 253, 0, 0, 213, + 248, 232, 262, 277, 280, 327, 395, 404, 433, 439, + 299, 274, 246, 465, 243, 491, 525, 526, 527, 529, + 399, 269, 438, 400, 0, 379, 582, 583, 319, 0, + 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 369, 270, 0, + 0, 206, 511, 0, 435, 0, 205, 0, 493, 255, + 380, 377, 590, 285, 276, 272, 252, 320, 389, 432, + 524, 426, 0, 373, 0, 0, 503, 405, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 326, 250, 328, 204, + 417, 504, 289, 0, 0, 0, 0, 0, 513, 731, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 247, 0, 0, 0, 354, 363, 362, 342, + 343, 345, 347, 353, 360, 366, 339, 348, 0, 0, + 616, 0, 0, 0, 268, 324, 275, 267, 587, 0, + 0, 0, 0, 0, 0, 603, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 300, 0, 406, 260, 0, + 459, 0, 0, 0, 636, 0, 0, 0, 0, 0, + 0, 0, 368, 0, 333, 199, 227, 0, 0, 416, + 467, 479, 0, 0, 0, 256, 0, 477, 430, 611, + 235, 287, 464, 437, 475, 445, 290, 0, 0, 476, + 375, 592, 455, 608, 637, 638, 266, 410, 622, 528, + 630, 655, 228, 263, 424, 512, 614, 500, 401, 588, + 589, 332, 499, 298, 203, 372, 643, 226, 485, 374, + 244, 233, 594, 619, 302, 254, 292, 462, 650, 215, + 523, 605, 241, 489, 0, 0, 658, 249, 510, 617, + 606, 217, 601, 509, 397, 329, 330, 216, 0, 463, + 271, 296, 0, 0, 261, 419, 596, 597, 259, 659, + 230, 629, 222, 0, 628, 412, 591, 602, 398, 386, + 221, 600, 396, 385, 337, 358, 359, 283, 310, 452, + 378, 453, 309, 311, 408, 407, 409, 209, 615, 633, + 0, 210, 0, 505, 618, 660, 457, 214, 236, 237, + 239, 0, 282, 286, 294, 297, 306, 307, 316, 370, + 423, 451, 447, 456, 0, 585, 609, 623, 635, 641, + 642, 644, 645, 646, 647, 648, 651, 649, 411, 314, + 501, 336, 376, 0, 0, 429, 478, 242, 613, 502, + 201, 0, 0, 0, 0, 257, 258, 0, 581, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 656, 514, 520, 515, + 516, 517, 518, 519, 0, 521, 0, 0, 0, 0, + 0, 402, 0, 598, 599, 679, 387, 492, 610, 338, + 352, 355, 344, 364, 0, 365, 340, 341, 346, 349, + 350, 351, 356, 357, 361, 367, 251, 212, 394, 403, + 584, 315, 218, 219, 220, 530, 531, 532, 533, 626, + 627, 631, 207, 468, 469, 470, 471, 295, 621, 312, + 474, 473, 334, 335, 382, 454, 546, 548, 559, 563, + 565, 567, 573, 576, 547, 549, 560, 564, 566, 568, + 574, 577, 536, 538, 540, 542, 555, 554, 551, 579, + 580, 557, 562, 541, 553, 558, 571, 578, 575, 535, + 539, 543, 552, 570, 569, 550, 561, 572, 556, 544, + 537, 545, 0, 198, 223, 371, 0, 460, 291, 657, + 625, 490, 620, 208, 225, 0, 265, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 202, + 211, 224, 234, 238, 245, 264, 279, 281, 288, 301, + 313, 321, 322, 325, 331, 383, 390, 391, 392, 393, + 413, 414, 415, 418, 421, 422, 425, 427, 428, 431, + 436, 440, 441, 442, 444, 446, 448, 461, 466, 480, + 481, 482, 483, 484, 487, 488, 494, 495, 496, 497, + 498, 506, 507, 522, 593, 595, 612, 632, 639, 486, + 388, 434, 458, 586, 304, 305, 449, 450, 317, 318, + 653, 654, 303, 607, 640, 604, 652, 634, 443, 381, + 0, 0, 384, 284, 308, 323, 0, 624, 508, 229, + 472, 293, 253, 0, 0, 213, 248, 232, 262, 277, + 280, 327, 395, 404, 433, 439, 299, 274, 246, 465, + 243, 491, 525, 526, 527, 529, 399, 269, 438, 400, + 0, 379, 582, 583, 319, 0, 0, 0, 534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 369, 270, 0, 0, 206, 511, 0, + 435, 0, 205, 0, 493, 255, 380, 377, 590, 285, + 276, 272, 252, 320, 389, 432, 524, 426, 0, 373, + 0, 0, 503, 405, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 326, 250, 328, 204, 417, 504, 289, 0, + 0, 0, 0, 0, 513, 966, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 247, 0, + 0, 0, 354, 363, 362, 342, 343, 345, 347, 353, + 360, 366, 339, 348, 0, 0, 616, 0, 0, 0, + 268, 324, 275, 267, 587, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 0, 406, 260, 0, 459, 0, 0, 0, + 636, 0, 0, 0, 0, 0, 0, 0, 368, 0, + 333, 199, 227, 0, 0, 416, 467, 479, 0, 0, + 0, 256, 0, 477, 430, 611, 235, 287, 464, 437, + 475, 445, 290, 0, 0, 476, 375, 592, 455, 608, + 637, 638, 266, 410, 622, 528, 630, 655, 228, 263, + 424, 512, 614, 500, 401, 588, 589, 332, 499, 298, + 203, 372, 643, 226, 485, 374, 244, 233, 594, 619, + 302, 254, 292, 462, 650, 215, 523, 605, 241, 489, + 0, 0, 658, 249, 510, 617, 606, 217, 601, 509, + 397, 329, 330, 216, 0, 463, 271, 296, 0, 0, + 261, 419, 596, 597, 259, 659, 230, 629, 222, 0, + 628, 412, 591, 602, 398, 386, 221, 600, 396, 385, + 337, 358, 359, 283, 310, 452, 378, 453, 309, 311, + 408, 407, 409, 209, 615, 633, 0, 210, 0, 505, + 618, 660, 457, 214, 236, 237, 239, 0, 282, 286, + 294, 297, 306, 307, 316, 370, 423, 451, 447, 456, + 0, 585, 609, 623, 635, 641, 642, 644, 645, 646, + 647, 648, 651, 649, 411, 314, 501, 336, 376, 0, + 0, 429, 478, 242, 613, 502, 201, 0, 0, 0, + 0, 257, 258, 0, 581, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 656, 514, 520, 515, 516, 517, 518, 519, + 0, 521, 0, 0, 0, 0, 0, 402, 0, 598, + 599, 679, 387, 492, 610, 338, 352, 355, 344, 364, + 0, 365, 340, 341, 346, 349, 350, 351, 356, 357, + 361, 367, 251, 212, 394, 403, 584, 315, 218, 219, + 220, 530, 531, 532, 533, 626, 627, 631, 207, 468, + 469, 470, 471, 295, 621, 312, 474, 473, 334, 335, + 382, 454, 546, 548, 559, 563, 565, 567, 573, 576, + 547, 549, 560, 564, 566, 568, 574, 577, 536, 538, + 540, 542, 555, 554, 551, 579, 580, 557, 562, 541, + 553, 558, 571, 578, 575, 535, 539, 543, 552, 570, + 569, 550, 561, 572, 556, 544, 537, 545, 0, 198, + 223, 371, 0, 460, 291, 657, 625, 490, 620, 208, + 225, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 200, 202, 211, 224, 234, 238, + 245, 264, 279, 281, 288, 301, 313, 321, 322, 325, + 331, 383, 390, 391, 392, 393, 413, 414, 415, 418, + 421, 422, 425, 427, 428, 431, 436, 440, 441, 442, + 444, 446, 448, 461, 466, 480, 481, 482, 483, 484, + 487, 488, 494, 495, 496, 497, 498, 506, 507, 522, + 593, 595, 612, 632, 639, 486, 388, 434, 458, 586, + 304, 305, 449, 450, 317, 318, 653, 654, 303, 607, + 640, 604, 652, 634, 443, 381, 0, 0, 384, 284, + 308, 323, 0, 624, 508, 229, 472, 293, 253, 0, + 0, 213, 248, 232, 262, 277, 280, 327, 395, 404, + 433, 439, 299, 274, 246, 465, 243, 491, 525, 526, + 527, 529, 399, 269, 438, 400, 0, 379, 582, 583, + 319, 0, 0, 0, 534, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 0, 0, 0, 0, 273, 0, 0, 0, 0, 369, + 270, 0, 0, 206, 511, 0, 435, 0, 205, 0, + 493, 255, 380, 377, 590, 285, 276, 272, 252, 320, + 389, 432, 524, 426, 0, 373, 0, 0, 503, 405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 326, 250, + 328, 204, 417, 504, 289, 0, 0, 0, 0, 0, + 513, 196, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 247, 0, 0, 0, 354, 363, + 362, 342, 343, 345, 347, 353, 360, 366, 339, 348, + 0, 0, 616, 0, 0, 0, 268, 324, 275, 267, + 587, 0, 0, 0, 0, 0, 0, 603, 0, 0, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 300, 0, 406, + 260, 0, 459, 0, 0, 0, 636, 0, 0, 0, + 0, 0, 0, 0, 368, 0, 333, 199, 227, 0, + 0, 416, 467, 479, 0, 0, 0, 256, 0, 477, + 430, 611, 235, 287, 464, 437, 475, 445, 290, 0, + 0, 476, 375, 592, 455, 608, 637, 638, 266, 410, + 622, 528, 630, 655, 228, 263, 424, 512, 614, 500, + 401, 588, 589, 332, 499, 298, 203, 372, 643, 226, + 485, 374, 244, 233, 594, 619, 302, 254, 292, 462, + 650, 215, 523, 605, 241, 489, 0, 0, 658, 249, + 510, 617, 606, 217, 601, 509, 397, 329, 330, 216, + 0, 463, 271, 296, 0, 0, 261, 419, 596, 597, + 259, 659, 230, 629, 222, 0, 628, 412, 591, 602, + 398, 386, 221, 600, 396, 385, 337, 358, 359, 283, + 310, 452, 378, 453, 309, 311, 408, 407, 409, 209, + 615, 633, 0, 210, 0, 505, 618, 660, 457, 214, + 236, 237, 239, 0, 282, 286, 294, 297, 306, 307, + 316, 370, 423, 451, 447, 456, 0, 585, 609, 623, + 635, 641, 642, 644, 645, 646, 647, 648, 651, 649, + 411, 314, 501, 336, 376, 0, 0, 429, 478, 242, + 613, 502, 201, 0, 0, 0, 0, 257, 258, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 656, 514, + 520, 515, 516, 517, 518, 519, 0, 521, 0, 0, + 0, 0, 0, 402, 0, 598, 599, 679, 387, 492, + 610, 338, 352, 355, 344, 364, 0, 365, 340, 341, + 346, 349, 350, 351, 356, 357, 361, 367, 251, 212, + 394, 403, 584, 315, 218, 219, 220, 530, 531, 532, + 533, 626, 627, 631, 207, 468, 469, 470, 471, 295, + 621, 312, 474, 473, 334, 335, 382, 454, 546, 548, + 559, 563, 565, 567, 573, 576, 547, 549, 560, 564, + 566, 568, 574, 577, 536, 538, 540, 542, 555, 554, + 551, 579, 580, 557, 562, 541, 553, 558, 571, 578, + 575, 535, 539, 543, 552, 570, 569, 550, 561, 572, + 556, 544, 537, 545, 0, 198, 223, 371, 0, 460, + 291, 657, 625, 490, 620, 208, 225, 0, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 200, 202, 211, 224, 234, 238, 245, 264, 279, 281, + 288, 301, 313, 321, 322, 325, 331, 383, 390, 391, + 392, 393, 413, 414, 415, 418, 421, 422, 425, 427, + 428, 431, 436, 440, 441, 442, 444, 446, 448, 461, + 466, 480, 481, 482, 483, 484, 487, 488, 494, 495, + 496, 497, 498, 506, 507, 522, 593, 595, 612, 632, + 639, 486, 388, 434, 458, 586, 304, 305, 449, 450, + 317, 318, 653, 654, 303, 607, 640, 604, 652, 634, + 443, 381, 0, 0, 384, 284, 308, 323, 0, 624, + 508, 229, 472, 293, 253, 0, 0, 213, 248, 232, + 262, 277, 280, 327, 395, 404, 433, 439, 299, 274, + 246, 465, 243, 491, 525, 526, 527, 529, 399, 269, + 438, 0, 0, 379, 582, 583, 319, } var yyPact = [...]int{ - -1000, -1000, 6221, -1000, -548, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 5272, -1000, -551, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2427, 2595, -1000, -1000, -1000, -1000, 2584, -1000, 1011, - 2054, -1000, 2404, 5131, -1000, 55080, 512, -1000, 52112, -417, - 870, 238, 35788, -1000, 182, -1000, 174, 53596, 178, -1000, - -1000, -1000, -1000, -417, 21690, 2298, 35, 34, 55080, -1000, - -1000, -1000, -1000, -371, 2545, 1982, -1000, 373, -1000, -1000, - -1000, -1000, -1000, -1000, 51370, -1000, -1000, -1000, 1106, -1000, - -1000, 2412, 2395, 2264, 900, 2329, -1000, 2473, 1982, -1000, - 21690, 2535, 2363, 20948, 20948, 442, -1000, -1000, 292, -1000, - -1000, 30594, 55080, 38756, 285, -1000, 2404, -1000, -1000, -1000, - 213, -1000, 341, 1956, -1000, 1950, -1000, 893, 963, 383, - 834, 490, 382, 381, 368, 365, 363, 355, 353, 348, - 391, -1000, 943, 943, -223, -224, 1482, 441, 379, 379, - 1074, 459, 2374, 2345, -1000, -1000, 943, 943, 943, 360, - 943, 943, 943, 943, 322, 321, 943, 943, 943, 943, - 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, - 943, 943, 943, 976, 2404, 307, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2469, 2576, -1000, -1000, -1000, -1000, 2667, -1000, 1033, + 2110, -1000, 2476, 5131, -1000, 55821, 518, -1000, 52837, -455, + 883, 238, 36425, -1000, 185, -1000, 159, 54329, 181, -1000, + -1000, -1000, -1000, -455, 22251, 2336, 37, 35, 55821, -1000, + -1000, -1000, -1000, -370, 2640, 2031, -1000, 400, -1000, -1000, + -1000, -1000, -1000, -1000, 52091, -1000, -1000, -1000, 1120, -1000, + -1000, 2480, 2501, 2332, 946, 2398, -1000, 2565, 2031, -1000, + 22251, 2620, 2438, 21505, 21505, 470, -1000, -1000, 275, -1000, + -1000, 31203, 55821, 39409, 909, -1000, 2476, -1000, -1000, -1000, + 193, -1000, 324, 1990, -1000, 1989, -1000, 913, 964, 387, + 469, 467, 386, 385, 383, 382, 367, 365, 363, 355, + 394, -1000, 962, 962, -241, -242, 1369, 796, 442, 442, + 1140, 483, 2444, 2443, -1000, -1000, 962, 962, 962, 360, + 962, 962, 962, 962, 301, 293, 962, 962, 962, 962, + 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, + 962, 962, 962, 884, 2476, 276, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7353,70 +7434,69 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 55080, 191, 55080, -1000, - 822, 511, -1000, -1000, -456, 1094, 1094, 78, 1094, 1094, - 1094, 1094, 175, 1019, 33, -1000, 169, 304, 173, 289, - 1082, 189, -1000, -1000, 275, 1082, 1799, -1000, 926, 286, - 184, -1000, 1094, 1094, -1000, 14246, 210, 14246, 14246, 280, - 156, -1000, 2391, -1000, -1000, -1000, -1000, -1000, 1406, -1000, - -1000, -1000, -1000, -44, 457, -1000, -1000, -1000, -1000, 53596, - 50628, 320, -1000, -1000, 45, 1858, 1400, 21690, 1330, 916, - -1000, -1000, 1254, 877, -1000, -1000, -1000, -1000, -1000, 811, - -1000, 23916, 23916, 23916, 23916, -1000, -1000, 1529, 49886, 1529, - 1529, 23916, 1529, 23916, 1529, 1529, 1529, 1529, 21690, 1529, - 1529, 1529, 1529, -1000, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, -1000, -1000, -1000, -1000, 1529, 820, 1529, - 1529, 1529, 1529, 1529, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1529, 1529, 1529, 1529, 1529, 1529, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - -1000, -1000, -1000, 1648, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2048, 1571, 1556, 1547, -1000, 18722, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 55821, 252, 55821, -1000, 835, 517, -1000, -1000, -459, 1107, + 1107, 96, 1107, 1107, 1107, 1107, 172, 1028, 32, -1000, + 160, 294, 167, 277, 1099, 299, -1000, -1000, 265, 1099, + 1868, -1000, 951, 273, 158, -1000, 1107, 1107, -1000, 14767, + 206, 14767, 14767, 269, 147, -1000, 2457, -1000, -1000, -1000, + -1000, -1000, 1365, -1000, -1000, -1000, -1000, -39, 482, -1000, + -1000, -1000, -1000, 54329, 51345, 291, -1000, -1000, 33, 1892, + 1527, 22251, 1574, 944, -1000, -1000, 1428, 906, -1000, -1000, + -1000, -1000, -1000, 816, -1000, 24489, 24489, 24489, 24489, -1000, + -1000, 1998, 50599, 1998, 1998, 24489, 1998, 24489, 1998, 1998, + 1998, 1998, 22251, 1998, 1998, 1998, 1998, -1000, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, -1000, -1000, -1000, + -1000, 1998, 834, 1998, 1998, 1998, 1998, 1998, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1998, 1998, 1998, 1998, 1998, + 1998, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, -1000, -1000, -1000, 1684, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1652, 1611, 1609, 1588, -1000, + 19267, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1529, -1000, -1000, - -1000, 55080, -1000, 1529, 217, 53596, 53596, 387, 1382, -1000, - -1000, 2473, 1982, -1000, 2545, 2497, 373, -1000, 3932, 1793, - 1596, 1478, 1982, 1928, 55080, -1000, 1974, 220, -1000, -1000, - -1000, -357, -358, 2199, 1528, 1797, -1000, -1000, -1000, -1000, - 2226, 21690, -1000, -1000, 2568, -1000, 28368, 818, 2566, 49144, - -1000, 442, 442, 1944, 420, -5, -1000, -1000, -1000, -1000, - 960, 35046, -1000, -1000, -1000, -1000, -1000, 1804, 55080, -1000, - -1000, 5532, 53596, -1000, 2053, -1000, 1795, -1000, 2000, 21690, - 2064, 497, 53596, 479, 478, 477, 439, -73, -1000, -1000, - -1000, -1000, -1000, -1000, 943, 943, 943, -1000, 390, 2531, - 5131, 5096, -1000, -1000, -1000, 48402, 2043, 53596, -1000, 2040, - -1000, 1020, 865, 850, 850, 53596, -1000, -1000, 54338, 53596, - 1018, 1012, 53596, 53596, 53596, 53596, -1000, 47660, -1000, 46918, - 46176, 1381, 53596, 45434, 44692, 43950, 43208, 42466, -1000, 2252, - -1000, 2016, -1000, -1000, -1000, 54338, 53596, 53596, 54338, 53596, - 54338, 55080, 53596, -1000, -1000, 336, -1000, -1000, 1380, 1379, - 1366, 943, 943, 1365, 1786, 1784, 1783, 943, 943, 1364, - 1779, 37272, 1777, 265, 1357, 1355, 1343, 1378, 1771, 194, - 1766, 1372, 1352, 1342, 53596, 2035, 55080, -1000, 271, 1060, - 974, 956, 2404, 2282, 1943, 456, 484, 53596, 436, 436, - 53596, -1000, 14994, 55080, 225, -1000, 1751, 21690, -1000, 1083, - 1082, 1082, -1000, -1000, -1000, -1000, -1000, -1000, 1094, 55080, - 1083, -1000, -1000, -1000, 1082, 1094, 55080, 1094, 1094, 1094, - 1094, 1082, 1082, 1082, 1094, 55080, 55080, 55080, 55080, 55080, - 55080, 55080, 55080, 55080, 14246, 926, 1094, -457, -1000, 1749, - -1000, -1000, -1000, 2160, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1998, -1000, -1000, -1000, 55821, -1000, 1998, 217, 54329, + 54329, 331, 1347, -1000, -1000, 2565, 2031, -1000, 2640, 2644, + 400, -1000, 3901, 1759, 1695, 1378, 2031, 1967, 55821, -1000, + 2015, 211, -1000, -1000, -1000, -309, -330, 2272, 1486, 1864, + -1000, -1000, -1000, -1000, 2347, 22251, -1000, -1000, 2662, -1000, + 28965, 833, 2658, 49853, -1000, 470, 470, 1986, 423, 9, + -1000, -1000, -1000, -1000, 982, 35679, -1000, -1000, -1000, -1000, + -1000, 1878, 55821, -1000, -1000, 5540, 54329, -1000, 2109, -1000, + 1862, -1000, 2072, 22251, 2125, 516, 54329, 513, 509, 499, + 463, -71, -1000, -1000, -1000, -1000, -1000, -1000, 962, 962, + 962, -1000, 393, 2614, 5131, 6483, -1000, -1000, -1000, 49107, + 2107, 54329, -1000, 2102, -1000, 1046, 842, 877, 877, 54329, + -1000, -1000, 55075, 54329, 1043, 1040, 54329, 54329, 54329, 54329, + -1000, 48361, -1000, 47615, 46869, 1346, 54329, 46123, 45377, 44631, + 43885, 43139, -1000, 2527, -1000, 2143, -1000, -1000, -1000, 55075, + 54329, 54329, 55075, 54329, 55075, 55821, 54329, -1000, -1000, 328, + -1000, -1000, 1343, 1340, 1338, 962, 962, 1337, 1857, 1852, + 1831, 962, 962, 1309, 1820, 37917, 1818, 266, 1303, 1296, + 1294, 1290, 1813, 205, 1809, 1288, 1272, 1280, 54329, 2093, + 55821, -1000, 260, 1006, 1015, 980, 2476, 2335, 1984, 480, + 515, 54329, 461, 461, 54329, -1000, 15519, 55821, 213, -1000, + 1770, 22251, -1000, 1102, 1099, 1099, -1000, -1000, -1000, -1000, + -1000, -1000, 1107, 55821, 1102, -1000, -1000, -1000, 1099, 1107, + 55821, 1107, 1107, 1107, 1107, 1099, 1099, 1099, 1107, 55821, + 55821, 55821, 55821, 55821, 55821, 55821, 55821, 55821, 14767, 951, + 1107, -460, -1000, 1757, -1000, -1000, -1000, 2231, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7430,337 +7510,340 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 14246, 14246, -1000, -1000, 2467, 2462, - -1000, -1000, -1000, 1942, -1000, 172, -4, 177, -1000, 41724, - 506, 953, -1000, 506, -1000, -1000, -1000, -1000, -1000, 1940, - 40982, -1000, -458, -459, -460, -461, -1000, -1000, -1000, -465, - -471, -1000, -1000, -1000, 21690, 21690, 21690, 21690, -261, -1000, - 1194, 23916, 2356, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 21690, 1186, 1062, 23916, 23916, 23916, 23916, 23916, 23916, 23916, - 25400, 24658, 23916, 23916, 23916, 23916, 23916, 23916, -1000, -1000, - 32820, 6516, 6516, 877, 877, 877, 877, -1000, -196, 1937, - 54338, -1000, -1000, -1000, 816, 21690, 21690, 877, -1000, 1344, - 3283, 18722, 21690, 21690, 21690, 21690, 965, 1400, 54338, 21690, - -1000, 1478, -1000, -1000, -1000, -1000, 1242, -1000, -1000, 1050, - 2342, 2342, 2342, 2342, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 2342, 21690, 881, 881, 732, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 17238, 21690, 21690, - 23916, 21690, 21690, 21690, 1478, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 1478, 21690, 1349, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 16490, 21690, 21690, 21690, 21690, 21690, - -1000, -1000, -1000, -1000, -1000, -1000, 21690, 21690, 21690, 21690, - 21690, 21690, 21690, 21690, 1478, 21690, 21690, 21690, 21690, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1526, 1550, 1497, 1529, 21690, -1000, 1934, -1000, -199, 29852, - 21690, 1743, 2562, 2057, 53596, -1000, -1000, -1000, -1000, 2473, - -1000, 2473, 1526, 3922, 2218, 20948, -1000, -1000, 3922, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1792, -1000, 55080, 1928, 2457, 53596, -1000, 1912, - -1000, -1000, 1529, -1000, -297, -1000, -300, 2205, 1718, 350, - -1000, 21690, 21690, 1901, -1000, 1445, 55080, -1000, -261, -1000, - 40240, -1000, -1000, 13498, 55080, 344, 55080, -1000, 29110, 39498, - 602, -1000, -5, 1881, -1000, 14, -10, 17980, 876, -1000, - -1000, -1000, 1482, 26142, 1843, 876, 95, -1000, -1000, -1000, - 2000, -1000, 2000, 2000, 2000, 2000, 350, 350, 350, 350, - -1000, -1000, -1000, -1000, -1000, 2033, 2000, 2027, -1000, 2000, - 2000, 2000, 2000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 14767, 14767, + -1000, -1000, 2562, 2560, -1000, -1000, -1000, 1981, -1000, 175, + 4, 179, -1000, 42393, 493, 969, -1000, 493, -1000, -1000, + -1000, -1000, -1000, 1977, 41647, -1000, -463, -464, -468, -470, + -1000, -1000, -1000, -471, -477, -1000, -1000, -1000, 22251, 22251, + 22251, 22251, -276, -1000, 1426, 24489, 2456, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 22251, 1195, 1144, 24489, 24489, 24489, + 24489, 24489, 24489, 24489, 25981, 25235, 24489, 24489, 24489, 24489, + 24489, 24489, -1000, -1000, 33441, 5242, 5242, 906, 906, 906, + 906, -1000, -181, 1973, 55075, -1000, -1000, -1000, 832, 22251, + 22251, 906, -1000, 1196, 1029, 19267, 22251, 22251, 22251, 22251, + 990, 1527, 55075, 22251, -1000, 1378, -1000, -1000, -1000, -1000, + 1200, -1000, -1000, 1091, 2403, 2403, 2403, 2403, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 2403, 22251, + 151, 151, 961, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 17775, 22251, 22251, 24489, 22251, 22251, 22251, 1378, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 1378, 22251, + 1199, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 17023, 22251, + 22251, 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + 22251, 22251, 22251, 22251, 22251, 22251, 22251, 22251, 1378, 22251, + 22251, 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1764, 1721, 1554, 1998, 22251, -1000, + 1972, -1000, -183, 30457, 22251, 1755, 2651, 2147, 54329, -1000, + -1000, -1000, -1000, 2565, -1000, 2565, 1764, 3686, 2279, 21505, + -1000, -1000, 3686, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1783, -1000, 55821, 1967, + 2544, 54329, -1000, 1958, -1000, -1000, 1998, -1000, -315, -1000, + -343, 2265, 1752, 371, -1000, 22251, 22251, 1951, -1000, 1409, + 55821, -1000, -276, -1000, 40901, -1000, -1000, 14015, 55821, 337, + 55821, -1000, 29711, 40155, 303, -1000, 9, 1923, -1000, 11, + -15, 18521, 901, -1000, -1000, -1000, 1369, 26727, 1879, 901, + 85, -1000, -1000, -1000, 2072, -1000, 2072, 2072, 2072, 2072, + 371, 371, 371, 371, -1000, -1000, -1000, -1000, -1000, 2092, + 2072, 2091, -1000, 2072, 2072, 2072, 2072, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2026, 2026, 2026, 2024, 2024, 2001, 2001, 426, -1000, 21690, - 433, 38756, 2426, 1326, 2191, 271, 439, 1993, 53596, 53596, - 53596, 55080, 970, -1000, 1431, 1413, 1412, -1000, -533, 1895, - -1000, -1000, 2528, -1000, -1000, 904, 1044, 1041, 851, 53596, - 216, 339, -1000, 416, -1000, 38756, 53596, 1005, 850, 53596, - -1000, 53596, -1000, -1000, -1000, -1000, -1000, 53596, -1000, -1000, - 1893, -1000, 1911, 1207, 1039, 1091, 1037, 1893, -1000, -1000, - -197, 1893, -1000, 1893, -1000, 1893, -1000, 1893, -1000, 1893, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 984, - 306, -348, 53596, 216, 454, -1000, 452, 32820, -1000, -1000, - -1000, 32820, 32820, -1000, -1000, -1000, -1000, 1711, 1708, -1000, + -1000, -1000, -1000, -1000, 2089, 2089, 2089, 2088, 2088, 2074, + 2074, 437, -1000, 22251, 384, 39409, 2517, 1279, 1681, 260, + 463, 2144, 54329, 54329, 54329, 55821, 1005, -1000, 1476, 1469, + 1425, -1000, -533, 1950, -1000, -1000, 2606, -1000, -1000, 1105, + 1087, 1082, 1138, 54329, 229, 323, -1000, 429, -1000, 39409, + 54329, 1038, 877, 54329, -1000, 54329, -1000, -1000, -1000, -1000, + -1000, 54329, -1000, -1000, 1949, -1000, 1959, 1103, 1081, 1088, + 1065, 1949, -1000, -1000, -189, 1949, -1000, 1949, -1000, 1949, + -1000, 1949, -1000, 1949, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 963, 336, -384, 54329, 229, 475, -1000, + 473, 33441, -1000, -1000, -1000, 33441, 33441, -1000, -1000, -1000, + -1000, 1741, 1737, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -520, 55080, - -1000, 243, 952, 317, 319, 295, 55080, 422, 2368, 2359, - 2353, 2352, 2337, 2331, 2324, 276, 313, 55080, 55080, 436, - 2147, 55080, 2440, 55080, -1000, -1000, -1000, -1000, -1000, 1672, - 1656, -1000, 1400, 55080, -1000, -1000, 1094, 1094, -1000, -1000, - 55080, 1094, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1094, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 55080, -1000, -1000, -1000, - -1000, 1654, -1000, 55080, -44, 161, -1000, -1000, 53596, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -112, -1000, - 296, 5, 397, -1000, -1000, -1000, -1000, -1000, 2461, -1000, - 1400, 987, 992, -1000, 1529, -1000, -1000, 1290, -1000, -1000, - -1000, -1000, -1000, 1529, 1529, 1529, -1000, -1000, -1000, -1000, - -1000, 1186, 23916, 23916, 23916, 1597, 476, 1384, 1339, 1195, - 1128, 1128, 1210, 23916, 1210, 23916, 882, 882, 882, 882, - 882, -1000, -1000, -1000, -1000, -1000, -1000, 1648, -1000, 1643, - -1000, 1529, 54338, 1765, 16490, 1262, 1715, 1478, 892, -1000, + -1000, -1000, -522, 55821, -1000, 254, 968, 304, 296, 308, + 55821, 390, 2432, 2430, 2426, 2408, 2401, 2395, 2383, 239, + 288, 55821, 55821, 461, 2208, 55821, 2507, 55821, -1000, -1000, + -1000, -1000, -1000, 1733, 1704, -1000, 1527, 55821, -1000, -1000, + 1107, 1107, -1000, -1000, 55821, 1107, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1107, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3919, - 1478, 1858, 1478, 1463, 3550, 975, -1000, 21690, 1478, 3538, - -1000, -1000, 1478, 1478, 21690, -1000, -1000, 21690, 21690, 21690, - 21690, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 2191, 21690, 2191, 1889, -1000, -1000, -1000, -1000, -1000, -1000, + 55821, -1000, -1000, -1000, -1000, 1689, -1000, 55821, -39, 153, + -1000, -1000, 54329, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -117, -1000, 327, 2, 419, -1000, -1000, -1000, + -1000, -1000, 2553, -1000, 1527, 1009, 1020, -1000, 1998, -1000, + -1000, 1108, -1000, -1000, -1000, -1000, -1000, 1998, 1998, 1998, + -1000, -1000, -1000, -1000, -1000, 1195, 24489, 24489, 24489, 1509, + 799, 1412, 924, 1454, 1443, 1443, 955, 24489, 955, 24489, + 910, 910, 910, 910, 910, -1000, -1000, -1000, -1000, -1000, + -1000, 1684, -1000, 1682, -1000, 1998, 55075, 1844, 17023, 2023, + 1371, 1378, 933, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1887, 2556, 1216, 2191, 2191, 2191, 2191, 3532, - 2191, 2191, 21690, 2292, -1000, -1000, -1000, 1450, 3523, 1580, - 3519, 2191, 2191, -1000, 2191, 3507, 3500, 1478, 2690, 2679, - 2191, 2191, 2191, 2191, 2191, 2662, 2642, 2191, 2191, 2628, - 2191, 3496, 2191, 2618, 2614, 2601, 2579, 2534, 2529, 2518, - 2514, 2496, 2492, 2485, 2468, 2420, 2415, 2407, 2387, 2371, - 2346, 2191, 2191, 2191, 3489, 2191, 3477, 2191, 3471, 2191, - 2191, 3445, 2339, 2326, 1478, 1885, -1000, 3434, 2191, 3428, - 3424, 3410, 2321, 3406, 3400, 3396, 2191, 2191, 2191, 2309, - 3384, 3363, 3357, 3291, 3114, 3105, 3097, 3082, 3073, 2191, - 1497, 1497, 1497, 1497, 1497, 3069, -266, 2191, 1478, -1000, - -1000, -1000, -1000, -1000, 3062, 2299, 3042, 3029, 3024, 3017, - 1478, 1529, 815, -1000, -1000, 1497, 1478, 1478, 1497, 1497, - 2993, 2988, 2968, 2949, 2907, 2898, 2191, 2191, -1000, 2191, - 2888, 2883, 2277, 2260, 1478, -1000, 1497, 55080, -1000, -449, - -1000, -13, 962, 1529, -1000, 37272, 1478, -1000, 4152, -1000, - 1190, -1000, -1000, -1000, -1000, -1000, 34304, 1841, -1000, -1000, - -1000, -1000, 1529, 1760, -1000, -491, 20206, -1000, -1000, -1000, - 350, 58, 33562, 868, 868, 116, 1400, 1400, 21690, -1000, - -1000, -1000, -1000, -1000, -1000, 799, 2522, 370, 1529, -1000, - 1903, 2626, -1000, -1000, -1000, 2452, 26884, -1000, -1000, 1529, - 1529, 55080, 1875, 1845, -1000, 790, -1000, 1414, 1881, -5, - -16, -1000, -1000, -1000, -1000, 1400, -1000, 1405, 347, 357, - -1000, 424, -1000, -1000, -1000, -1000, 2314, 64, -1000, -1000, - -1000, 899, 350, -1000, -1000, -1000, -1000, -1000, -1000, 1640, - -1000, 1640, -1000, -1000, -1000, -1000, -1000, 1320, -1000, -1000, - -1000, -1000, 1319, -1000, -1000, 1311, -1000, -1000, 2812, 2075, - 433, -1000, -1000, 943, 1637, -1000, -1000, 2317, 943, 943, - 53596, -1000, -1000, 1837, 2426, 243, 55080, 2144, -1000, 1993, - 1993, 1993, -1000, 2421, -1000, -1000, -1000, -1000, -1000, -1000, - -522, 166, 362, -1000, -1000, -1000, 1444, 53596, 1747, -1000, - 214, -1000, 1836, -1000, 53596, -1000, 1741, 2023, 53596, 53596, - -1000, -1000, -1000, 53596, 1529, -1000, -1000, -1000, -1000, 482, - 2400, 323, -1000, -1000, -286, -1000, -1000, 216, 214, 54338, - 53596, 876, -1000, -1000, -1000, -1000, -1000, -523, 1734, 474, - 228, 515, 55080, 55080, 55080, 55080, 55080, 55080, 782, -1000, - -1000, 24, -1000, -1000, 195, -1000, -1000, 1634, -1000, -1000, - -1000, -1000, 195, -1000, -1000, -1000, -1000, -1000, 293, 450, - -1000, 55080, 55080, 918, -1000, -1000, -1000, -1000, -1000, 1082, - -1000, -1000, 1082, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2389, 55080, 3, -488, -1000, - -484, 21690, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1479, - 434, 1384, 23916, 23916, 3283, 3283, 23916, -1000, -1000, -1000, - 332, 332, 32820, -1000, 23916, 21690, -1000, -1000, 21690, 21690, - 21690, 964, -1000, 21690, 1182, -1000, 21690, -1000, -266, 1497, - 2191, 2191, 2191, 2191, -266, -266, -266, -266, -266, -266, - -266, -266, -266, -266, 1894, -1000, 21690, 21690, 21690, 1478, - 315, -1000, -1000, -1000, -266, 21690, -1000, -1000, 2551, -1000, - 21690, -1000, 32820, 21690, 21690, 21690, -1000, -1000, -1000, 21690, - 21690, -1000, -1000, 21690, -1000, 21690, -1000, -1000, -1000, -1000, - -1000, -1000, 21690, -1000, 21690, -1000, -1000, -1000, 21690, -1000, - 21690, -1000, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, -1000, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, -1000, 21690, -1000, - 21690, -1000, 21690, -1000, 21690, 21690, -1000, 21690, 21690, 21690, - -1000, 21690, 21690, 21690, 21690, -1000, -1000, -1000, -1000, 21690, - 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, 21690, -1000, - -1000, -1000, -1000, -1000, -1000, 21690, -1000, 38756, 62, -266, - 1349, 62, 1349, 23174, 824, 783, 22432, -1000, 21690, 15742, - -1000, -1000, -1000, -1000, -1000, 21690, 21690, 21690, 21690, 21690, - 21690, -1000, -1000, -1000, 21690, 21690, -1000, 21690, -1000, 21690, - -1000, -1000, -1000, -1000, -1000, 962, -1000, 471, 466, 850, - 53596, -1000, -1000, -1000, -1000, 1878, -1000, 2472, -1000, 2242, - 2234, 2548, 2522, 20948, -1000, 29110, -1000, -1000, 53596, -1000, - -1000, -407, -1000, 2293, 2280, 868, 868, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 12750, 2473, 21690, 2143, 54338, 1529, - -1000, 27626, 53596, 54338, 29110, 29110, 29110, 29110, 29110, -1000, - 2196, 2192, -1000, 2179, 2161, 2239, 55080, -1000, 1526, 1732, - -1000, 21690, 31336, 1825, 29110, -1000, -1000, 29110, 55080, 12002, - -1000, -1000, 0, -19, -1000, -1000, -1000, -1000, 1482, -1000, - -1000, 1358, 2450, 2311, -1000, -1000, -1000, -1000, -1000, 1725, - -1000, 1717, 1872, 1701, 1697, 306, -1000, 2063, 2384, 943, - 943, -1000, 1309, -1000, 1344, 1620, 1610, -1000, -1000, -1000, - 462, -1000, 55080, 2142, 2139, 2131, -1000, -531, 1297, 2017, - 1994, 21690, 2015, 2524, 1869, 53596, -1000, -1000, 54338, -1000, - 274, -1000, 433, 53596, -1000, -1000, -1000, 339, 55080, -1000, - 7431, -1000, -1000, -1000, 214, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 55080, 232, -1000, 2009, 1389, -1000, -1000, 1980, - -1000, -1000, -1000, -1000, -1000, 207, 192, 1602, 187, 1592, - -1000, 187, -1000, 55080, 903, 2075, 55080, -1000, -1000, -1000, - 1094, 1094, -1000, -1000, 2378, -1000, 1344, 2191, 23916, 23916, - -1000, 877, -1000, -1000, 378, -234, 2000, 2000, -1000, 2000, - 2001, -1000, 2000, 148, 2000, 129, 2000, -1000, -1000, 1478, - 1478, -1000, 1497, 2215, 2121, 2801, -1000, 1400, 21690, 2751, - -1000, -1000, -266, -266, -266, -266, -266, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -82, 2729, 2724, - 2191, -1000, 1997, 1992, -1000, 2191, 21690, 2191, 1478, 2211, - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 2191, 2191, 2198, 2182, 2173, 2146, 2137, 2129, 2102, 2097, - 2093, 2084, 2002, 1989, 1984, 1976, 1971, 1938, 2191, 2191, - 1876, 2191, 1861, 1856, -1000, 1400, 1497, 2718, 1497, 2191, - 2191, 2712, 299, 2191, 1691, 1691, 1691, 1691, 1691, 1497, - 1497, 1497, 1497, 2191, 53596, -1000, -266, -1000, -1000, -311, - -320, -1000, 1478, -266, 1871, 23916, 2191, 23916, 23916, 23916, - 2191, 1478, -1000, 1849, 1831, 2708, 1823, 2191, 2624, 2191, - 2191, 2191, 1770, -1000, 2460, 1529, 2460, 1529, 2460, 1626, - 1190, 55080, -1000, -1000, -1000, -1000, 2522, 2537, -1000, 1870, - -1000, 58, 620, -1000, 2302, 2280, -1000, 2523, 2281, 2521, - -1000, -1000, -1000, -1000, -1000, 1400, -1000, 2406, 1833, -1000, - 951, 1886, -1000, -1000, 20206, 1629, 2228, 784, 1626, 1930, - 2626, 2106, 2116, 3857, -1000, -1000, -1000, -1000, 2181, -1000, - 2169, -1000, -1000, 1974, -1000, 1947, 344, 29110, 1839, 1839, - -1000, 548, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1081, - 7431, 2592, -1000, 1590, -1000, 1391, 212, 1280, -1000, -1000, - 943, 943, -1000, 1001, 1000, -1000, 55080, 1988, -1000, 350, - 1585, 350, 1247, -1000, -1000, 1228, -1000, -1000, -1000, -1000, - 1967, 2231, -1000, -1000, -1000, -1000, 55080, -1000, 55080, 55080, - 55080, 1983, 2512, -1000, 21690, 1981, 944, 2702, 53596, 53596, + -1000, -1000, -1000, 3541, 1378, 1892, 1378, 2206, 3526, 997, + -1000, 22251, 1378, 3516, -1000, -1000, 1378, 1378, 22251, -1000, + -1000, 22251, 22251, 22251, 22251, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 22251, 1681, 1945, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 445, 943, -501, 312, 301, 943, 943, 943, -538, - -1000, -1000, 1624, 1618, -1000, -221, -1000, 21690, -1000, -1000, - -1000, -1000, -1000, 1236, 1236, 1571, 1556, 1547, -1000, 1974, - -1000, -1000, -1000, 1748, -1000, -1000, -202, 53596, 53596, 53596, - 53596, -1000, -1000, -1000, 1111, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 877, 1478, 346, - -212, 1478, -1000, -1000, 350, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 21690, -1000, 21690, -1000, 21690, - 1400, 21690, -1000, -1000, -1000, -1000, -1000, 2473, 1544, 21690, - 21690, -1000, 1224, 1217, -266, 2191, -1000, -1000, -1000, 21690, + -1000, -1000, -1000, -1000, -1000, -1000, 1935, 2649, 2008, 1681, + 1681, 1681, 1681, 3508, 1681, 1681, 22251, 1308, -1000, -1000, + -1000, 1562, 3504, 1367, 3496, 1681, 1681, -1000, 1681, 3491, + 3485, 1378, 2671, 2666, 1681, 1681, 1681, 1681, 1681, 2650, + 2632, 1681, 1681, 2581, 1681, 3461, 1681, 2564, 2556, 2551, + 2542, 2534, 2526, 2479, 2454, 2448, 2427, 2418, 2411, 2373, + 2338, 2331, 2322, 2308, 2304, 1681, 1681, 1681, 3450, 1681, + 3446, 1681, 3442, 1681, 1681, 3433, 2300, 2295, 1378, 1932, + -1000, 3418, 1681, 3414, 3410, 3405, 2270, 3398, 3388, 3384, + 1681, 1681, 1681, 2261, 3371, 3363, 3109, 3102, 3097, 3058, + 3048, 3044, 3028, 1681, 1554, 1554, 1554, 1554, 1554, 3024, + -279, 1681, 1378, -1000, -1000, -1000, -1000, -1000, 2996, 2256, + 2992, 2981, 2976, 2955, 1378, 1998, 831, -1000, -1000, 1554, + 1378, 1378, 1554, 1554, 2920, 2894, 2890, 2882, 2816, 2796, + 1681, 1681, -1000, 1681, 2774, 2762, 2234, 2190, 1378, -1000, + 1554, 55821, -1000, -454, -1000, -12, 912, 1998, -1000, 37917, + 1378, -1000, 4152, -1000, 1353, -1000, -1000, -1000, -1000, -1000, + 34933, 1828, -1000, -1000, -1000, -1000, 1998, 1802, -1000, -494, + 20759, -1000, -1000, -1000, 371, 56, 34187, 882, 882, 111, + 1527, 1527, 22251, -1000, -1000, -1000, -1000, -1000, -1000, 829, + 2639, 438, 1998, -1000, 1944, 2988, -1000, -1000, -1000, 2541, + 27473, -1000, -1000, 1998, 1998, 55821, 1839, 1799, -1000, 825, + -1000, 1370, 1923, 9, -9, -1000, -1000, -1000, -1000, 1527, + -1000, 1422, 353, 351, -1000, 462, -1000, -1000, -1000, -1000, + 2357, 75, -1000, -1000, -1000, 373, 371, -1000, -1000, -1000, + -1000, -1000, -1000, 1678, -1000, 1678, -1000, -1000, -1000, -1000, + -1000, 1277, -1000, -1000, -1000, -1000, 1274, -1000, -1000, 1271, + -1000, -1000, 2692, 2171, 384, -1000, -1000, 962, 1667, -1000, + -1000, 2375, 962, 962, 54329, -1000, -1000, 1829, 2517, 254, + 55821, 2207, -1000, 2144, 2144, 2144, -1000, 2503, -1000, -1000, + -1000, -1000, -1000, -1000, -526, 176, 364, -1000, -1000, -1000, + 5096, 54329, 1794, -1000, 226, -1000, 1765, -1000, 54329, -1000, + 1792, 2087, 54329, 54329, -1000, -1000, -1000, 54329, 1998, -1000, + -1000, -1000, -1000, 504, 2475, 332, -1000, -1000, -301, -1000, + -1000, 229, 226, 55075, 54329, 901, -1000, -1000, -1000, -1000, + -1000, -527, 1787, 490, 231, 334, 55821, 55821, 55821, 55821, + 55821, 55821, 791, -1000, -1000, 18, -1000, -1000, 203, -1000, + -1000, 1664, -1000, -1000, -1000, -1000, 203, -1000, -1000, -1000, + -1000, -1000, 274, 472, -1000, 55821, 55821, 931, -1000, -1000, + -1000, -1000, -1000, 1099, -1000, -1000, 1099, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2453, + 55821, -1, -491, -1000, -488, 22251, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1331, 506, 1412, 24489, 24489, 1029, 1029, + 24489, -1000, -1000, -1000, 996, 996, 33441, -1000, 24489, 22251, + -1000, -1000, 22251, 22251, 22251, 985, -1000, 22251, 1291, -1000, + 22251, -1000, -279, 1554, 1681, 1681, 1681, 1681, -279, -279, + -279, -279, -279, -279, -279, -279, -279, -279, 1926, -1000, + 22251, 22251, 22251, 1378, 333, -1000, -1000, -1000, -279, 22251, + -1000, -1000, 2645, -1000, 22251, -1000, 33441, 22251, 22251, 22251, + -1000, -1000, -1000, 22251, 22251, -1000, -1000, 22251, -1000, 22251, + -1000, -1000, -1000, -1000, -1000, -1000, 22251, -1000, 22251, -1000, + -1000, -1000, 22251, -1000, 22251, -1000, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, -1000, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, 22251, + -1000, 22251, 22251, 22251, -1000, 22251, 22251, 22251, 22251, -1000, + -1000, -1000, -1000, 22251, 22251, 22251, 22251, 22251, 22251, 22251, + 22251, 22251, 22251, -1000, -1000, -1000, -1000, -1000, -1000, 22251, + -1000, 39409, 8, -279, 1199, 8, 1199, 23743, 837, 817, + 22997, -1000, 22251, 16271, -1000, -1000, -1000, -1000, -1000, 22251, + 22251, 22251, 22251, 22251, 22251, -1000, -1000, -1000, 22251, 22251, + -1000, 22251, -1000, 22251, -1000, -1000, -1000, -1000, -1000, 912, + -1000, 471, 446, 877, 54329, -1000, -1000, -1000, -1000, 1922, + -1000, 2552, -1000, 2301, 2292, 2641, 2639, 21505, -1000, 29711, + -1000, -1000, 54329, -1000, -1000, -443, -1000, 2328, 2340, 882, + 882, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13263, 2565, + 22251, 2204, 55075, 1998, -1000, 28219, 54329, 55075, 29711, 29711, + 29711, 29711, 29711, -1000, 2222, 2220, -1000, 2249, 2248, 2296, + 55821, -1000, 1764, 1781, -1000, 22251, 31949, 1886, 29711, -1000, + -1000, 29711, 55821, 12511, -1000, -1000, -5, -20, -1000, -1000, + -1000, -1000, 1369, -1000, -1000, 1213, 2535, 2351, -1000, -1000, + -1000, -1000, -1000, 1777, -1000, 1748, 1921, 1732, 1730, 336, + -1000, 2118, 2449, 962, 962, -1000, 1263, -1000, 1196, 1661, + 1655, -1000, -1000, -1000, 489, -1000, 55821, 2199, 2191, 2186, + -1000, -544, 1255, 2085, 2116, 22251, 2078, 2604, 1905, 54329, + -1000, -1000, 55075, -1000, 278, -1000, 384, 54329, -1000, -1000, + -1000, 323, 55821, -1000, 9274, -1000, -1000, -1000, 226, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 55821, 241, -1000, 2076, + 1361, -1000, -1000, 2131, -1000, -1000, -1000, -1000, -1000, 208, + 189, 1634, 196, 1622, -1000, 196, -1000, 55821, 923, 2171, + 55821, -1000, -1000, -1000, 1107, 1107, -1000, -1000, 2440, -1000, + 1196, 1681, 24489, 24489, -1000, 906, -1000, -1000, 503, -256, + 2072, 2072, -1000, 2072, 2074, -1000, 2072, 134, 2072, 127, + 2072, -1000, -1000, 1378, 1378, -1000, 1554, 2185, 1383, 2727, + -1000, 1527, 22251, 2719, -1000, -1000, -279, -279, -279, -279, + -279, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -78, 2712, 2706, 1681, -1000, 2070, 2062, -1000, 1681, + 22251, 1681, 1378, 2166, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 1681, 2162, 2158, 2154, 2150, + 2145, 2135, 2124, 2117, 2063, 2056, 2045, 2040, 2019, 1995, + 1991, 1979, 1681, 1681, 1974, 1681, 1969, 1928, -1000, 1527, + 1554, 2687, 1554, 1681, 1681, 2637, 330, 1681, 1728, 1728, + 1728, 1728, 1728, 1554, 1554, 1554, 1554, 1681, 54329, -1000, + -279, -1000, -1000, -373, -379, -1000, 1378, -279, 1913, 24489, + 1681, 24489, 24489, 24489, 1681, 1378, -1000, 1897, 1860, 2589, + 1855, 1681, 2378, 1681, 1681, 1681, 1812, -1000, 2536, 1998, + 2536, 1998, 2536, 1712, 1353, 55821, -1000, -1000, -1000, -1000, + 2639, 2629, -1000, 1906, -1000, 56, 616, -1000, 2360, 2340, + -1000, 2603, 2320, 2602, -1000, -1000, -1000, -1000, -1000, 1527, + -1000, 2478, 1896, -1000, 967, 1925, -1000, -1000, 20759, 1717, + 2284, 803, 1712, 1966, 2988, 2140, 2179, 3393, -1000, -1000, + -1000, -1000, 2168, -1000, 2164, -1000, -1000, 2015, -1000, 2366, + 337, 29711, 1965, 1965, -1000, 801, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1100, 9274, 2678, -1000, 1619, -1000, 1360, + 195, 1253, -1000, -1000, 962, 962, -1000, 1035, 1034, -1000, + 55821, 2060, -1000, 371, 1617, 371, 1249, -1000, -1000, 1244, + -1000, -1000, -1000, -1000, 2099, 2350, -1000, -1000, -1000, -1000, + 55821, -1000, 55821, 55821, 55821, 2050, 2601, -1000, 22251, 2048, + 965, 2617, 54329, 54329, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 427, 962, -505, 286, 282, + 962, 962, 962, -545, -1000, -1000, 1703, 1701, -1000, -190, + -1000, 22251, -1000, -1000, -1000, -1000, -1000, 1305, 1305, 1611, + 1609, 1588, -1000, 2015, -1000, -1000, -1000, 1696, -1000, -1000, + -203, 54329, 54329, 54329, 54329, -1000, -1000, -1000, 1209, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, -1000, 21690, - -1000, 21690, -1000, 21690, -1000, -1000, 21690, -1000, -1000, -1000, - 21690, -1000, 21690, -1000, 21690, -1000, -1000, -1000, 21690, 266, - 332, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1478, 342, -1000, -1000, -1000, 2543, -1000, 1478, - 21690, 3283, -1000, 3283, 3283, 3283, -1000, -1000, -1000, 21690, - -1000, 21690, 21690, -1000, 21690, -1000, 21690, -1000, -1000, -1000, - -1000, 21690, 1529, 2284, 38014, 1529, 38014, 1529, 31336, -1000, - -1000, 2537, 2499, 2509, 2262, 2269, 2269, 2302, -1000, 2508, - 2507, -1000, 1538, 2505, 1532, 998, -1000, 54338, 21690, -1000, - 1529, 37272, -1000, 377, 53596, 1529, 53596, -1000, 2493, -1000, - -1000, 21690, 1979, -1000, 21690, -1000, -1000, -1000, -1000, 6516, - 2522, 1839, -1000, -1000, 886, -1000, 21690, -1000, 10057, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1527, 1509, -1000, - -1000, 1975, 21690, -1000, -1000, -1000, 1742, 1619, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1974, -1000, -1000, -1000, - -1000, 339, -530, 2696, 53596, 1213, -1000, 1614, 1869, 324, - 1529, 1489, 943, 943, 943, 1201, 1178, 37272, 1609, -1000, - 53596, 407, -1000, 339, -1000, -226, -227, 2191, -1000, -1000, - 2447, -1000, -1000, 15742, -1000, -1000, 1969, 1985, -1000, -1000, - -1000, -1000, 2204, -193, -218, -1000, -1000, 2191, 2191, 2191, - 1235, 1478, -1000, 2191, 2191, 1598, 1517, -1000, -1000, 2191, - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, - 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 1497, - 1723, -1000, 266, 1478, 2115, -1000, -1000, 6516, -1000, -1000, - 2493, 2500, 62, -1000, -1000, 209, 62, 1400, 978, 1478, - 1478, 978, 1699, 2191, 1695, 1652, 2191, 2191, 32078, -1000, - 2483, 2482, 1516, -1000, -1000, 38014, 1516, 38014, 962, 2499, - -275, 21690, 21690, 2255, 1271, -1000, -1000, -1000, -1000, 1480, - 1441, -1000, 1437, -1000, 2591, -1000, 1400, -1000, 1529, 1529, - -1000, 531, 1886, -1000, 2473, 1400, 53596, 1400, 55, 2493, - -1000, 2191, -1000, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, - 1529, 1529, 1529, 1529, -1000, -1000, 53596, 2506, -1000, -1000, - 2445, 1553, 164, -1000, 1494, 1869, -1000, -1000, 922, -1000, - 21690, -1000, 37272, 1435, 1432, -1000, -1000, -1000, -1000, -538, - -1000, -1000, -1000, -1000, -1000, -1000, 373, 1860, -1000, 942, - 53596, 55080, -1000, 2167, -1000, -1000, -1000, -1000, 21690, -1000, + -1000, 906, 1378, 376, -205, 1378, -1000, -1000, 371, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22251, + -1000, 22251, -1000, 22251, 1527, 22251, -1000, -1000, -1000, -1000, + -1000, 2565, 1581, 22251, 22251, -1000, 1226, 1204, -279, 1681, + -1000, -1000, -1000, 22251, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, + -1000, 22251, -1000, 22251, -1000, 22251, -1000, 22251, -1000, -1000, + 22251, -1000, -1000, -1000, 22251, -1000, 22251, -1000, 22251, -1000, + -1000, -1000, 22251, 233, 996, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1378, 329, -1000, -1000, + -1000, 2638, -1000, 1378, 22251, 1029, -1000, 1029, 1029, 1029, + -1000, -1000, -1000, 22251, -1000, 22251, 22251, -1000, 22251, -1000, + 22251, -1000, -1000, -1000, -1000, 22251, 1998, 2468, 38663, 1998, + 38663, 1998, 31949, -1000, -1000, 2629, 2591, 2597, 2309, 2311, + 2311, 2360, -1000, 2594, 2583, -1000, 1564, 2582, 1555, 1027, + -1000, 55075, 22251, -1000, 1998, 37917, -1000, 426, 54329, 1998, + 54329, -1000, 2577, -1000, -1000, 22251, 2036, -1000, 22251, -1000, + -1000, -1000, -1000, 5242, 2639, 1965, -1000, -1000, 916, -1000, + 22251, -1000, 10482, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1549, 1523, -1000, -1000, 2022, 22251, -1000, -1000, -1000, + 1629, 1563, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2015, -1000, -1000, -1000, -1000, 323, -538, 2223, 54329, 1153, + -1000, 1699, 1905, 309, 1998, 1521, 962, 962, 962, 1139, + 1132, 37917, 1693, -1000, 54329, 350, -1000, 323, -1000, -250, + -251, 1681, -1000, -1000, 2524, -1000, -1000, 16271, -1000, -1000, + 2013, 2137, -1000, -1000, -1000, -1000, 2188, -187, -221, -1000, + -1000, 1681, 1681, 1681, 1189, 1378, -1000, 1681, 1681, 1548, + 1410, -1000, -1000, 1681, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, + 1681, 1681, 1681, 1554, 1808, -1000, 233, 1378, 2172, -1000, + -1000, 5242, -1000, -1000, 2577, 2579, 8, -1000, -1000, 221, + 8, 1527, 1019, 1378, 1378, 1019, 1790, 1681, 1775, 1726, + 1681, 1681, 32695, -1000, 2574, 2571, 1671, -1000, -1000, 38663, + 1671, 38663, 912, 2591, -288, 22251, 22251, 2305, 1207, -1000, + -1000, -1000, -1000, 1519, 1488, -1000, 1465, -1000, 2677, -1000, + 1527, -1000, 1998, 1998, -1000, 795, 1925, -1000, 2565, 1527, + 54329, 1527, 55, 2577, -1000, 1681, -1000, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, + 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, -1000, -1000, + 54329, 2181, -1000, -1000, 2513, 1688, 163, -1000, 1384, 1905, + -1000, -1000, 892, -1000, 22251, -1000, 37917, 1436, 1385, -1000, + -1000, -1000, -1000, -545, -1000, -1000, -1000, -1000, -1000, -1000, + 400, 1901, -1000, 960, 54329, 55821, -1000, 2161, -1000, -1000, + -1000, -1000, 22251, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 21690, -1000, 1478, 2112, - -1000, -370, -1000, -502, 21690, -266, -1000, -1000, -266, -1000, - -1000, -1000, -1000, -1000, 21690, -1000, -1000, 21690, -1000, 21690, - -1000, -1000, 1516, -1000, -1000, -1000, 36530, -1000, 1516, -1000, - 1516, -1000, -275, -1000, 1859, -1000, 53596, 1400, 375, -1000, - 1234, -1000, -1000, -1000, -1000, -1000, 54338, 53596, 1886, 53596, - -1000, -1000, 1508, 1478, 1529, 2473, -1000, 1506, -1000, 373, - -1000, 1968, 1994, -1000, -1000, -1000, 19464, -1000, -1000, -1000, - -1000, -1000, 249, -200, 15742, 11254, 1500, -1000, -198, 2191, - 1497, -1000, -476, -1000, -1000, -1000, -1000, 303, -1000, -1000, - 1858, -1000, -1000, 1647, 1616, 1541, -1000, -1000, -1000, -1000, - -1000, -1000, -275, -1000, -1000, 2442, -1000, -230, -1000, -1000, - 1848, 1493, -1000, -1000, -1000, 31336, 52854, -1000, -187, 376, - -200, 21690, 1961, 1478, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -20, -1000, -1000, 494, -1000, -1000, -1000, 1980, - -215, -1000, -1000, -1000, 310, -495, -317, -318, 23916, -1000, - 21690, -1000, 21690, -1000, 21690, -1000, 53596, 1529, -1000, -1000, - -1000, 1477, -1000, 5091, -342, 2111, -1000, -109, -1000, -1000, - -1000, 1059, 1408, -1000, -1000, -1000, -1000, -1000, -1000, 2305, - 53596, -1000, 417, -1000, -1000, 14994, -202, -219, 990, -1000, - -1000, -1000, -1000, -1000, 3283, 1488, 1303, 2191, -1000, 53596, - -1000, 52854, -330, 876, 6516, -1000, 2103, 2079, 2582, -1000, - -1000, -1000, -1000, -1000, -1000, -545, 1455, 245, -1000, -1000, - -1000, 310, -338, -1000, 21690, -1000, 21690, -1000, 1478, -1000, - -1000, 2417, 55, -1000, 2588, -1000, 2577, 907, 907, -1000, - 1144, -545, -1000, -1000, -1000, -1000, 2191, 2191, -1000, -361, - -1000, -1000, -1000, -1000, -1000, 413, 1240, -1000, -1000, -1000, - -1000, -1000, 6516, -1000, -1000, -1000, 282, 282, -1000, -1000, + 22251, -1000, 1378, 2167, -1000, -375, -1000, -514, 22251, -279, + -1000, -1000, -279, -1000, -1000, -1000, -1000, -1000, 22251, -1000, + -1000, 22251, -1000, 22251, -1000, -1000, 1671, -1000, -1000, -1000, + 37171, -1000, 1671, -1000, 1671, -1000, -288, -1000, 1900, -1000, + 54329, 1527, 391, -1000, 1191, -1000, -1000, -1000, -1000, -1000, + 55075, 54329, 1925, 54329, -1000, -1000, 1628, 1378, 1998, 2565, + -1000, 1604, -1000, 400, -1000, 2012, 2116, -1000, -1000, -1000, + 20013, -1000, -1000, -1000, -1000, -1000, 272, -197, 16271, 11759, + 1602, -1000, -195, 1681, 1554, -1000, -481, -1000, -1000, -1000, + -1000, 263, -1000, -1000, 1892, -1000, -1000, 1714, 1710, 1677, + -1000, -1000, -1000, -1000, -1000, -1000, -288, -1000, -1000, 2511, + -1000, -253, -1000, -1000, 1890, 1547, -1000, -1000, -1000, 31949, + 53583, -1000, -179, 325, -197, 22251, 2011, 1378, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -40, -1000, -1000, 540, + -1000, -1000, -1000, 2131, -212, -1000, -1000, -1000, 292, -497, + -259, -293, 24489, -1000, 22251, -1000, 22251, -1000, 22251, -1000, + 54329, 1998, -1000, -1000, -1000, 1484, -1000, 4304, -394, 2163, + -1000, -143, -1000, -1000, -1000, 1049, 1373, -1000, -1000, -1000, + -1000, -1000, -1000, 1850, 54329, -1000, 435, -1000, -1000, 15519, + -203, -228, 1010, -1000, -1000, -1000, -1000, -1000, 1029, 1616, + 1377, 1681, -1000, 54329, -1000, 53583, -387, 901, 5242, -1000, + 2159, 2155, 2657, -1000, -1000, -1000, -1000, -1000, -1000, -548, + 1482, 242, -1000, -1000, -1000, 292, -328, -1000, 22251, -1000, + 22251, -1000, 1378, -1000, -1000, 2496, 55, -1000, 2672, -1000, + 2675, 1014, 1014, -1000, 1126, -548, -1000, -1000, -1000, -1000, + 1681, 1681, -1000, -396, -1000, -1000, -1000, -1000, -1000, 430, + 1220, -1000, -1000, -1000, -1000, -1000, 5242, -1000, -1000, -1000, + 235, 235, -1000, -1000, } var yyPgo = [...]int{ - 0, 3230, 3220, 33, 5, 38, 37, 3214, 3213, 3212, - 176, 3211, 3209, 3205, 3204, 3203, 3202, 2650, 2613, 2609, - 3200, 3199, 3194, 3191, 3189, 3188, 3187, 3183, 3181, 43, - 115, 97, 113, 200, 212, 3176, 3175, 170, 165, 196, - 3174, 3171, 3168, 118, 189, 73, 81, 192, 3167, 3166, - 66, 3164, 3163, 3162, 187, 186, 184, 1061, 3161, 178, - 111, 47, 3160, 3159, 3157, 3151, 3150, 3147, 3145, 3142, - 3136, 3134, 3133, 3131, 3128, 3126, 3119, 3114, 3111, 3110, - 284, 3108, 3107, 14, 3106, 70, 3103, 3100, 3099, 3098, - 3097, 6, 3096, 3095, 30, 39, 59, 3093, 3092, 44, - 3091, 3087, 3085, 3083, 3082, 79, 3081, 15, 3078, 35, - 3072, 3071, 126, 3070, 3069, 3068, 40, 3067, 3065, 3061, - 9, 169, 3059, 3056, 140, 3055, 3052, 3048, 167, 202, - 3047, 2275, 3040, 94, 3037, 3031, 3030, 166, 193, 3029, - 123, 3006, 3004, 3002, 152, 3000, 3337, 2998, 2996, 63, - 67, 164, 2995, 2993, 199, 65, 10, 2991, 21, 19, - 2990, 2987, 64, 68, 2985, 112, 2982, 2981, 95, 72, - 2980, 90, 107, 2976, 2974, 27, 8, 2973, 1, 4, - 2, 105, 2966, 2963, 117, 2961, 2960, 2959, 93, 2955, - 2952, 3364, 2949, 83, 135, 96, 78, 2946, 172, 116, - 2942, 2940, 2939, 2936, 2929, 2928, 51, 2927, 2926, 2920, - 141, 1261, 102, 2914, 2908, 147, 344, 130, 52, 133, - 2905, 146, 2903, 208, 75, 2901, 171, 2900, 2899, 138, - 137, 2895, 2889, 55, 168, 195, 2888, 91, 129, 122, - 182, 89, 131, 2883, 2881, 57, 61, 2878, 2875, 2870, - 2866, 181, 2862, 2860, 58, 2859, 54, 2856, 191, 2854, - 306, 71, 2848, 180, 163, 2842, 60, 2841, 2840, 82, - 104, 121, 34, 2839, 157, 161, 127, 162, 2838, 2837, - 53, 2836, 2831, 2827, 194, 312, 2826, 2824, 350, 177, - 143, 150, 84, 2823, 318, 2822, 2819, 2813, 24, 4524, - 6056, 179, 32, 159, 2811, 2810, 7149, 48, 41, 11, - 2809, 210, 2807, 188, 2806, 2802, 2800, 217, 207, 99, - 158, 56, 2796, 2794, 2792, 2791, 42, 2790, 2789, 2788, - 2785, 2782, 2772, 36, 31, 29, 62, 197, 80, 7, - 92, 160, 154, 69, 2768, 2766, 2765, 120, 98, 2763, - 156, 155, 125, 101, 2742, 175, 144, 108, 2741, 87, - 28, 2740, 2737, 2736, 2731, 85, 2730, 2727, 2726, 2723, - 153, 148, 119, 77, 2719, 76, 114, 151, 145, 50, - 2717, 45, 2699, 2696, 26, 190, 25, 2695, 16, 103, - 110, 2693, 6238, 2692, 12, 304, 149, 2691, 2688, 13, - 17, 20, 2686, 2681, 2680, 2678, 136, 2677, 2672, 2668, - 2663, 23, 49, 22, 18, 106, 139, 74, 2660, 2656, - 142, 2654, 2643, 2642, 0, 1038, 128, 2629, 198, + 0, 3261, 3259, 47, 7, 36, 34, 3256, 3254, 3239, + 178, 3238, 3237, 3236, 3235, 3234, 3233, 2715, 2702, 2700, + 3229, 3228, 3226, 3225, 3224, 3222, 3220, 3218, 3217, 48, + 110, 72, 108, 213, 215, 3216, 3215, 184, 173, 202, + 3209, 3208, 3207, 116, 193, 83, 87, 197, 3202, 3195, + 78, 3191, 3189, 3188, 191, 190, 189, 1088, 3187, 188, + 114, 50, 3186, 3185, 3182, 3178, 3176, 3175, 3174, 3172, + 3170, 3168, 3167, 3165, 3162, 3156, 3155, 3153, 3150, 3146, + 309, 3143, 3142, 10, 3141, 66, 3139, 3135, 3133, 3130, + 3126, 12, 3125, 3123, 19, 42, 60, 3122, 3119, 49, + 3118, 3114, 3112, 3109, 3107, 45, 3105, 27, 3104, 37, + 3103, 3102, 128, 3100, 3099, 3098, 38, 3097, 3095, 3094, + 5, 170, 3093, 3091, 142, 3090, 3082, 3081, 169, 222, + 3078, 2332, 3074, 99, 3071, 3068, 3061, 174, 200, 3058, + 122, 3057, 3055, 3053, 155, 3044, 3333, 3041, 3039, 68, + 76, 156, 3036, 3034, 199, 74, 11, 3031, 15, 17, + 3030, 3025, 69, 64, 3021, 111, 3013, 3010, 103, 65, + 3009, 100, 97, 3008, 3006, 23, 18, 3003, 6, 1, + 8, 82, 3002, 3001, 119, 2997, 2983, 2982, 93, 2981, + 2979, 3360, 2977, 90, 136, 106, 70, 2968, 171, 153, + 2967, 2966, 2965, 2964, 2963, 2960, 53, 2958, 2957, 2954, + 140, 29, 113, 2953, 2950, 146, 346, 130, 54, 132, + 2947, 149, 2945, 203, 77, 2943, 175, 2941, 2940, 135, + 134, 2938, 2937, 57, 168, 194, 2928, 96, 131, 121, + 150, 94, 133, 2926, 2925, 58, 61, 2911, 2909, 2907, + 2904, 177, 2902, 2901, 62, 2900, 56, 2899, 167, 2897, + 302, 67, 2896, 180, 185, 2895, 73, 2891, 2889, 91, + 95, 102, 26, 2888, 163, 166, 127, 182, 2887, 2884, + 55, 2881, 2879, 2878, 201, 280, 2877, 2873, 308, 179, + 144, 152, 84, 2871, 325, 2869, 2864, 2863, 40, 4520, + 6444, 192, 22, 165, 2860, 2856, 7650, 44, 39, 24, + 2855, 210, 2854, 183, 2853, 2846, 2841, 238, 207, 112, + 164, 59, 2839, 2838, 2836, 2835, 35, 2830, 2828, 2818, + 2816, 2814, 2813, 33, 32, 31, 92, 216, 81, 20, + 98, 172, 157, 63, 2812, 2811, 2810, 125, 85, 2809, + 162, 159, 126, 101, 2807, 186, 145, 118, 2804, 105, + 30, 2799, 2798, 2797, 2796, 89, 2795, 2794, 2791, 2786, + 154, 147, 123, 79, 2784, 80, 120, 151, 148, 52, + 2782, 43, 2781, 2780, 28, 195, 25, 2776, 41, 107, + 117, 2775, 6234, 2774, 9, 335, 161, 2771, 2765, 4, + 13, 16, 2764, 2759, 2748, 2741, 138, 2740, 2739, 2738, + 2732, 21, 46, 14, 2, 115, 141, 71, 2730, 2727, + 143, 2726, 2724, 2708, 0, 1034, 129, 2701, 204, } -//line sql.y:8806 +//line sql.y:8811 type yySymType struct { union any empty struct{} @@ -8694,7 +8777,8 @@ var yyR1 = [...]int{ 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, - 299, 299, 424, 425, 317, 318, 318, 318, + 299, 299, 299, 299, 299, 299, 424, 425, 317, 318, + 318, 318, } var yyR2 = [...]int{ @@ -8927,7 +9011,8 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, } var yyChk = [...]int{ @@ -8938,155 +9023,156 @@ var yyChk = [...]int{ -8, -32, -31, -30, 13, 14, -110, -36, 35, -41, -51, 240, -52, -42, 241, -53, 243, 242, 280, 244, 397, 273, 83, 330, 331, 333, 334, 335, 336, -111, - 704, 278, 279, 246, 39, 51, 36, 37, 40, 250, + 708, 278, 279, 246, 39, 51, 36, 37, 40, 250, 286, 287, 249, 145, -33, -37, 12, -424, 15, 487, 275, 274, 31, -34, 597, 95, -35, 63, -81, -423, - 752, -258, -242, 26, 36, 32, -241, -237, -129, -242, + 756, -258, -242, 26, 36, 32, -241, -237, -129, -242, 24, 22, 11, -80, -80, -80, 16, 17, -80, -361, -363, 95, 173, 95, -80, -58, -57, -55, -54, -56, -59, 34, -48, -49, -385, -47, -44, 245, 242, 290, 135, 136, 280, 281, 282, 244, 264, 279, 283, 278, 299, -43, 90, 36, 597, 600, -368, 241, 247, 248, - 243, 488, 138, 137, 84, -365, 392, 631, 722, -59, - 724, 110, 113, 723, 50, 254, 725, 726, 727, 638, - 728, 263, 729, 730, 731, 732, 738, 679, 739, 740, - 741, 139, 11, -80, -310, -306, 100, -299, 594, 266, + 243, 488, 138, 137, 84, -365, 392, 631, 726, -59, + 728, 110, 113, 727, 50, 254, 729, 730, 731, 638, + 732, 263, 733, 734, 735, 736, 742, 679, 743, 744, + 745, 139, 11, -80, -310, -306, 100, -299, 594, 266, 629, 441, 630, 315, 90, 47, 42, 533, 604, 388, - 392, 631, 518, 722, 398, 330, 348, 342, 523, 524, - 525, 371, 363, 595, 632, 605, 318, 267, 303, 716, - 361, 149, 724, 322, 633, 281, 399, 400, 634, 401, - 110, 333, 438, 737, 321, 635, 735, 113, 723, 338, - 88, 517, 57, 719, 326, 50, 276, 446, 447, 359, - 249, 355, 725, 304, 636, 607, 297, 138, 135, 744, - 39, 351, 56, 33, 734, 137, 55, 726, 164, 637, - 727, 638, 403, 378, 710, 54, 404, 282, 639, 93, - 287, 599, 327, 718, 405, 538, 352, 406, 314, 733, - 246, 640, 325, 699, 691, 692, 407, 408, 711, 383, - 379, 384, 540, 641, 430, 522, 409, 695, 696, 751, - 58, 642, 643, 712, 136, 644, 87, 728, 89, 346, + 392, 631, 518, 726, 398, 330, 348, 342, 523, 524, + 525, 371, 363, 595, 632, 605, 318, 267, 303, 720, + 361, 149, 728, 322, 633, 281, 399, 400, 634, 401, + 110, 333, 438, 741, 321, 635, 739, 113, 727, 338, + 88, 517, 57, 723, 326, 50, 276, 446, 447, 359, + 249, 355, 729, 304, 636, 607, 297, 138, 135, 748, + 39, 351, 56, 33, 738, 137, 55, 730, 164, 637, + 731, 638, 403, 378, 714, 54, 404, 282, 639, 93, + 287, 599, 327, 722, 405, 538, 352, 406, 314, 737, + 246, 640, 325, 703, 695, 696, 407, 408, 715, 383, + 379, 384, 540, 641, 430, 522, 409, 699, 700, 755, + 58, 642, 643, 716, 136, 644, 87, 732, 89, 346, 347, 645, 312, 265, 543, 544, 432, 375, 500, 127, 507, 508, 120, 121, 503, 122, 509, 123, 128, 510, 511, 512, 501, 124, 117, 502, 513, 514, 376, 377, 125, 515, 119, 118, 504, 506, 126, 516, 263, 38, - 410, 596, 316, 64, 320, 291, 433, 52, 381, 748, - 51, 706, 545, 646, 709, 374, 370, 497, 59, 647, - 648, 649, 650, 519, 729, 373, 345, 369, 743, 4, - 309, 492, 520, 730, 68, 248, 386, 385, 387, 298, - 429, 366, 651, 652, 653, 270, 91, 654, 356, 25, - 655, 656, 411, 305, 657, 62, 658, 659, 436, 279, - 660, 60, 731, 45, 661, 284, 745, 732, 662, 663, - 664, 705, 665, 286, 666, 413, 667, 693, 694, 412, - 380, 382, 546, 293, 414, 397, 251, 598, 668, 328, - 350, 283, 736, 669, 271, 534, 535, 536, 537, 717, - 542, 541, 285, 290, 278, 437, 272, 670, 671, 672, - 673, 674, 319, 690, 675, 676, 334, 602, 738, 498, - 49, 677, 678, 679, 680, 681, 313, 308, 431, 440, - 67, 92, 394, 682, 683, 715, 344, 339, 43, 306, - 99, 478, 480, 481, 482, 483, 484, 479, 486, 684, - 331, 61, 739, 740, 741, 300, 742, 526, 527, 528, - 529, 13, 580, 563, 591, 564, 581, 565, 574, 566, - 582, 590, 592, 547, 555, 548, 556, 586, 569, 583, - 575, 568, 567, 589, 572, 576, 549, 557, 587, 573, - 550, 558, 551, 559, 552, 560, 585, 584, 577, 588, - 553, 561, 579, 554, 562, 578, 570, 571, 449, 749, - 750, 521, 416, 139, 310, 311, 53, 367, 292, 685, - 323, 686, 357, 358, 494, 495, 372, 343, 368, 146, - 702, 332, 341, 700, 294, 417, 499, 280, 687, 439, - 307, 389, 131, 340, 395, 324, 603, 539, 299, 418, - 714, 601, 530, 531, 365, 362, 301, 532, 688, 390, - 704, 419, 255, 295, 296, 689, 701, 420, 421, 317, - 422, 423, 424, 425, 426, 428, 329, 427, 703, 697, - 698, 302, 477, 600, 337, 360, 396, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 496, 253, -80, 253, -191, - -306, -131, 706, 708, 192, -277, 400, -295, 402, 415, - 410, 420, 408, -286, 411, 413, 293, -408, 430, 253, - 417, 240, 403, 412, 421, 422, 317, 428, 423, 329, - 427, 302, 424, 425, 426, -392, 192, 727, 742, 332, - 340, 149, 364, 407, 405, 431, 706, 100, -312, 100, - 101, 102, -299, 332, -315, 337, -300, -392, -299, 335, - -80, -80, -317, -317, -131, -211, -146, 157, -160, -266, - -163, 101, -151, -154, -205, -206, -207, -208, -161, -225, - -264, 181, 182, 189, 158, -221, -164, 29, 593, 489, - 488, 192, 34, 235, 77, 78, 491, 492, 160, 63, - 15, 454, 455, -162, 444, 445, 456, 450, 451, 517, - 519, 520, 521, 518, 523, 524, 525, 526, 527, 528, - 529, 530, 531, 532, 522, 533, 494, 495, 129, 496, - 117, 119, 118, 127, 128, 497, 498, 499, 361, 545, - 546, 540, 543, 544, 542, 541, 376, 377, 500, 563, - 564, 568, 567, 565, 566, 569, 572, 573, 574, 575, - 576, 577, 579, 578, 570, 571, 548, 547, 549, 550, - 551, 552, 553, 554, 556, 555, 557, 558, 559, 560, - 561, 562, 580, 581, 582, 583, 584, 586, 585, 590, - 589, 587, 588, 592, 591, 501, 502, 120, 121, 122, - 123, 124, 125, 126, 503, 506, 504, 505, 507, 508, - 509, 514, 515, 510, 511, 512, 513, 516, 387, 385, - 386, 382, 381, 380, -90, -103, 620, 619, -104, 441, - 446, 447, 449, -152, -153, -166, -167, -300, -306, 258, - 443, 252, 187, 487, -155, -149, -223, 116, 102, -31, - -220, 442, 452, 453, 457, 448, 458, 606, 608, 623, - 624, 626, 611, 616, 615, 618, 534, 535, 536, 537, - 538, 539, 691, 692, 693, 694, 695, 696, 697, 698, - -392, -299, 100, -158, -156, -200, 103, 108, 111, 112, - 114, -414, 276, 357, 358, 130, -424, -216, -217, -157, - 105, 106, 107, 132, 133, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 720, 98, 104, - 50, 416, 416, -191, -80, -80, -80, -80, -421, 723, - 598, -235, -129, -237, -33, -31, -424, 12, -80, -31, - -32, -30, -37, -39, 625, -38, -306, -80, 109, -242, - -258, 16, 67, 176, 48, 56, -240, -241, -34, -31, - -146, 23, 41, 27, -133, 183, -146, -306, -133, -284, - 257, -80, -80, -273, -320, 332, -275, 431, 706, 430, - -265, -278, 100, -264, -277, 429, 101, -362, 173, -348, - -352, -300, 268, -378, 264, -191, -371, -370, -300, -424, - -130, -294, 254, 262, 261, 150, -395, 153, 310, 443, - 252, -54, -55, -56, -277, 191, 726, -112, 285, 289, - 96, 96, -352, -351, -350, -396, 289, 268, -377, -369, - 260, 269, -358, 261, 262, -353, 254, 151, -396, -353, - 259, 269, 264, 268, 289, 289, 139, 289, 139, 289, - 289, 289, 289, 289, 289, 289, 289, 289, 284, -359, - 165, -359, 601, 601, -365, -396, 264, 254, -396, -396, - 260, -296, -353, 256, 28, 256, 38, 38, -359, -359, - -359, -277, 191, -359, -359, -359, -359, 297, 297, -359, + 410, 596, 316, 64, 320, 291, 433, 52, 381, 752, + 51, 710, 545, 646, 713, 374, 370, 497, 691, 59, + 647, 648, 649, 650, 519, 733, 373, 345, 369, 747, + 4, 309, 492, 520, 734, 68, 248, 386, 385, 387, + 298, 429, 366, 651, 652, 653, 270, 91, 654, 356, + 25, 655, 656, 411, 305, 657, 62, 658, 659, 436, + 279, 660, 60, 735, 692, 45, 661, 284, 749, 736, + 662, 663, 664, 709, 665, 286, 666, 413, 667, 697, + 698, 412, 380, 382, 546, 293, 414, 397, 693, 251, + 598, 668, 328, 350, 283, 740, 669, 271, 534, 535, + 536, 537, 721, 542, 541, 285, 290, 278, 437, 272, + 670, 671, 672, 673, 674, 319, 690, 675, 676, 334, + 602, 742, 498, 49, 677, 678, 679, 680, 681, 313, + 308, 431, 440, 67, 92, 394, 682, 683, 719, 344, + 339, 43, 306, 99, 478, 480, 481, 482, 483, 484, + 479, 486, 684, 331, 61, 743, 744, 745, 300, 746, + 526, 527, 528, 529, 13, 580, 563, 591, 564, 581, + 565, 574, 566, 582, 590, 592, 547, 555, 548, 556, + 586, 569, 583, 575, 568, 567, 589, 572, 576, 549, + 557, 587, 573, 550, 558, 551, 559, 552, 560, 585, + 584, 577, 588, 553, 561, 579, 554, 562, 578, 570, + 571, 449, 753, 754, 521, 416, 694, 139, 310, 311, + 53, 367, 292, 685, 323, 686, 357, 358, 494, 495, + 372, 343, 368, 146, 706, 332, 341, 704, 294, 417, + 499, 280, 687, 439, 307, 389, 131, 340, 395, 324, + 603, 539, 299, 418, 718, 601, 530, 531, 365, 362, + 301, 532, 688, 390, 708, 419, 255, 295, 296, 689, + 705, 420, 421, 317, 422, 423, 424, 425, 426, 428, + 329, 427, 707, 701, 702, 302, 477, 600, 337, 360, + 396, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 496, + 253, -80, 253, -191, -306, -131, 710, 712, 192, -277, + 400, -295, 402, 415, 410, 420, 408, -286, 411, 413, + 293, -408, 430, 253, 417, 240, 403, 412, 421, 422, + 317, 428, 423, 329, 427, 302, 424, 425, 426, -392, + 192, 731, 746, 332, 340, 149, 364, 407, 405, 431, + 710, 100, -312, 100, 101, 102, -299, 332, -315, 337, + -300, -392, -299, 335, -80, -80, -317, -317, -131, -211, + -146, 157, -160, -266, -163, 101, -151, -154, -205, -206, + -207, -208, -161, -225, -264, 181, 182, 189, 158, -221, + -164, 29, 593, 489, 488, 192, 34, 235, 77, 78, + 491, 492, 160, 63, 15, 454, 455, -162, 444, 445, + 456, 450, 451, 517, 519, 520, 521, 518, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 522, 533, + 494, 495, 129, 496, 117, 119, 118, 127, 128, 497, + 498, 499, 361, 545, 546, 540, 543, 544, 542, 541, + 376, 377, 500, 563, 564, 568, 567, 565, 566, 569, + 572, 573, 574, 575, 576, 577, 579, 578, 570, 571, + 548, 547, 549, 550, 551, 552, 553, 554, 556, 555, + 557, 558, 559, 560, 561, 562, 580, 581, 582, 583, + 584, 586, 585, 590, 589, 587, 588, 592, 591, 501, + 502, 120, 121, 122, 123, 124, 125, 126, 503, 506, + 504, 505, 507, 508, 509, 514, 515, 510, 511, 512, + 513, 516, 387, 385, 386, 382, 381, 380, -90, -103, + 620, 619, -104, 441, 446, 447, 449, -152, -153, -166, + -167, -300, -306, 258, 443, 252, 187, 487, -155, -149, + -223, 116, 102, -31, -220, 442, 452, 453, 457, 448, + 458, 606, 608, 623, 624, 626, 611, 616, 615, 618, + 534, 535, 536, 537, 538, 539, 695, 696, 697, 698, + 699, 700, 701, 702, -392, -299, 100, -158, -156, -200, + 103, 108, 111, 112, 114, -414, 276, 357, 358, 130, + -424, -216, -217, -157, 105, 106, 107, 132, 133, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 724, 98, 104, 50, 416, 416, -191, -80, -80, + -80, -80, -421, 727, 598, -235, -129, -237, -33, -31, + -424, 12, -80, -31, -32, -30, -37, -39, 625, -38, + -306, -80, 109, -242, -258, 16, 67, 176, 48, 56, + -240, -241, -34, -31, -146, 23, 41, 27, -133, 183, + -146, -306, -133, -284, 257, -80, -80, -273, -320, 332, + -275, 431, 710, 430, -265, -278, 100, -264, -277, 429, + 101, -362, 173, -348, -352, -300, 268, -378, 264, -191, + -371, -370, -300, -424, -130, -294, 254, 262, 261, 150, + -395, 153, 310, 443, 252, -54, -55, -56, -277, 191, + 730, -112, 285, 289, 96, 96, -352, -351, -350, -396, + 289, 268, -377, -369, 260, 269, -358, 261, 262, -353, + 254, 151, -396, -353, 259, 269, 264, 268, 289, 289, + 139, 289, 139, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 284, -359, 165, -359, 601, 601, -365, -396, + 264, 254, -396, -396, 260, -296, -353, 256, 28, 256, + 38, 38, -359, -359, -359, -277, 191, -359, -359, -359, + -359, 297, 297, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, -359, - -359, -359, -359, -359, -359, -359, 253, -395, -138, 427, - 317, 90, -57, 299, -40, -191, -294, 254, 255, -395, - 286, -191, 236, 253, 709, -288, 173, 19, -288, -285, - 416, 414, 401, 406, -288, -288, -288, -288, 300, 399, - -354, 254, 38, 265, 416, 300, 399, 300, 301, 300, - 301, 409, 419, 300, -311, 18, 176, 443, 404, 408, - 293, 253, 294, 255, 418, 301, -311, 98, -289, 173, - 300, 416, 410, 296, -288, -288, -318, -424, -302, -300, - -298, 245, 41, 156, 28, 30, 159, 192, 142, 23, - 160, 40, 247, 364, 264, 191, 260, 488, 240, 81, - 606, 444, 451, 442, 450, 454, 490, 491, 443, 402, - 34, 17, 608, 31, 274, 27, 44, 185, 242, 163, - 609, 277, 29, 275, 129, 133, 611, 26, 84, 269, - 18, 262, 46, 20, 612, 613, 21, 74, 258, 257, - 176, 254, 79, 15, 235, 32, 172, 75, 614, 151, - 145, 615, 616, 617, 618, 143, 77, 173, 24, 746, - 452, 453, 36, 707, 593, 288, 187, 82, 65, 708, - 157, 448, 619, 620, 130, 621, 134, 85, 713, 153, - 22, 80, 48, 622, 289, 623, 259, 747, 624, 434, - 625, 174, 243, 487, 78, 175, 720, 626, 721, 252, - 415, 12, 493, 35, 273, 261, 73, 72, 141, 76, - 458, 627, 253, 162, 256, 144, 132, 11, 150, 37, - 16, 83, 86, 455, 456, 457, 63, 140, 597, 161, - 19, 628, 435, 155, -392, 709, -318, -318, 300, 341, - 35, 101, -418, -419, -420, 597, 434, 256, -300, -191, - -86, 699, 244, -87, 705, 41, 251, 146, 38, -136, - 416, -124, 192, 727, 710, 711, 712, 709, 413, 717, - 715, 713, 300, 714, 96, 153, 155, 156, 4, -146, - 172, -201, -202, 171, 165, 166, 167, 168, 169, 170, - 177, 176, 157, 159, 173, -251, 154, 178, 179, 180, - 181, 182, 183, 184, 186, 185, 187, 188, 174, 175, - 191, 238, 239, -154, -154, -154, -154, -221, -227, -226, - -424, -223, -392, -299, -306, -424, -424, -154, -283, -424, - -151, -424, -424, -424, -424, -424, -230, -146, -424, -424, - -428, -424, -428, -428, -428, -337, -424, -337, -337, -424, + 253, -395, -138, 427, 317, 90, -57, 299, -40, -191, + -294, 254, 255, -395, 286, -191, 236, 253, 713, -288, + 173, 19, -288, -285, 416, 414, 401, 406, -288, -288, + -288, -288, 300, 399, -354, 254, 38, 265, 416, 300, + 399, 300, 301, 300, 301, 409, 419, 300, -311, 18, + 176, 443, 404, 408, 293, 253, 294, 255, 418, 301, + -311, 98, -289, 173, 300, 416, 410, 296, -288, -288, + -318, -424, -302, -300, -298, 245, 41, 156, 28, 30, + 159, 192, 142, 23, 160, 40, 247, 364, 264, 191, + 260, 488, 240, 81, 606, 444, 451, 442, 450, 454, + 490, 491, 443, 402, 34, 17, 608, 31, 274, 27, + 44, 185, 242, 163, 609, 277, 29, 275, 129, 133, + 611, 26, 84, 269, 18, 262, 46, 20, 612, 613, + 21, 74, 258, 257, 176, 254, 79, 15, 235, 32, + 172, 75, 614, 151, 145, 615, 616, 617, 618, 143, + 77, 173, 24, 750, 452, 453, 36, 711, 593, 288, + 187, 82, 65, 712, 157, 448, 619, 620, 130, 621, + 134, 85, 717, 153, 22, 80, 48, 622, 289, 623, + 259, 751, 624, 434, 625, 174, 243, 487, 78, 175, + 724, 626, 725, 252, 415, 12, 493, 35, 273, 261, + 73, 72, 141, 76, 458, 627, 253, 162, 256, 144, + 132, 11, 150, 37, 16, 83, 86, 455, 456, 457, + 63, 140, 597, 161, 19, 628, 435, 155, -392, 713, + -318, -318, 300, 341, 35, 101, -418, -419, -420, 597, + 434, 256, -300, -191, -86, 703, 244, -87, 709, 41, + 251, 146, 38, -136, 416, -124, 192, 731, 714, 715, + 716, 713, 413, 721, 719, 717, 300, 718, 96, 153, + 155, 156, 4, -146, 172, -201, -202, 171, 165, 166, + 167, 168, 169, 170, 177, 176, 157, 159, 173, -251, + 154, 178, 179, 180, 181, 182, 183, 184, 186, 185, + 187, 188, 174, 175, 191, 238, 239, -154, -154, -154, + -154, -221, -227, -226, -424, -223, -392, -299, -306, -424, + -424, -154, -283, -424, -151, -424, -424, -424, -424, -424, + -230, -146, -424, -424, -428, -424, -428, -428, -428, -337, + -424, -337, -337, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, @@ -9098,265 +9184,265 @@ var yyChk = [...]int{ -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, + -424, -424, -424, -424, -424, -424, -424, -424, 236, -424, + -424, -424, -424, -424, -337, -337, -337, -337, -337, -337, -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, - -424, -424, -424, -424, 236, -424, -424, -424, -424, -424, - -337, -337, -337, -337, -337, -337, -424, -424, -424, -424, - -424, -424, -424, -424, -424, -424, -424, -424, -424, -424, - 98, 112, 108, 111, 103, 114, 98, 98, 98, 98, - -31, -32, -211, 63, -424, -317, -405, -406, -194, -191, - -424, 317, -300, -300, 286, 105, -240, -34, -31, -235, - -241, -237, -31, -80, -122, -135, 69, 70, -134, -137, - 27, 44, 74, 76, 99, 72, 73, 71, 41, -425, - 97, -425, -258, -425, 96, -39, -261, 95, 115, -214, - -219, -217, 720, 653, 683, 653, 683, 67, 49, 98, - 98, 96, 25, -236, -238, -146, 18, -304, 4, -303, - 28, -300, 98, 236, 18, -192, 32, -191, -284, -284, - 96, 100, 332, -274, -276, 432, 434, 165, -305, -300, - 98, 34, 97, 96, -191, -326, -329, -331, -330, -332, - -327, -328, 361, 362, 192, 365, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 378, 390, 35, 276, 357, - 358, 359, 360, 379, 380, 381, 382, 384, 385, 386, - 387, 342, 363, 595, 343, 344, 345, 346, 347, 348, - 350, 351, 354, 352, 353, 355, 356, -301, -300, 95, - 97, 96, -336, 95, -146, -138, 253, -300, 254, 254, - 254, -291, 258, 487, -359, -359, -359, 284, 23, -47, - -44, -385, 22, -43, -44, 245, 135, 136, 242, 95, - -348, 95, -357, -301, -300, 95, 151, 259, 150, -356, - -353, -356, -357, -300, -223, -300, 151, 151, -300, -300, - -270, -300, -270, -270, 41, -270, 41, -270, 41, 105, - -300, -270, 41, -270, 41, -270, 41, -270, 41, -270, - 41, 34, 87, 88, 89, 34, 91, 92, 93, -223, - -300, -300, -223, -348, -223, -191, -300, -277, 105, 105, - 105, -359, -359, 105, 98, 98, 98, -359, -359, 105, - 98, -308, -306, 98, 98, -397, 270, 314, 316, 105, - 105, 105, 105, 34, 98, -398, 34, 734, 733, 735, - 736, 737, 98, 105, 34, 105, 34, 105, -300, 95, - -191, -144, 304, 240, 242, 245, 85, 98, 322, 320, - 321, 318, 323, 324, 325, 165, 50, 96, 256, 253, - -300, -290, 258, -290, -300, -307, -306, -298, -191, 256, - 398, 98, -146, -355, 18, 176, -311, -311, -288, -191, - -355, -311, -288, -191, -288, -288, -288, -288, -311, -311, - -311, -288, -306, -306, -191, -191, -191, -191, -191, -191, - -191, -318, -289, -288, 709, 98, -282, 18, 85, -318, - -318, -297, 26, 26, 96, 338, 435, 436, -316, 335, - -82, -300, 98, -10, -29, -18, -17, -19, 165, -10, - 96, 597, -184, -191, 709, 709, 709, 709, 709, 709, - -146, -146, -146, -146, 621, -209, -416, 157, 132, 133, - 130, 131, -163, 42, 43, 41, -146, -210, -216, -221, - 115, 176, 159, 173, -251, -151, -154, -151, -151, -151, - -151, -151, -151, 235, -151, 235, -151, -151, -151, -151, - -151, -151, -319, -300, 98, 192, -159, -158, 114, -414, - -159, 594, 96, -226, 236, -146, -146, -392, -120, 460, - 461, 462, 463, 465, 466, 467, 470, 471, 475, 476, - 459, 477, 464, 469, 472, 473, 474, 468, 360, -146, - -212, -211, -212, -146, -146, -228, -229, 161, -223, -146, - -425, -425, 105, 183, -128, 27, 44, -128, -128, -128, - -128, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -146, -128, -146, -121, 459, 477, 464, 469, 472, 473, - 474, 468, 360, 478, 479, 480, 481, 482, 483, 484, - 485, 486, -121, -120, -146, -146, -146, -146, -146, -146, - -146, -146, -88, -146, 142, 143, 144, -211, -146, -151, - -146, -146, -146, -425, -146, -146, -146, -212, -146, -146, - -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -424, -424, -424, -424, 98, 112, 108, 111, 103, 114, + 98, 98, 98, 98, -31, -32, -211, 63, -424, -317, + -405, -406, -194, -191, -424, 317, -300, -300, 286, 105, + -240, -34, -31, -235, -241, -237, -31, -80, -122, -135, + 69, 70, -134, -137, 27, 44, 74, 76, 99, 72, + 73, 71, 41, -425, 97, -425, -258, -425, 96, -39, + -261, 95, 115, -214, -219, -217, 724, 653, 683, 653, + 683, 67, 49, 98, 98, 96, 25, -236, -238, -146, + 18, -304, 4, -303, 28, -300, 98, 236, 18, -192, + 32, -191, -284, -284, 96, 100, 332, -274, -276, 432, + 434, 165, -305, -300, 98, 34, 97, 96, -191, -326, + -329, -331, -330, -332, -327, -328, 361, 362, 192, 365, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 378, + 390, 35, 276, 357, 358, 359, 360, 379, 380, 381, + 382, 384, 385, 386, 387, 342, 363, 595, 343, 344, + 345, 346, 347, 348, 350, 351, 354, 352, 353, 355, + 356, -301, -300, 95, 97, 96, -336, 95, -146, -138, + 253, -300, 254, 254, 254, -291, 258, 487, -359, -359, + -359, 284, 23, -47, -44, -385, 22, -43, -44, 245, + 135, 136, 242, 95, -348, 95, -357, -301, -300, 95, + 151, 259, 150, -356, -353, -356, -357, -300, -223, -300, + 151, 151, -300, -300, -270, -300, -270, -270, 41, -270, + 41, -270, 41, 105, -300, -270, 41, -270, 41, -270, + 41, -270, 41, -270, 41, 34, 87, 88, 89, 34, + 91, 92, 93, -223, -300, -300, -223, -348, -223, -191, + -300, -277, 105, 105, 105, -359, -359, 105, 98, 98, + 98, -359, -359, 105, 98, -308, -306, 98, 98, -397, + 270, 314, 316, 105, 105, 105, 105, 34, 98, -398, + 34, 738, 737, 739, 740, 741, 98, 105, 34, 105, + 34, 105, -300, 95, -191, -144, 304, 240, 242, 245, + 85, 98, 322, 320, 321, 318, 323, 324, 325, 165, + 50, 96, 256, 253, -300, -290, 258, -290, -300, -307, + -306, -298, -191, 256, 398, 98, -146, -355, 18, 176, + -311, -311, -288, -191, -355, -311, -288, -191, -288, -288, + -288, -288, -311, -311, -311, -288, -306, -306, -191, -191, + -191, -191, -191, -191, -191, -318, -289, -288, 713, 98, + -282, 18, 85, -318, -318, -297, 26, 26, 96, 338, + 435, 436, -316, 335, -82, -300, 98, -10, -29, -18, + -17, -19, 165, -10, 96, 597, -184, -191, 713, 713, + 713, 713, 713, 713, -146, -146, -146, -146, 621, -209, + -416, 157, 132, 133, 130, 131, -163, 42, 43, 41, + -146, -210, -216, -221, 115, 176, 159, 173, -251, -151, + -154, -151, -151, -151, -151, -151, -151, 235, -151, 235, + -151, -151, -151, -151, -151, -151, -319, -300, 98, 192, + -159, -158, 114, -414, -159, 594, 96, -226, 236, -146, + -146, -392, -120, 460, 461, 462, 463, 465, 466, 467, + 470, 471, 475, 476, 459, 477, 464, 469, 472, 473, + 474, 468, 360, -146, -212, -211, -212, -146, -146, -228, + -229, 161, -223, -146, -425, -425, 105, 183, -128, 27, + 44, -128, -128, -128, -128, -146, -146, -146, -146, -146, + -146, -146, -146, -146, -146, -128, -146, -121, 459, 477, + 464, 469, 472, 473, 474, 468, 360, 478, 479, 480, + 481, 482, 483, 484, 485, 486, -121, -120, -146, -146, + -146, -146, -146, -146, -146, -146, -88, -146, 142, 143, + 144, -211, -146, -151, -146, -146, -146, -425, -146, -146, + -146, -212, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -146, -146, -146, -146, -391, -390, -389, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -146, -391, -390, + -389, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -211, -211, -211, -211, -211, -146, -425, -146, -165, -149, - 105, -266, 114, 101, -146, -146, -146, -146, -146, -146, - -212, -302, -307, -298, -299, -211, -212, -212, -211, -211, - -146, -146, -146, -146, -146, -146, -146, -146, -425, -146, - -146, -146, -146, -146, -258, -425, -211, 96, -407, 434, - 435, 707, -309, 289, -308, 28, -212, 98, 18, -268, - 86, -300, -240, -240, 69, 70, 65, -132, -133, -137, - -425, -38, 28, -260, -300, 96, -424, 646, 646, 68, - 98, -338, -277, 388, 389, 192, -146, -146, 96, -239, - 30, 31, -191, -303, 183, -307, -191, -269, 289, -191, - -169, -171, -172, -173, -194, -222, -424, -174, -31, 617, - 614, 18, -184, -185, -193, -306, -275, -320, -274, 96, - 433, 435, 436, 85, 134, -146, -339, 191, -367, -366, - -365, -348, -350, -351, -352, 97, -339, -344, 395, 394, - -336, -336, -336, -336, -336, -338, -338, -338, -338, 95, - -336, 95, -336, -336, -336, -336, -341, 95, -341, -341, - -342, -341, 95, -342, -343, 95, -343, -378, -146, -375, - -374, -372, -373, 263, 110, 689, 645, 597, 638, 679, - 86, -370, -239, 105, -425, -144, -291, -376, -373, -300, - -300, -300, -306, 157, 100, 98, 100, 98, 100, 98, - -113, -61, -1, 746, 747, 748, 96, 23, -349, -348, - -60, 314, -381, -382, 289, -377, -371, -357, 151, -356, - -357, -357, -300, 96, 32, 139, 139, 139, 139, 597, - 242, 35, -292, 637, 157, 689, 645, -348, -60, 256, - 256, -319, -319, -319, 98, 98, -287, 742, -184, -140, - 306, 165, 295, 295, 253, 308, 253, 308, -191, 319, - 322, 320, 321, 318, 323, 324, 325, 326, 41, 41, - 41, 41, 41, 41, 41, 307, 309, 311, 297, -191, - -191, -290, 85, -186, -191, 29, -306, 98, 98, -191, - -288, -288, -191, -288, -288, -191, 98, -306, -420, 339, - -300, 375, 700, 702, -124, 434, 96, 597, 26, -125, - 26, -424, -416, 132, 133, -221, -221, -221, -210, -151, - -154, -151, 156, 277, -151, -151, -424, -223, -425, -302, - 28, 96, 86, -425, 181, 96, -425, -425, 96, 18, - 96, -231, -229, 163, -146, -425, 96, -425, -425, -211, - -146, -146, -146, -146, -425, -425, -425, -425, -425, -425, - -425, -425, -425, -425, -211, -425, 96, 96, 18, -323, - 28, -425, -425, -425, -425, 96, -425, -425, -230, -425, - 18, -425, 86, 96, 176, 96, -425, -425, -425, 96, - 96, -425, -425, 96, -425, 96, -425, -425, -425, -425, - -425, -425, 96, -425, 96, -425, -425, -425, 96, -425, - 96, -425, -425, 96, -425, 96, -425, 96, -425, 96, + -146, -146, -146, -146, -211, -211, -211, -211, -211, -146, + -425, -146, -165, -149, 105, -266, 114, 101, -146, -146, + -146, -146, -146, -146, -212, -302, -307, -298, -299, -211, + -212, -212, -211, -211, -146, -146, -146, -146, -146, -146, + -146, -146, -425, -146, -146, -146, -146, -146, -258, -425, + -211, 96, -407, 434, 435, 711, -309, 289, -308, 28, + -212, 98, 18, -268, 86, -300, -240, -240, 69, 70, + 65, -132, -133, -137, -425, -38, 28, -260, -300, 96, + -424, 646, 646, 68, 98, -338, -277, 388, 389, 192, + -146, -146, 96, -239, 30, 31, -191, -303, 183, -307, + -191, -269, 289, -191, -169, -171, -172, -173, -194, -222, + -424, -174, -31, 617, 614, 18, -184, -185, -193, -306, + -275, -320, -274, 96, 433, 435, 436, 85, 134, -146, + -339, 191, -367, -366, -365, -348, -350, -351, -352, 97, + -339, -344, 395, 394, -336, -336, -336, -336, -336, -338, + -338, -338, -338, 95, -336, 95, -336, -336, -336, -336, + -341, 95, -341, -341, -342, -341, 95, -342, -343, 95, + -343, -378, -146, -375, -374, -372, -373, 263, 110, 689, + 645, 597, 638, 679, 86, -370, -239, 105, -425, -144, + -291, -376, -373, -300, -300, -300, -306, 157, 100, 98, + 100, 98, 100, 98, -113, -61, -1, 750, 751, 752, + 96, 23, -349, -348, -60, 314, -381, -382, 289, -377, + -371, -357, 151, -356, -357, -357, -300, 96, 32, 139, + 139, 139, 139, 597, 242, 35, -292, 637, 157, 689, + 645, -348, -60, 256, 256, -319, -319, -319, 98, 98, + -287, 746, -184, -140, 306, 165, 295, 295, 253, 308, + 253, 308, -191, 319, 322, 320, 321, 318, 323, 324, + 325, 326, 41, 41, 41, 41, 41, 41, 41, 307, + 309, 311, 297, -191, -191, -290, 85, -186, -191, 29, + -306, 98, 98, -191, -288, -288, -191, -288, -288, -191, + 98, -306, -420, 339, -300, 375, 704, 706, -124, 434, + 96, 597, 26, -125, 26, -424, -416, 132, 133, -221, + -221, -221, -210, -151, -154, -151, 156, 277, -151, -151, + -424, -223, -425, -302, 28, 96, 86, -425, 181, 96, + -425, -425, 96, 18, 96, -231, -229, 163, -146, -425, + 96, -425, -425, -211, -146, -146, -146, -146, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -211, -425, + 96, 96, 18, -323, 28, -425, -425, -425, -425, 96, + -425, -425, -230, -425, 18, -425, 86, 96, 176, 96, + -425, -425, -425, 96, 96, -425, -425, 96, -425, 96, + -425, -425, -425, -425, -425, -425, 96, -425, 96, -425, + -425, -425, 96, -425, 96, -425, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, - -425, 96, -425, 96, -425, 96, -425, 96, -425, -425, - -425, 96, -425, 96, -425, 96, -425, -425, 96, -425, - 96, -425, 96, -425, 96, 96, -425, 96, 96, 96, - -425, 96, 96, 96, 96, -425, -425, -425, -425, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, -425, - -425, -425, -425, -425, -425, 96, -95, 622, -425, -425, - 96, -425, 96, 96, 96, 96, 96, -425, -424, 236, - -425, -425, -425, -425, -425, 96, 96, 96, 96, 96, - 96, -425, -425, -425, 96, 96, -425, 96, -425, 96, - -425, -406, 706, 435, -198, -197, -195, 83, 257, 84, - -424, -308, -425, -159, -266, -267, -266, -204, -300, 105, - 114, -242, -168, 96, -170, 18, -221, 97, 96, -219, - -425, -338, -246, -252, -285, -300, 98, 192, -340, 192, - -340, 388, 389, -238, 236, -199, 19, -203, 35, 63, - -29, -424, -424, 35, 96, -187, -189, -188, -190, 75, - 79, 81, 76, 77, 78, 82, -314, 28, -31, -169, - -31, -424, -191, -184, -426, 18, 86, -426, 96, 236, - -276, -279, 437, 434, 440, -392, 98, -112, 96, -365, - -352, -243, -141, 46, -345, 396, -338, 605, -338, -347, - 98, -347, 105, 105, 105, 97, -50, -45, -46, 36, - 90, -372, -359, 98, 45, -359, -359, -300, 97, -239, - -140, -191, 85, -376, -376, -376, 29, -2, 745, 751, - 151, 95, 401, 22, -260, 96, 97, -224, 315, 97, - -114, -300, 97, 95, -357, -357, -300, -424, 253, 34, - 34, 689, 645, 637, -60, -224, -223, -300, -339, 744, - 743, 97, 255, 313, -145, 454, -142, 98, 100, -191, - -191, -191, -191, -191, -191, 245, 242, 424, -415, 327, - 98, -415, 298, 256, -184, -191, 96, -85, 272, 267, - -311, -311, 36, -191, 434, 718, 716, -146, 156, 277, - -163, -154, -120, -120, -151, -321, 192, 361, 276, 359, - 355, 375, 366, 394, 357, 395, 352, 351, 350, -321, - -319, -151, -211, -146, -146, -146, 164, -146, 162, -146, - -96, -95, -425, -425, -425, -425, -425, -96, -96, -96, - -96, -96, -96, -96, -96, -96, -96, -235, -146, -146, - -146, -425, 192, 361, -96, -146, 18, -146, -319, -146, - -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, + -425, 96, -425, -425, -425, 96, -425, 96, -425, 96, + -425, -425, 96, -425, 96, -425, 96, -425, 96, 96, + -425, 96, 96, 96, -425, 96, 96, 96, 96, -425, + -425, -425, -425, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, -425, -425, -425, -425, -425, -425, 96, + -95, 622, -425, -425, 96, -425, 96, 96, 96, 96, + 96, -425, -424, 236, -425, -425, -425, -425, -425, 96, + 96, 96, 96, 96, 96, -425, -425, -425, 96, 96, + -425, 96, -425, 96, -425, -406, 710, 435, -198, -197, + -195, 83, 257, 84, -424, -308, -425, -159, -266, -267, + -266, -204, -300, 105, 114, -242, -168, 96, -170, 18, + -221, 97, 96, -219, -425, -338, -246, -252, -285, -300, + 98, 192, -340, 192, -340, 388, 389, -238, 236, -199, + 19, -203, 35, 63, -29, -424, -424, 35, 96, -187, + -189, -188, -190, 75, 79, 81, 76, 77, 78, 82, + -314, 28, -31, -169, -31, -424, -191, -184, -426, 18, + 86, -426, 96, 236, -276, -279, 437, 434, 440, -392, + 98, -112, 96, -365, -352, -243, -141, 46, -345, 396, + -338, 605, -338, -347, 98, -347, 105, 105, 105, 97, + -50, -45, -46, 36, 90, -372, -359, 98, 45, -359, + -359, -300, 97, -239, -140, -191, 85, -376, -376, -376, + 29, -2, 749, 755, 151, 95, 401, 22, -260, 96, + 97, -224, 315, 97, -114, -300, 97, 95, -357, -357, + -300, -424, 253, 34, 34, 689, 645, 637, -60, -224, + -223, -300, -339, 748, 747, 97, 255, 313, -145, 454, + -142, 98, 100, -191, -191, -191, -191, -191, -191, 245, + 242, 424, -415, 327, 98, -415, 298, 256, -184, -191, + 96, -85, 272, 267, -311, -311, 36, -191, 434, 722, + 720, -146, 156, 277, -163, -154, -120, -120, -151, -321, + 192, 361, 276, 359, 355, 375, 366, 394, 357, 395, + 352, 351, 350, -321, -319, -151, -211, -146, -146, -146, + 164, -146, 162, -146, -96, -95, -425, -425, -425, -425, + -425, -96, -96, -96, -96, -96, -96, -96, -96, -96, + -96, -235, -146, -146, -146, -425, 192, 361, -96, -146, + 18, -146, -319, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -146, -146, -146, -146, -389, -146, -211, -146, -211, -146, - -146, -146, -146, -146, -390, -390, -390, -390, -390, -211, - -211, -211, -211, -146, -424, -300, -99, -98, -97, 672, - 257, -95, -165, -99, -165, 235, -146, 235, 235, 235, - -146, -212, -302, -146, -146, -146, -146, -146, -146, -146, - -146, -146, -146, -195, -353, 295, -353, 295, -353, -270, - 96, -281, 26, 18, 63, 63, -168, -199, -133, -169, - -300, -249, 699, -255, 52, -253, -254, 53, -250, 54, - 62, -340, -340, 183, -240, -146, -271, 85, -272, -280, - -223, -215, -218, -216, -424, -259, -425, -300, -270, -272, - -171, -172, -172, -171, -172, 75, 75, 75, 80, 75, - 80, 75, -188, -306, -425, -146, -309, 86, -169, -169, - -193, -306, 183, 434, 438, 439, -365, -413, 130, 157, - 34, 85, 392, 110, -411, 191, 634, 684, 689, 645, - 638, 679, -412, 259, 150, 151, 271, 28, 47, 97, - 96, 97, 96, 97, 97, 96, -293, -292, -46, -45, - -359, -359, 105, -392, 98, 98, 255, -191, 85, 85, - 85, -115, 749, 105, 95, -3, 90, -146, 95, 23, - -348, -223, -383, -333, -384, -334, -335, -5, -6, -360, - -118, 63, 110, -64, 50, 254, 729, 730, 139, -424, - 742, -375, -260, -379, -381, -191, -150, -424, -162, -148, - -147, -149, -155, 181, 182, 276, 357, 358, -224, -191, - -139, 304, 312, 95, -143, 101, -394, 86, 295, 392, - 295, 392, 98, -417, 328, 98, -417, -191, -85, -50, - -191, -288, -288, 36, -392, -425, -163, -154, -127, 176, - 597, -324, 604, -336, -336, -336, -343, -336, 347, -336, - 347, -336, -425, -425, -425, 96, -425, 26, -425, 96, - -146, 96, -96, -96, -96, -96, -96, -123, 493, 96, - 96, -425, 95, 95, -425, -146, -425, -425, -425, 96, - -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, - -425, -425, -425, 96, -425, 96, -425, 96, -425, 96, + -146, -146, -146, -146, -146, -146, -146, -146, -389, -146, + -211, -146, -211, -146, -146, -146, -146, -146, -390, -390, + -390, -390, -390, -211, -211, -211, -211, -146, -424, -300, + -99, -98, -97, 672, 257, -95, -165, -99, -165, 235, + -146, 235, 235, 235, -146, -212, -302, -146, -146, -146, + -146, -146, -146, -146, -146, -146, -146, -195, -353, 295, + -353, 295, -353, -270, 96, -281, 26, 18, 63, 63, + -168, -199, -133, -169, -300, -249, 703, -255, 52, -253, + -254, 53, -250, 54, 62, -340, -340, 183, -240, -146, + -271, 85, -272, -280, -223, -215, -218, -216, -424, -259, + -425, -300, -270, -272, -171, -172, -172, -171, -172, 75, + 75, 75, 80, 75, 80, 75, -188, -306, -425, -146, + -309, 86, -169, -169, -193, -306, 183, 434, 438, 439, + -365, -413, 130, 157, 34, 85, 392, 110, -411, 191, + 634, 684, 689, 645, 638, 679, -412, 259, 150, 151, + 271, 28, 47, 97, 96, 97, 96, 97, 97, 96, + -293, -292, -46, -45, -359, -359, 105, -392, 98, 98, + 255, -191, 85, 85, 85, -115, 753, 105, 95, -3, + 90, -146, 95, 23, -348, -223, -383, -333, -384, -334, + -335, -5, -6, -360, -118, 63, 110, -64, 50, 254, + 733, 734, 139, -424, 746, -375, -260, -379, -381, -191, + -150, -424, -162, -148, -147, -149, -155, 181, 182, 276, + 357, 358, -224, -191, -139, 304, 312, 95, -143, 101, + -394, 86, 295, 392, 295, 392, 98, -417, 328, 98, + -417, -191, -85, -50, -191, -288, -288, 36, -392, -425, + -163, -154, -127, 176, 597, -324, 604, -336, -336, -336, + -343, -336, 347, -336, 347, -336, -425, -425, -425, 96, + -425, 26, -425, 96, -146, 96, -96, -96, -96, -96, + -96, -123, 493, 96, 96, -425, 95, 95, -425, -146, + -425, -425, -425, 96, -425, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, -425, 96, - -425, 96, -425, 96, -425, -425, 96, -425, -425, -425, - 96, -425, 96, -425, 96, -425, -425, -425, 96, -322, - 690, -425, -425, -425, -425, -425, -425, -425, -425, -425, - -425, -425, -94, -301, -95, 654, 654, -425, -95, -232, - 96, -151, -425, -151, -151, -151, -425, -425, -425, 96, - -425, 96, 96, -425, 96, -425, 96, -425, -425, -425, - -425, 96, -196, 26, -424, -196, -424, -196, -425, -266, - -191, -199, -233, 20, -246, 57, 367, -257, -256, 61, - 53, -254, 23, 55, 23, 33, -271, 96, 165, -313, - 96, 28, -425, -425, 96, 63, 236, -425, -199, -182, - -181, 85, 86, -183, 85, -181, 75, 75, -261, 96, - -269, -169, -199, -199, 236, 130, -424, -150, 16, 98, - 98, -392, -410, 733, 734, 34, 105, -359, -359, 151, - 151, -191, 95, -338, 98, -338, 105, 105, 34, 91, - 92, 93, 34, 87, 88, 89, -191, -191, -191, -191, - -380, 95, 23, -146, 95, 165, 97, -260, -260, 291, - 176, -359, 727, 297, 297, -359, -359, -359, -117, -116, - 749, 97, -425, 96, -346, 597, 600, -146, -156, -156, - -261, 97, -388, 597, -393, -300, -300, -300, -300, 105, - 107, -425, 595, 82, 598, -425, -338, -146, -146, -146, - -146, -240, 98, -146, -146, 105, 105, -96, -425, -146, + -425, 96, -425, 96, -425, 96, -425, 96, -425, -425, + 96, -425, -425, -425, 96, -425, 96, -425, 96, -425, + -425, -425, 96, -322, 690, -425, -425, -425, -425, -425, + -425, -425, -425, -425, -425, -425, -94, -301, -95, 654, + 654, -425, -95, -232, 96, -151, -425, -151, -151, -151, + -425, -425, -425, 96, -425, 96, 96, -425, 96, -425, + 96, -425, -425, -425, -425, 96, -196, 26, -424, -196, + -424, -196, -425, -266, -191, -199, -233, 20, -246, 57, + 367, -257, -256, 61, 53, -254, 23, 55, 23, 33, + -271, 96, 165, -313, 96, 28, -425, -425, 96, 63, + 236, -425, -199, -182, -181, 85, 86, -183, 85, -181, + 75, 75, -261, 96, -269, -169, -199, -199, 236, 130, + -424, -150, 16, 98, 98, -392, -410, 737, 738, 34, + 105, -359, -359, 151, 151, -191, 95, -338, 98, -338, + 105, 105, 34, 91, 92, 93, 34, 87, 88, 89, + -191, -191, -191, -191, -380, 95, 23, -146, 95, 165, + 97, -260, -260, 291, 176, -359, 731, 297, 297, -359, + -359, -359, -117, -116, 753, 97, -425, 96, -346, 597, + 600, -146, -156, -156, -261, 97, -388, 597, -393, -300, + -300, -300, -300, 105, 107, -425, 595, 82, 598, -425, + -338, -146, -146, -146, -146, -240, 98, -146, -146, 105, + 105, -96, -425, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, -146, - -146, -146, -146, -146, -146, -146, -146, -146, -146, -211, - -146, -425, -179, -178, -180, 710, 130, 34, -321, -425, - -213, 289, -102, -101, -100, 18, -425, -146, -120, -120, - -120, -120, -146, -146, -146, -146, -146, -146, -424, 75, - 22, 20, -263, -300, 259, -424, -263, -424, -309, -233, - -234, 21, 23, -247, 59, -245, 58, -245, -256, 23, - 23, 98, 23, 98, 151, -280, -146, -218, -308, 63, - -29, -300, -215, -300, -235, -146, 95, -146, -159, -199, - -199, -146, -206, 517, 519, 520, 521, 518, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 522, 533, - 494, 495, 496, 117, 119, 118, 127, 128, 497, 498, - 499, 361, 545, 546, 540, 543, 544, 542, 541, 376, - 377, 500, 563, 564, 568, 567, 565, 566, 569, 572, - 573, 574, 575, 576, 577, 579, 578, 570, 571, 548, - 547, 549, 550, 551, 552, 553, 554, 556, 555, 557, - 558, 559, 560, 561, 562, 580, 581, 582, 583, 584, - 586, 585, 590, 589, 587, 588, 592, 591, 501, 502, - 120, 121, 122, 123, 124, 125, 126, 503, 506, 504, - 507, 508, 509, 514, 515, 510, 511, 512, 513, 516, - 387, 385, 386, 382, 381, 380, 441, 446, 447, 449, - 534, 535, 536, 537, 538, 539, 691, 692, 693, 694, - 695, 696, 697, 698, 98, 98, 95, -146, 97, 97, - -261, -379, -61, 97, -262, -260, 105, 97, 292, -216, - -424, 98, -359, -359, -359, 105, 105, -308, -425, 96, - -300, -412, -381, 601, 601, -425, 28, -387, -386, -302, - 95, 86, 68, 596, 599, -425, -425, -425, 96, -425, - -425, -425, 97, 97, -425, -425, -425, -425, -425, -425, + -146, -146, -146, -211, -146, -425, -179, -178, -180, 714, + 130, 34, -321, -425, -213, 289, -102, -101, -100, 18, + -425, -146, -120, -120, -120, -120, -146, -146, -146, -146, + -146, -146, -424, 75, 22, 20, -263, -300, 259, -424, + -263, -424, -309, -233, -234, 21, 23, -247, 59, -245, + 58, -245, -256, 23, 23, 98, 23, 98, 151, -280, + -146, -218, -308, 63, -29, -300, -215, -300, -235, -146, + 95, -146, -159, -199, -199, -146, -206, 517, 519, 520, + 521, 518, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 522, 533, 494, 495, 496, 117, 119, 118, + 127, 128, 497, 498, 499, 361, 545, 546, 540, 543, + 544, 542, 541, 376, 377, 500, 563, 564, 568, 567, + 565, 566, 569, 572, 573, 574, 575, 576, 577, 579, + 578, 570, 571, 548, 547, 549, 550, 551, 552, 553, + 554, 556, 555, 557, 558, 559, 560, 561, 562, 580, + 581, 582, 583, 584, 586, 585, 590, 589, 587, 588, + 592, 591, 501, 502, 120, 121, 122, 123, 124, 125, + 126, 503, 506, 504, 507, 508, 509, 514, 515, 510, + 511, 512, 513, 516, 387, 385, 386, 382, 381, 380, + 441, 446, 447, 449, 534, 535, 536, 537, 538, 539, + 695, 696, 697, 698, 699, 700, 701, 702, 98, 98, + 95, -146, 97, 97, -261, -379, -61, 97, -262, -260, + 105, 97, 292, -216, -424, 98, -359, -359, -359, 105, + 105, -308, -425, 96, -300, -412, -381, 601, 601, -425, + 28, -387, -386, -302, 95, 86, 68, 596, 599, -425, + -425, -425, 96, -425, -425, -425, 97, 97, -425, -425, + -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, -425, - -425, -425, -425, -425, -425, -425, 96, -425, -178, -180, - -425, 85, -159, -235, 23, -99, 314, 316, -99, -425, - -425, -425, -425, -425, 96, -425, -425, 96, -425, 96, - -425, -425, -263, -425, 23, 23, 96, -425, -263, -425, - -263, -198, -234, -109, -108, -107, 628, -146, -211, -248, - 60, 85, 134, 98, 98, 98, 16, -424, -215, 236, - -313, -240, -260, -176, 401, -235, -425, -260, 97, 28, - 97, 751, 151, 97, -216, -126, -424, 288, -308, 98, - 98, -116, -119, -29, 96, 165, -260, -191, 68, -146, - -211, -425, 85, 609, 710, -93, -92, -89, 721, 747, - -211, -95, -95, -146, -146, -146, -425, -300, 259, -425, - -425, -109, 96, -106, -105, -300, -325, 597, 85, 134, - -272, -260, -313, -300, 97, -425, -424, -240, 97, -244, - -29, 95, -3, 288, -333, -384, -334, -335, -5, -6, - -360, -83, 597, -386, -364, -306, -302, 98, 105, 97, - 597, -425, -425, -91, 159, 719, 687, -156, 235, -425, - 96, -425, 96, -425, 96, -107, 96, 28, 602, -425, - -309, -177, -175, -300, 651, -403, -402, 593, -413, -409, - 130, 157, 110, -411, 689, 645, 140, 141, -83, -146, - 95, -425, -84, 303, 706, 236, -394, 598, -91, 720, - 665, 640, 665, 640, -151, -146, -146, -146, -105, -424, - -425, 96, 26, -326, -63, 662, -400, -401, 85, -404, - 407, 661, 682, 130, 98, 97, -260, 264, -307, -388, - 599, 156, -120, -425, 96, -425, 96, -425, -94, -175, - 658, -339, -159, -401, 85, -400, 85, 17, 16, -4, - 750, 97, 305, -91, 665, 640, -146, -146, -425, -62, - 29, -176, -399, 272, 267, 270, 35, -399, 105, -4, - -425, -425, 662, 266, 34, 130, -159, -179, -178, -178, + 96, -425, -178, -180, -425, 85, -159, -235, 23, -99, + 314, 316, -99, -425, -425, -425, -425, -425, 96, -425, + -425, 96, -425, 96, -425, -425, -263, -425, 23, 23, + 96, -425, -263, -425, -263, -198, -234, -109, -108, -107, + 628, -146, -211, -248, 60, 85, 134, 98, 98, 98, + 16, -424, -215, 236, -313, -240, -260, -176, 401, -235, + -425, -260, 97, 28, 97, 755, 151, 97, -216, -126, + -424, 288, -308, 98, 98, -116, -119, -29, 96, 165, + -260, -191, 68, -146, -211, -425, 85, 609, 714, -93, + -92, -89, 725, 751, -211, -95, -95, -146, -146, -146, + -425, -300, 259, -425, -425, -109, 96, -106, -105, -300, + -325, 597, 85, 134, -272, -260, -313, -300, 97, -425, + -424, -240, 97, -244, -29, 95, -3, 288, -333, -384, + -334, -335, -5, -6, -360, -83, 597, -386, -364, -306, + -302, 98, 105, 97, 597, -425, -425, -91, 159, 723, + 687, -156, 235, -425, 96, -425, 96, -425, 96, -107, + 96, 28, 602, -425, -309, -177, -175, -300, 651, -403, + -402, 593, -413, -409, 130, 157, 110, -411, 689, 645, + 140, 141, -83, -146, 95, -425, -84, 303, 710, 236, + -394, 598, -91, 724, 665, 640, 665, 640, -151, -146, + -146, -146, -105, -424, -425, 96, 26, -326, -63, 662, + -400, -401, 85, -404, 407, 661, 682, 130, 98, 97, + -260, 264, -307, -388, 599, 156, -120, -425, 96, -425, + 96, -425, -94, -175, 658, -339, -159, -401, 85, -400, + 85, 17, 16, -4, 754, 97, 305, -91, 665, 640, + -146, -146, -425, -62, 29, -176, -399, 272, 267, 270, + 35, -399, 105, -4, -425, -425, 662, 266, 34, 130, + -159, -179, -178, -178, } var yyDef = [...]int{ @@ -9367,9 +9453,9 @@ var yyDef = [...]int{ 39, 70, 72, 73, 892, 892, 892, 0, 892, 0, 0, 892, -2, -2, 892, 1653, 0, 892, 0, 887, 0, -2, 807, 813, 0, 822, -2, 0, 0, 892, - 892, 2294, 2294, 887, 0, 0, 0, 0, 0, 892, + 892, 2298, 2298, 887, 0, 0, 0, 0, 0, 892, 892, 892, 892, 1658, 1505, 50, 892, 0, 88, 89, - 842, 843, 844, 65, 0, 2292, 85, 892, 893, 1, + 842, 843, 844, 65, 0, 2296, 85, 892, 893, 1, 3, 71, 75, 0, 0, 0, 58, 1514, 0, 78, 0, 0, 896, 0, 0, 1636, 892, 892, 0, 129, 130, 0, 0, 0, -2, 133, -2, 162, 163, 164, @@ -9427,365 +9513,366 @@ var yyDef = [...]int{ 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, - 2286, 2287, 2288, 2289, 2290, 2291, 0, 1630, 0, 725, - 996, 0, 888, 889, 0, 796, 796, 0, 796, 796, - 796, 796, 0, 0, 0, 739, 0, 0, 0, 0, - 793, 0, 755, 756, 0, 793, 0, 762, 799, 0, - 0, 769, 796, 796, 772, 2295, 0, 2295, 2295, 0, - 0, 1621, 0, 790, 788, 802, 803, 42, 806, 809, - 810, 811, 812, 815, 0, 826, 829, 1647, 1648, 0, - 831, 836, 855, 856, 0, 45, 1156, 0, 1020, 0, - 1031, -2, 1042, 1059, 1060, 1061, 1062, 1063, 1065, 1066, - 1067, 0, 0, 0, 0, 1072, 1073, 0, 0, 0, - 0, 0, 1136, 0, 0, 0, 0, 2017, 1476, 0, - 0, 1438, 1438, 1172, 1438, 1438, 1440, 1440, 1440, 1867, - 2009, 2018, 2197, 1828, 1834, 1835, 1836, 2143, 2144, 2145, - 2146, 2238, 2239, 2243, 1931, 1823, 2210, 2211, 0, 2291, - 1970, 1978, 1979, 1955, 1964, 2003, 2105, 2222, 1846, 1998, - 2068, 1928, 1950, 1951, 2086, 2087, 1974, 1975, 1954, 2149, - 2151, 2167, 2168, 2153, 2155, 2164, 2170, 2175, 2154, 2166, - 2171, 2184, 2188, 2191, 2192, 2193, 2161, 2159, 2172, 2176, - 2178, 2180, 2186, 2189, 2162, 2160, 2173, 2177, 2179, 2181, - 2187, 2190, 2148, 2152, 2156, 2165, 2183, 2163, 2182, 2157, - 2169, 2174, 2185, 2158, 2150, 1968, 1971, 1958, 1959, 1961, - 1963, 1969, 1976, 1982, 1960, 1981, 1980, 0, 1956, 1957, - 1962, 1973, 1977, 1965, 1966, 1967, 1972, 1983, 2024, 2023, - 2022, 2067, 1994, 2066, 0, 0, 0, 0, 0, 1817, - 1873, 1874, 2194, 1360, 1361, 1362, 1363, 0, 0, 0, - 0, 0, 0, 0, 293, 294, 1489, 1490, 44, 1155, - 1617, 1440, 1440, 1440, 1440, 1440, 1440, 1094, 1095, 1096, - 1097, 1098, 1124, 1125, 1131, 1132, 2081, 2082, 2083, 2084, - 1911, 2233, 1920, 1921, 2063, 2064, 1933, 1934, 2265, 2266, - -2, -2, -2, 235, 236, 237, 238, 239, 240, 241, - 242, 0, 1872, 2208, 2209, 231, 0, 1615, 1616, 298, - 295, 296, 297, 1138, 1139, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 0, 300, 301, - 2294, 0, 865, 0, 0, 0, 0, 0, 0, 1659, - 1660, 1514, 0, 1506, 1505, 63, 0, 892, -2, 0, - 0, 0, 0, 47, 0, 52, 953, 0, 895, 77, - 76, 1554, 1557, 0, 0, 0, 59, 1515, 67, 69, - 1516, 0, 897, 898, 0, 929, 933, 0, 0, 0, - 1637, 1636, 1636, 105, 0, 0, 106, 126, 127, 128, - 0, 0, 112, 113, 1623, 1624, 43, 0, 0, 180, - 181, 0, 1112, 431, 0, 176, 0, 424, 363, 0, - 1532, 0, 0, 0, 0, 0, 1634, 0, 1631, 157, - 158, 165, 166, 167, 404, 404, 404, 578, 0, 0, - 168, 168, 536, 537, 538, 0, 0, -2, 429, 0, - 516, 0, 0, 418, 418, 422, 420, 421, 0, 0, - 0, 0, 0, 0, 0, 0, 555, 0, 556, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 673, 0, - 405, 0, 576, 577, 467, 0, 0, 0, 0, 0, - 0, 0, 0, 1639, 1640, 0, 553, 554, 0, 0, - 0, 404, 404, 0, 0, 0, 0, 404, 404, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 156, 1545, 0, - 0, 0, -2, 0, 717, 0, 0, 0, 1632, 1632, - 0, 724, 0, 0, 0, 729, 0, 0, 730, 0, - 793, 793, 791, 792, 732, 733, 734, 735, 796, 0, - 0, 413, 414, 415, 793, 796, 0, 796, 796, 796, - 796, 793, 793, 793, 796, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2295, 799, 796, 0, 763, 0, - 764, 765, 766, 767, 770, 771, 773, 2296, 2297, 1649, - 1650, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, - 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, - 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, - 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, - 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, - 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, - 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, - 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, - 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, - 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, - 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, - 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, - 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, - 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, - 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, - 1810, 1811, 1812, 1813, 2295, 2295, 777, 781, 785, 783, - 1622, 808, 814, 816, 817, 0, 0, 827, 830, 849, - 49, 1919, 835, 49, 837, 838, 839, 840, 841, 867, - 868, 873, 0, 0, 0, 0, 879, 880, 881, 0, - 0, 884, 885, 886, 0, 0, 0, 0, 0, 1018, - 0, 0, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1043, 1044, - 0, 0, 0, 1068, 1069, 1070, 1071, 1074, 0, 1085, - 0, 1087, 1485, -2, 0, 0, 0, 1079, 1080, 0, - 0, 0, 1642, 1642, 0, 0, 0, 1477, 0, 0, - 1170, 0, 1171, 1173, 1174, 1175, 0, 1176, 1177, 902, - 902, 902, 902, 902, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1642, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1642, 0, 0, 1642, 1642, 0, 0, - 223, 224, 225, 226, 227, 228, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 299, 243, 244, 245, 246, 247, 302, 248, 249, 250, - 1155, 0, 0, 892, 0, 46, 857, 858, 0, 979, - 1642, 0, 0, 908, 0, 1657, 57, 66, 68, 1514, - 61, 1514, 0, 912, 0, 0, -2, -2, 913, 914, - 918, 919, 920, 921, 922, 923, 924, 925, 926, 54, - 2293, 55, 0, 74, 0, 48, 0, 0, 79, 80, - 1605, 1609, 0, 1555, 0, 1558, 0, 0, 0, 377, - 1562, 0, 0, 1507, 1508, 1511, 0, 930, 2015, 934, - 0, 936, 937, 0, 0, 103, 0, 995, 0, 0, - 0, 114, 0, 116, 117, 0, 0, 0, 388, 1625, - 1626, 1627, -2, 411, 0, 388, 372, 310, 311, 312, - 363, 314, 363, 363, 363, 363, 377, 377, 377, 377, - 345, 346, 347, 348, 349, 0, 363, 0, 331, 363, - 363, 363, 363, 353, 354, 355, 356, 357, 358, 359, - 360, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 365, 365, 365, 365, 365, 369, 369, 0, 1113, 0, - 392, 0, 1511, 0, 0, 1545, 1634, 1644, 0, 0, - 0, 0, 0, 135, 0, 0, 0, 579, 623, 530, - 567, 580, 0, 533, 534, -2, 0, 0, 515, 0, - 517, 0, 412, 0, -2, 0, 422, 0, 418, 422, - 419, 422, 410, 423, 557, 558, 559, 0, 561, 562, - 653, 965, 0, 0, 0, 0, 0, 659, 660, 661, - 0, 663, 664, 665, 666, 667, 668, 669, 670, 671, - 672, 568, 569, 570, 571, 572, 573, 574, 575, 0, - 0, 0, 0, 517, 0, 564, 0, 0, 468, 469, - 470, 0, 0, 473, 474, 475, 476, 0, 0, 479, - 480, 481, 982, 983, 482, 483, 508, 509, 510, 484, - 485, 486, 487, 488, 489, 490, 502, 503, 504, 505, - 506, 507, 491, 492, 493, 494, 495, 496, 499, 0, - 150, 1536, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, - 0, 0, 0, 0, 911, 997, 1655, 1656, 726, 0, - 0, 797, 798, 0, 416, 417, 796, 796, 736, 778, - 0, 796, 740, 779, 741, 743, 742, 744, 757, 758, - 796, 747, 794, 795, 748, 749, 750, 751, 752, 753, - 754, 774, 759, 760, 761, 800, 0, 804, 805, 775, - 776, 0, 786, 0, 0, 0, 820, 821, 0, 828, - 852, 850, 851, 853, 845, 846, 847, 848, 0, 854, - 0, 0, 870, 99, 875, 876, 877, 878, 890, 883, - 1157, 1015, 1016, 1017, 0, 1019, 1025, 0, 1140, 1142, - 1023, 1024, 1027, 0, 0, 0, 1021, 1032, 1152, 1153, - 1154, 0, 0, 0, 0, 0, 1036, 1040, 1045, 1046, - 1047, 1048, 1049, 0, 1050, 0, 1053, 1054, 1055, 1056, - 1057, 1058, 1064, 1453, 1454, 1455, 1083, 303, 304, 0, - 1084, 0, 0, 0, 0, 0, 0, 0, 0, 1400, - 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, - 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1156, - 0, 1643, 0, 0, 0, 1483, 1480, 0, 0, 0, - 1439, 1441, 0, 0, 0, 903, 904, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1420, 1421, 1422, 1423, 1424, 1425, - 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, - 1436, 1437, 0, 0, 1456, 0, 0, 0, 0, 0, - 0, 0, 1476, 0, 1089, 1090, 1091, 0, 0, 0, - 0, 0, 0, 1218, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 145, 146, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1364, - 1365, 1366, 1367, 41, 0, 0, 0, 0, 0, 0, - 0, 1487, 0, -2, -2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1389, 0, - 0, 0, 0, 0, 0, 1613, 0, 0, 860, 861, - 863, 0, 999, 0, 980, 0, 0, 866, 0, 907, - 0, 910, 60, 62, 916, 917, 0, 938, 927, 915, - 56, 51, 0, 0, 957, 0, 0, 1556, 1559, 1560, - 377, 1582, 0, 386, 386, 383, 1517, 1518, 0, 1510, - 1512, 1513, 81, 935, 931, 0, 1013, 0, 0, 994, - 0, 941, 943, 944, 945, 977, 0, 948, 949, 0, - 0, 0, 0, 0, 101, 996, 107, 0, 115, 0, - 0, 120, 121, 108, 109, 110, 111, 0, 612, -2, - 463, 182, 184, 185, 186, 177, -2, 375, 373, 374, - 313, 377, 377, 339, 340, 341, 342, 343, 344, 0, - 351, 0, 332, 333, 334, 335, 324, 0, 325, 326, - 327, 367, 0, 328, 329, 0, 330, 430, 0, 1519, - 393, 394, 396, 404, 0, 399, 400, 0, 404, 404, - 0, 425, 426, 0, 1511, 1536, 0, 0, 1645, 1644, - 1644, 1644, 155, 0, 170, 171, 172, 173, 174, 175, - 648, 0, 0, 624, 646, 647, 168, 0, 0, 178, - 519, 518, 0, 680, 0, 428, 0, 0, 422, 422, - 407, 408, 560, 0, 0, 655, 656, 657, 658, 0, - 0, 0, 546, 457, 0, 547, 548, 517, 519, 0, - 0, 388, 471, 472, 477, 478, 497, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, - 596, 598, 601, 603, 521, 607, 609, 0, 597, 600, - 602, 604, 521, 608, 610, 1533, 1534, 1535, 0, 0, - 718, 0, 0, 454, 97, 1633, 723, 727, 728, 793, - 746, 780, 793, 738, 745, 768, 782, 784, 818, 819, - 824, 832, 833, 834, 874, 0, 0, 0, 0, 882, - 0, 0, 1026, 1141, 1143, 1028, 1029, 1030, 1033, 0, - 1037, 1041, 0, 0, 0, 0, 0, 1088, 1086, 1487, - 0, 0, 0, 1137, 0, 0, 1160, 1161, 0, 0, - 0, 0, 1481, 0, 0, 1168, 0, 1442, 1118, 0, - 0, 0, 0, 0, 1118, 1118, 1118, 1118, 1118, 1118, - 1118, 1118, 1118, 1118, 1505, 1195, 0, 0, 0, 0, - 0, 1200, 1201, 1202, 1118, 0, 1205, 1206, 0, 1208, - 0, 1209, 0, 0, 0, 0, 1216, 1217, 1219, 0, - 0, 1222, 1223, 0, 1225, 0, 1227, 1228, 1229, 1230, - 1231, 1232, 0, 1234, 0, 1236, 1237, 1238, 0, 1240, - 0, 1242, 1243, 0, 1245, 0, 1247, 0, 1250, 0, - 1253, 0, 1256, 0, 1259, 0, 1262, 0, 1265, 0, - 1268, 0, 1271, 0, 1274, 0, 1277, 0, 1280, 0, - 1283, 0, 1286, 0, 1289, 0, 1292, 0, 1295, 1296, - 1297, 0, 1299, 0, 1301, 0, 1304, 1305, 0, 1307, - 0, 1310, 0, 1313, 0, 0, 1314, 0, 0, 0, - 1318, 0, 0, 0, 0, 1327, 1328, 1329, 1330, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1341, - 1342, 1343, 1344, 1345, 1346, 0, 1348, 0, 1119, 0, - 0, 1119, 0, 0, 0, 0, 0, 1158, 1642, 0, - 1443, 1444, 1445, 1446, 1447, 0, 0, 0, 0, 0, - 0, 1387, 1388, 1390, 0, 0, 1393, 0, 1395, 0, - 1614, 859, 862, 864, 951, 1000, 1001, 0, 0, 0, - 0, 981, 1641, 905, 906, 909, 959, 0, 1491, 0, - 0, 938, 1013, 0, 939, 0, 53, 954, 0, 1606, - 1610, 1564, 1563, 1576, 1589, 386, 386, 380, 381, 387, - 382, 384, 385, 1509, 0, 1514, 0, 1603, 0, 892, - 1592, 0, 0, 0, 0, 0, 0, 0, 0, 984, - 0, 0, 987, 0, 0, 0, 0, 978, 949, 0, - 950, 0, -2, 0, 0, 95, 96, 0, 0, 0, - 118, 119, 0, 0, 125, 389, 390, 159, 168, 465, - 183, 438, 0, 0, 309, 376, 336, 337, 338, 0, - 361, 0, 0, 0, 0, 459, 131, 1523, 1522, 404, - 404, 395, 0, 398, 0, 0, 0, 1646, 364, 427, - 0, 149, 0, 0, 0, 0, 1635, 618, 0, 0, - 625, 0, 0, 0, 528, 0, 539, 540, 0, 652, - -2, 714, 392, 0, 406, 409, 966, 0, 0, 541, - 0, 544, 545, 458, 519, 550, 551, 565, 552, 500, - 501, 498, 0, 0, 1546, 1547, 1552, 1550, 1551, 136, - 586, 588, 592, 587, 591, 0, 0, 0, 523, 0, - 611, 523, 584, 0, 454, 1519, 0, 722, 455, 456, - 796, 796, 869, 100, 0, 872, 0, 0, 0, 0, - 1034, 1038, 1051, 1052, 1448, 1474, 363, 363, 1461, 363, - 369, 1464, 363, 1466, 363, 1469, 363, 1472, 1473, 0, - 0, 1081, 0, 0, 0, 0, 1167, 1484, 0, 0, - 1178, 1117, 1118, 1118, 1118, 1118, 1118, 1184, 1185, 1186, - 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1478, 0, 0, - 0, 1199, 0, 0, 1203, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 147, 148, 0, 0, 0, 0, - 0, 0, 1398, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1112, 1116, 0, 1120, 1121, 0, - 0, 1350, 0, 0, 1368, 0, 0, 0, 0, 0, - 0, 0, 1488, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1002, 1009, 0, 1009, 0, 1009, 0, - 0, 0, 1628, 1629, 1492, 1493, 1013, 1494, 928, 940, - 958, 1582, 0, 1575, 0, -2, 1584, 0, 0, 0, - 1590, 378, 379, 932, 82, 1014, 86, 0, 1603, 1618, - 0, 1600, 1607, 1611, 0, 0, 0, 1596, 0, 1013, - 942, 973, 975, 0, 970, 985, 986, 988, 0, 990, - 0, 992, 993, 953, 947, 0, 103, 0, 1013, 1013, - 102, 0, 998, 122, 123, 124, 464, 187, 192, 0, - 0, 0, 197, 0, 199, 0, 0, 0, 204, 205, - 404, 404, 439, 0, 306, 308, 0, 0, 190, 377, - 0, 377, 0, 368, 370, 0, 440, 460, 1520, 1521, - 0, 0, 397, 401, 402, 403, 0, 151, 0, 0, - 0, 621, 0, 649, 0, 0, 0, 0, 0, 0, - 179, 520, 681, 682, 683, 684, 685, 686, 687, 688, - 689, 0, 404, 0, 0, 0, 404, 404, 404, 0, - 706, 391, 0, 0, 677, 674, 542, 0, 221, 222, - 229, 230, 232, 0, 0, 0, 0, 0, 549, 953, - 1537, 1538, 1539, 0, 1549, 1553, 139, 0, 0, 0, - 0, 594, 599, 605, 0, 522, 606, 719, 720, 721, - 98, 731, 737, 871, 891, 1022, 1035, 1039, 0, 0, - 0, 0, 1475, 1459, 377, 1462, 1463, 1465, 1467, 1468, - 1470, 1471, 1077, 1078, 1082, 0, 1164, 0, 1166, 0, - 1482, 0, 1179, 1180, 1181, 1182, 1183, 1514, 0, 0, - 0, 1198, 0, 0, 1118, 0, 1211, 1210, 1212, 0, - 1214, 1215, 1220, 1221, 1224, 1226, 1233, 1235, 1239, 1241, - 1244, 1246, 1248, 0, 1251, 0, 1254, 0, 1257, 0, - 1260, 0, 1263, 0, 1266, 0, 1269, 0, 1272, 0, - 1275, 0, 1278, 0, 1281, 0, 1284, 0, 1287, 0, - 1290, 0, 1293, 0, 1298, 1300, 0, 1303, 1306, 1308, - 0, 1311, 0, 1315, 0, 1317, 1319, 1320, 0, 0, - 0, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, - 1340, 1347, 0, 1110, 1349, 1122, 1123, 1128, 1352, 0, - 0, 0, 1355, 0, 0, 0, 1359, 1159, 1370, 0, - 1375, 0, 0, 1381, 0, 1385, 0, 1391, 1392, 1394, - 1396, 0, 0, 0, 0, 0, 0, 0, 979, 960, - 64, 1494, 1498, 0, 1569, 1567, 1567, 1577, 1578, 0, - 0, 1585, 0, 0, 0, 0, 87, 0, 0, 1591, - 0, 0, 1612, 0, 0, 0, 0, 104, 1505, 967, - 974, 0, 0, 968, 0, 969, 989, 991, 946, 0, - 1013, 1013, 93, 94, 0, 193, 0, 195, 0, 198, - 200, 201, 202, 208, 209, 210, 203, 0, 0, 305, - 307, 0, 0, 350, 362, 352, 0, 0, 1524, 1525, - 1526, 1527, 1528, 1529, 1530, 1531, 953, 152, 153, 154, - 613, 0, 623, 0, 955, 0, 616, 0, 531, 0, - 0, 0, 404, 404, 404, 0, 0, 0, 0, 691, - 0, 0, 654, 0, 662, 0, 0, 0, 233, 234, - 0, 1548, 585, 0, 137, 138, 0, 0, 590, 524, - 525, 1075, 0, 0, 0, 1076, 1460, 0, 0, 0, - 0, 0, 1479, 0, 0, 0, 0, 1204, 1207, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1323, 0, 0, 0, 643, 644, 0, 1399, 1115, - 1505, 0, 1119, 1129, 1130, 0, 1119, 1369, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1010, - 0, 0, 0, 961, 962, 0, 0, 0, 999, 1498, - 1503, 0, 0, 1572, 0, 1565, 1568, 1566, 1579, 0, - 0, 1586, 0, 1588, 0, 1619, 1620, 1608, 1601, 892, - 1595, 1598, 1600, 1597, 1514, 971, 0, 976, 0, 1505, - 92, 0, 196, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 206, 207, 0, 0, 366, 371, - 0, 0, 0, 614, 0, 956, 626, 617, 0, 704, - 0, 708, 0, 0, 0, 711, 712, 713, 690, 0, - 694, 432, 678, 675, 676, 543, 0, 140, 141, 0, - 0, 0, 1449, 0, 1452, 1162, 1165, 1163, 0, 1194, - 1196, 1197, 1457, 1458, 1213, 1249, 1252, 1255, 1258, 1261, - 1264, 1267, 1270, 1273, 1276, 1279, 1282, 1285, 1288, 1291, - 1294, 1302, 1309, 1312, 1316, 1321, 0, 1324, 0, 0, - 1325, 0, 645, 1106, 0, 0, 1126, 1127, 0, 1354, - 1356, 1357, 1358, 1371, 0, 1376, 1377, 0, 1382, 0, - 1386, 1397, 0, 1004, 1011, 1012, 0, 1007, 0, 1008, - 0, 952, 1503, 84, 1504, 1501, 0, 1499, 1496, 1561, - 0, 1570, 1571, 1580, 1581, 1587, 0, 0, 1600, 0, - 1594, 90, 0, 0, 0, 1514, 194, 0, 213, 0, - 622, 0, 625, 615, 702, 703, 0, 715, 707, 709, - 710, 692, -2, 1540, 0, 0, 0, 593, 1450, 0, - 0, 1326, 0, 641, 642, 1114, 1107, 0, 1092, 1093, - 1111, 1351, 1353, 0, 0, 0, 1003, 963, 964, 1005, - 1006, 83, 0, 1500, 1134, 0, 1495, 0, 1573, 1574, - 1604, 0, 1593, 1599, 972, 979, 0, 91, 445, 438, - 1540, 0, 0, 0, 695, 696, 697, 698, 699, 700, - 701, 582, 1542, 142, 143, 0, 512, 513, 514, 136, - 0, 1169, 1322, 1108, 0, 0, 0, 0, 0, 1372, - 0, 1378, 0, 1383, 0, 1502, 0, 0, 1497, 1602, - 627, 0, 629, 0, -2, 433, 446, 0, 188, 214, - 215, 0, 0, 218, 219, 220, 211, 212, 132, 0, - 0, 716, 0, 1543, 1544, 0, 139, 0, 0, 1099, - 1100, 1101, 1102, 1104, 0, 0, 0, 0, 1135, 1112, - 628, 0, 0, 388, 0, 638, 434, 435, 0, 441, - 442, 443, 444, 216, 217, 650, 0, 0, 511, 589, - 1451, 0, 0, 1373, 0, 1379, 0, 1384, 0, 630, - 631, 639, 0, 436, 0, 437, 0, 0, 0, 619, - 0, 650, 1541, 1109, 1103, 1105, 0, 0, 1133, 0, - 640, 636, 447, 449, 450, 0, 0, 448, 651, 620, - 1374, 1380, 0, 451, 452, 453, 632, 633, 634, 635, + 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, + 0, 1630, 0, 725, 996, 0, 888, 889, 0, 796, + 796, 0, 796, 796, 796, 796, 0, 0, 0, 739, + 0, 0, 0, 0, 793, 0, 755, 756, 0, 793, + 0, 762, 799, 0, 0, 769, 796, 796, 772, 2299, + 0, 2299, 2299, 0, 0, 1621, 0, 790, 788, 802, + 803, 42, 806, 809, 810, 811, 812, 815, 0, 826, + 829, 1647, 1648, 0, 831, 836, 855, 856, 0, 45, + 1156, 0, 1020, 0, 1031, -2, 1042, 1059, 1060, 1061, + 1062, 1063, 1065, 1066, 1067, 0, 0, 0, 0, 1072, + 1073, 0, 0, 0, 0, 0, 1136, 0, 0, 0, + 0, 2018, 1476, 0, 0, 1438, 1438, 1172, 1438, 1438, + 1440, 1440, 1440, 1867, 2010, 2019, 2200, 1828, 1834, 1835, + 1836, 2146, 2147, 2148, 2149, 2242, 2243, 2247, 1931, 1823, + 2214, 2215, 0, 2295, 1970, 1978, 1979, 1955, 1964, 2003, + 2108, 2226, 1846, 1998, 2070, 1928, 1950, 1951, 2089, 2090, + 1974, 1975, 1954, 2152, 2154, 2170, 2171, 2156, 2158, 2167, + 2173, 2178, 2157, 2169, 2174, 2187, 2191, 2194, 2195, 2196, + 2164, 2162, 2175, 2179, 2181, 2183, 2189, 2192, 2165, 2163, + 2176, 2180, 2182, 2184, 2190, 2193, 2151, 2155, 2159, 2168, + 2186, 2166, 2185, 2160, 2172, 2177, 2188, 2161, 2153, 1968, + 1971, 1958, 1959, 1961, 1963, 1969, 1976, 1982, 1960, 1981, + 1980, 0, 1956, 1957, 1962, 1973, 1977, 1965, 1966, 1967, + 1972, 1983, 2025, 2024, 2023, 2069, 1994, 2068, 0, 0, + 0, 0, 0, 1817, 1873, 1874, 2197, 1360, 1361, 1362, + 1363, 0, 0, 0, 0, 0, 0, 0, 293, 294, + 1489, 1490, 44, 1155, 1617, 1440, 1440, 1440, 1440, 1440, + 1440, 1094, 1095, 1096, 1097, 1098, 1124, 1125, 1131, 1132, + 2084, 2085, 2086, 2087, 1911, 2237, 1920, 1921, 2065, 2066, + 1933, 1934, 2269, 2270, -2, -2, -2, 235, 236, 237, + 238, 239, 240, 241, 242, 0, 1872, 2212, 2213, 231, + 0, 1615, 1616, 298, 295, 296, 297, 1138, 1139, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 300, 301, 2298, 0, 865, 0, 0, 0, + 0, 0, 0, 1659, 1660, 1514, 0, 1506, 1505, 63, + 0, 892, -2, 0, 0, 0, 0, 47, 0, 52, + 953, 0, 895, 77, 76, 1554, 1557, 0, 0, 0, + 59, 1515, 67, 69, 1516, 0, 897, 898, 0, 929, + 933, 0, 0, 0, 1637, 1636, 1636, 105, 0, 0, + 106, 126, 127, 128, 0, 0, 112, 113, 1623, 1624, + 43, 0, 0, 180, 181, 0, 1112, 431, 0, 176, + 0, 424, 363, 0, 1532, 0, 0, 0, 0, 0, + 1634, 0, 1631, 157, 158, 165, 166, 167, 404, 404, + 404, 578, 0, 0, 168, 168, 536, 537, 538, 0, + 0, -2, 429, 0, 516, 0, 0, 418, 418, 422, + 420, 421, 0, 0, 0, 0, 0, 0, 0, 0, + 555, 0, 556, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 673, 0, 405, 0, 576, 577, 467, 0, + 0, 0, 0, 0, 0, 0, 0, 1639, 1640, 0, + 553, 554, 0, 0, 0, 404, 404, 0, 0, 0, + 0, 404, 404, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 156, 1545, 0, 0, 0, -2, 0, 717, 0, + 0, 0, 1632, 1632, 0, 724, 0, 0, 0, 729, + 0, 0, 730, 0, 793, 793, 791, 792, 732, 733, + 734, 735, 796, 0, 0, 413, 414, 415, 793, 796, + 0, 796, 796, 796, 796, 793, 793, 793, 796, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2299, 799, + 796, 0, 763, 0, 764, 765, 766, 767, 770, 771, + 773, 2300, 2301, 1649, 1650, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, + 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, + 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, + 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, + 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, + 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, + 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, + 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 2299, 2299, + 777, 781, 785, 783, 1622, 808, 814, 816, 817, 0, + 0, 827, 830, 849, 49, 1919, 835, 49, 837, 838, + 839, 840, 841, 867, 868, 873, 0, 0, 0, 0, + 879, 880, 881, 0, 0, 884, 885, 886, 0, 0, + 0, 0, 0, 1018, 0, 0, 1144, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1043, 1044, 0, 0, 0, 1068, 1069, 1070, + 1071, 1074, 0, 1085, 0, 1087, 1485, -2, 0, 0, + 0, 1079, 1080, 0, 0, 0, 1642, 1642, 0, 0, + 0, 1477, 0, 0, 1170, 0, 1171, 1173, 1174, 1175, + 0, 1176, 1177, 902, 902, 902, 902, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1642, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1642, 0, 0, + 1642, 1642, 0, 0, 223, 224, 225, 226, 227, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 299, 243, 244, 245, 246, 247, + 302, 248, 249, 250, 1155, 0, 0, 892, 0, 46, + 857, 858, 0, 979, 1642, 0, 0, 908, 0, 1657, + 57, 66, 68, 1514, 61, 1514, 0, 912, 0, 0, + -2, -2, 913, 914, 918, 919, 920, 921, 922, 923, + 924, 925, 926, 54, 2297, 55, 0, 74, 0, 48, + 0, 0, 79, 80, 1605, 1609, 0, 1555, 0, 1558, + 0, 0, 0, 377, 1562, 0, 0, 1507, 1508, 1511, + 0, 930, 2016, 934, 0, 936, 937, 0, 0, 103, + 0, 995, 0, 0, 0, 114, 0, 116, 117, 0, + 0, 0, 388, 1625, 1626, 1627, -2, 411, 0, 388, + 372, 310, 311, 312, 363, 314, 363, 363, 363, 363, + 377, 377, 377, 377, 345, 346, 347, 348, 349, 0, + 363, 0, 331, 363, 363, 363, 363, 353, 354, 355, + 356, 357, 358, 359, 360, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 365, 365, 365, 365, 365, 369, + 369, 0, 1113, 0, 392, 0, 1511, 0, 0, 1545, + 1634, 1644, 0, 0, 0, 0, 0, 135, 0, 0, + 0, 579, 623, 530, 567, 580, 0, 533, 534, -2, + 0, 0, 515, 0, 517, 0, 412, 0, -2, 0, + 422, 0, 418, 422, 419, 422, 410, 423, 557, 558, + 559, 0, 561, 562, 653, 965, 0, 0, 0, 0, + 0, 659, 660, 661, 0, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 568, 569, 570, 571, 572, + 573, 574, 575, 0, 0, 0, 0, 517, 0, 564, + 0, 0, 468, 469, 470, 0, 0, 473, 474, 475, + 476, 0, 0, 479, 480, 481, 982, 983, 482, 483, + 508, 509, 510, 484, 485, 486, 487, 488, 489, 490, + 502, 503, 504, 505, 506, 507, 491, 492, 493, 494, + 495, 496, 499, 0, 150, 1536, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1632, 0, 0, 0, 0, 911, 997, + 1655, 1656, 726, 0, 0, 797, 798, 0, 416, 417, + 796, 796, 736, 778, 0, 796, 740, 779, 741, 743, + 742, 744, 757, 758, 796, 747, 794, 795, 748, 749, + 750, 751, 752, 753, 754, 774, 759, 760, 761, 800, + 0, 804, 805, 775, 776, 0, 786, 0, 0, 0, + 820, 821, 0, 828, 852, 850, 851, 853, 845, 846, + 847, 848, 0, 854, 0, 0, 870, 99, 875, 876, + 877, 878, 890, 883, 1157, 1015, 1016, 1017, 0, 1019, + 1025, 0, 1140, 1142, 1023, 1024, 1027, 0, 0, 0, + 1021, 1032, 1152, 1153, 1154, 0, 0, 0, 0, 0, + 1036, 1040, 1045, 1046, 1047, 1048, 1049, 0, 1050, 0, + 1053, 1054, 1055, 1056, 1057, 1058, 1064, 1453, 1454, 1455, + 1083, 303, 304, 0, 1084, 0, 0, 0, 0, 0, + 0, 0, 0, 1400, 1401, 1402, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, + 1417, 1418, 1419, 1156, 0, 1643, 0, 0, 0, 1483, + 1480, 0, 0, 0, 1439, 1441, 0, 0, 0, 903, + 904, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, + 1432, 1433, 1434, 1435, 1436, 1437, 0, 0, 1456, 0, + 0, 0, 0, 0, 0, 0, 1476, 0, 1089, 1090, + 1091, 0, 0, 0, 0, 0, 0, 1218, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1364, 1365, 1366, 1367, 41, 0, 0, + 0, 0, 0, 0, 0, 1487, 0, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1389, 0, 0, 0, 0, 0, 0, 1613, + 0, 0, 860, 861, 863, 0, 999, 0, 980, 0, + 0, 866, 0, 907, 0, 910, 60, 62, 916, 917, + 0, 938, 927, 915, 56, 51, 0, 0, 957, 0, + 0, 1556, 1559, 1560, 377, 1582, 0, 386, 386, 383, + 1517, 1518, 0, 1510, 1512, 1513, 81, 935, 931, 0, + 1013, 0, 0, 994, 0, 941, 943, 944, 945, 977, + 0, 948, 949, 0, 0, 0, 0, 0, 101, 996, + 107, 0, 115, 0, 0, 120, 121, 108, 109, 110, + 111, 0, 612, -2, 463, 182, 184, 185, 186, 177, + -2, 375, 373, 374, 313, 377, 377, 339, 340, 341, + 342, 343, 344, 0, 351, 0, 332, 333, 334, 335, + 324, 0, 325, 326, 327, 367, 0, 328, 329, 0, + 330, 430, 0, 1519, 393, 394, 396, 404, 0, 399, + 400, 0, 404, 404, 0, 425, 426, 0, 1511, 1536, + 0, 0, 1645, 1644, 1644, 1644, 155, 0, 170, 171, + 172, 173, 174, 175, 648, 0, 0, 624, 646, 647, + 168, 0, 0, 178, 519, 518, 0, 680, 0, 428, + 0, 0, 422, 422, 407, 408, 560, 0, 0, 655, + 656, 657, 658, 0, 0, 0, 546, 457, 0, 547, + 548, 517, 519, 0, 0, 388, 471, 472, 477, 478, + 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 595, 596, 598, 601, 603, 521, 607, + 609, 0, 597, 600, 602, 604, 521, 608, 610, 1533, + 1534, 1535, 0, 0, 718, 0, 0, 454, 97, 1633, + 723, 727, 728, 793, 746, 780, 793, 738, 745, 768, + 782, 784, 818, 819, 824, 832, 833, 834, 874, 0, + 0, 0, 0, 882, 0, 0, 1026, 1141, 1143, 1028, + 1029, 1030, 1033, 0, 1037, 1041, 0, 0, 0, 0, + 0, 1088, 1086, 1487, 0, 0, 0, 1137, 0, 0, + 1160, 1161, 0, 0, 0, 0, 1481, 0, 0, 1168, + 0, 1442, 1118, 0, 0, 0, 0, 0, 1118, 1118, + 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1505, 1195, + 0, 0, 0, 0, 0, 1200, 1201, 1202, 1118, 0, + 1205, 1206, 0, 1208, 0, 1209, 0, 0, 0, 0, + 1216, 1217, 1219, 0, 0, 1222, 1223, 0, 1225, 0, + 1227, 1228, 1229, 1230, 1231, 1232, 0, 1234, 0, 1236, + 1237, 1238, 0, 1240, 0, 1242, 1243, 0, 1245, 0, + 1247, 0, 1250, 0, 1253, 0, 1256, 0, 1259, 0, + 1262, 0, 1265, 0, 1268, 0, 1271, 0, 1274, 0, + 1277, 0, 1280, 0, 1283, 0, 1286, 0, 1289, 0, + 1292, 0, 1295, 1296, 1297, 0, 1299, 0, 1301, 0, + 1304, 1305, 0, 1307, 0, 1310, 0, 1313, 0, 0, + 1314, 0, 0, 0, 1318, 0, 0, 0, 0, 1327, + 1328, 1329, 1330, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1341, 1342, 1343, 1344, 1345, 1346, 0, + 1348, 0, 1119, 0, 0, 1119, 0, 0, 0, 0, + 0, 1158, 1642, 0, 1443, 1444, 1445, 1446, 1447, 0, + 0, 0, 0, 0, 0, 1387, 1388, 1390, 0, 0, + 1393, 0, 1395, 0, 1614, 859, 862, 864, 951, 1000, + 1001, 0, 0, 0, 0, 981, 1641, 905, 906, 909, + 959, 0, 1491, 0, 0, 938, 1013, 0, 939, 0, + 53, 954, 0, 1606, 1610, 1564, 1563, 1576, 1589, 386, + 386, 380, 381, 387, 382, 384, 385, 1509, 0, 1514, + 0, 1603, 0, 892, 1592, 0, 0, 0, 0, 0, + 0, 0, 0, 984, 0, 0, 987, 0, 0, 0, + 0, 978, 949, 0, 950, 0, -2, 0, 0, 95, + 96, 0, 0, 0, 118, 119, 0, 0, 125, 389, + 390, 159, 168, 465, 183, 438, 0, 0, 309, 376, + 336, 337, 338, 0, 361, 0, 0, 0, 0, 459, + 131, 1523, 1522, 404, 404, 395, 0, 398, 0, 0, + 0, 1646, 364, 427, 0, 149, 0, 0, 0, 0, + 1635, 618, 0, 0, 625, 0, 0, 0, 528, 0, + 539, 540, 0, 652, -2, 714, 392, 0, 406, 409, + 966, 0, 0, 541, 0, 544, 545, 458, 519, 550, + 551, 565, 552, 500, 501, 498, 0, 0, 1546, 1547, + 1552, 1550, 1551, 136, 586, 588, 592, 587, 591, 0, + 0, 0, 523, 0, 611, 523, 584, 0, 454, 1519, + 0, 722, 455, 456, 796, 796, 869, 100, 0, 872, + 0, 0, 0, 0, 1034, 1038, 1051, 1052, 1448, 1474, + 363, 363, 1461, 363, 369, 1464, 363, 1466, 363, 1469, + 363, 1472, 1473, 0, 0, 1081, 0, 0, 0, 0, + 1167, 1484, 0, 0, 1178, 1117, 1118, 1118, 1118, 1118, + 1118, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1478, 0, 0, 0, 1199, 0, 0, 1203, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, + 0, 0, 0, 0, 0, 0, 1398, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 1116, + 0, 1120, 1121, 0, 0, 1350, 0, 0, 1368, 0, + 0, 0, 0, 0, 0, 0, 1488, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1002, 1009, 0, + 1009, 0, 1009, 0, 0, 0, 1628, 1629, 1492, 1493, + 1013, 1494, 928, 940, 958, 1582, 0, 1575, 0, -2, + 1584, 0, 0, 0, 1590, 378, 379, 932, 82, 1014, + 86, 0, 1603, 1618, 0, 1600, 1607, 1611, 0, 0, + 0, 1596, 0, 1013, 942, 973, 975, 0, 970, 985, + 986, 988, 0, 990, 0, 992, 993, 953, 947, 0, + 103, 0, 1013, 1013, 102, 0, 998, 122, 123, 124, + 464, 187, 192, 0, 0, 0, 197, 0, 199, 0, + 0, 0, 204, 205, 404, 404, 439, 0, 306, 308, + 0, 0, 190, 377, 0, 377, 0, 368, 370, 0, + 440, 460, 1520, 1521, 0, 0, 397, 401, 402, 403, + 0, 151, 0, 0, 0, 621, 0, 649, 0, 0, + 0, 0, 0, 0, 179, 520, 681, 682, 683, 684, + 685, 686, 687, 688, 689, 0, 404, 0, 0, 0, + 404, 404, 404, 0, 706, 391, 0, 0, 677, 674, + 542, 0, 221, 222, 229, 230, 232, 0, 0, 0, + 0, 0, 549, 953, 1537, 1538, 1539, 0, 1549, 1553, + 139, 0, 0, 0, 0, 594, 599, 605, 0, 522, + 606, 719, 720, 721, 98, 731, 737, 871, 891, 1022, + 1035, 1039, 0, 0, 0, 0, 1475, 1459, 377, 1462, + 1463, 1465, 1467, 1468, 1470, 1471, 1077, 1078, 1082, 0, + 1164, 0, 1166, 0, 1482, 0, 1179, 1180, 1181, 1182, + 1183, 1514, 0, 0, 0, 1198, 0, 0, 1118, 0, + 1211, 1210, 1212, 0, 1214, 1215, 1220, 1221, 1224, 1226, + 1233, 1235, 1239, 1241, 1244, 1246, 1248, 0, 1251, 0, + 1254, 0, 1257, 0, 1260, 0, 1263, 0, 1266, 0, + 1269, 0, 1272, 0, 1275, 0, 1278, 0, 1281, 0, + 1284, 0, 1287, 0, 1290, 0, 1293, 0, 1298, 1300, + 0, 1303, 1306, 1308, 0, 1311, 0, 1315, 0, 1317, + 1319, 1320, 0, 0, 0, 1331, 1332, 1333, 1334, 1335, + 1336, 1337, 1338, 1339, 1340, 1347, 0, 1110, 1349, 1122, + 1123, 1128, 1352, 0, 0, 0, 1355, 0, 0, 0, + 1359, 1159, 1370, 0, 1375, 0, 0, 1381, 0, 1385, + 0, 1391, 1392, 1394, 1396, 0, 0, 0, 0, 0, + 0, 0, 979, 960, 64, 1494, 1498, 0, 1569, 1567, + 1567, 1577, 1578, 0, 0, 1585, 0, 0, 0, 0, + 87, 0, 0, 1591, 0, 0, 1612, 0, 0, 0, + 0, 104, 1505, 967, 974, 0, 0, 968, 0, 969, + 989, 991, 946, 0, 1013, 1013, 93, 94, 0, 193, + 0, 195, 0, 198, 200, 201, 202, 208, 209, 210, + 203, 0, 0, 305, 307, 0, 0, 350, 362, 352, + 0, 0, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, + 953, 152, 153, 154, 613, 0, 623, 0, 955, 0, + 616, 0, 531, 0, 0, 0, 404, 404, 404, 0, + 0, 0, 0, 691, 0, 0, 654, 0, 662, 0, + 0, 0, 233, 234, 0, 1548, 585, 0, 137, 138, + 0, 0, 590, 524, 525, 1075, 0, 0, 0, 1076, + 1460, 0, 0, 0, 0, 0, 1479, 0, 0, 0, + 0, 1204, 1207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1323, 0, 0, 0, 643, + 644, 0, 1399, 1115, 1505, 0, 1119, 1129, 1130, 0, + 1119, 1369, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1010, 0, 0, 0, 961, 962, 0, + 0, 0, 999, 1498, 1503, 0, 0, 1572, 0, 1565, + 1568, 1566, 1579, 0, 0, 1586, 0, 1588, 0, 1619, + 1620, 1608, 1601, 892, 1595, 1598, 1600, 1597, 1514, 971, + 0, 976, 0, 1505, 92, 0, 196, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, + 0, 0, 366, 371, 0, 0, 0, 614, 0, 956, + 626, 617, 0, 704, 0, 708, 0, 0, 0, 711, + 712, 713, 690, 0, 694, 432, 678, 675, 676, 543, + 0, 140, 141, 0, 0, 0, 1449, 0, 1452, 1162, + 1165, 1163, 0, 1194, 1196, 1197, 1457, 1458, 1213, 1249, + 1252, 1255, 1258, 1261, 1264, 1267, 1270, 1273, 1276, 1279, + 1282, 1285, 1288, 1291, 1294, 1302, 1309, 1312, 1316, 1321, + 0, 1324, 0, 0, 1325, 0, 645, 1106, 0, 0, + 1126, 1127, 0, 1354, 1356, 1357, 1358, 1371, 0, 1376, + 1377, 0, 1382, 0, 1386, 1397, 0, 1004, 1011, 1012, + 0, 1007, 0, 1008, 0, 952, 1503, 84, 1504, 1501, + 0, 1499, 1496, 1561, 0, 1570, 1571, 1580, 1581, 1587, + 0, 0, 1600, 0, 1594, 90, 0, 0, 0, 1514, + 194, 0, 213, 0, 622, 0, 625, 615, 702, 703, + 0, 715, 707, 709, 710, 692, -2, 1540, 0, 0, + 0, 593, 1450, 0, 0, 1326, 0, 641, 642, 1114, + 1107, 0, 1092, 1093, 1111, 1351, 1353, 0, 0, 0, + 1003, 963, 964, 1005, 1006, 83, 0, 1500, 1134, 0, + 1495, 0, 1573, 1574, 1604, 0, 1593, 1599, 972, 979, + 0, 91, 445, 438, 1540, 0, 0, 0, 695, 696, + 697, 698, 699, 700, 701, 582, 1542, 142, 143, 0, + 512, 513, 514, 136, 0, 1169, 1322, 1108, 0, 0, + 0, 0, 0, 1372, 0, 1378, 0, 1383, 0, 1502, + 0, 0, 1497, 1602, 627, 0, 629, 0, -2, 433, + 446, 0, 188, 214, 215, 0, 0, 218, 219, 220, + 211, 212, 132, 0, 0, 716, 0, 1543, 1544, 0, + 139, 0, 0, 1099, 1100, 1101, 1102, 1104, 0, 0, + 0, 0, 1135, 1112, 628, 0, 0, 388, 0, 638, + 434, 435, 0, 441, 442, 443, 444, 216, 217, 650, + 0, 0, 511, 589, 1451, 0, 0, 1373, 0, 1379, + 0, 1384, 0, 630, 631, 639, 0, 436, 0, 437, + 0, 0, 0, 619, 0, 650, 1541, 1109, 1103, 1105, + 0, 0, 1133, 0, 640, 636, 447, 449, 450, 0, + 0, 448, 651, 620, 1374, 1380, 0, 451, 452, 453, + 632, 633, 634, 635, } var yyTok1 = [...]int{ @@ -9794,7 +9881,7 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 158, 3, 3, 3, 186, 178, 3, 95, 97, 183, 181, 96, 182, 236, 184, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 752, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 756, 166, 165, 167, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -9929,7 +10016,8 @@ var yyTok3 = [...]int{ 58060, 735, 58061, 736, 58062, 737, 58063, 738, 58064, 739, 58065, 740, 58066, 741, 58067, 742, 58068, 743, 58069, 744, 58070, 745, 58071, 746, 58072, 747, 58073, 748, 58074, 749, - 58075, 750, 58076, 751, 0, + 58075, 750, 58076, 751, 58077, 752, 58078, 753, 58079, 754, + 58080, 755, 0, } var yyErrorMessages = [...]struct { @@ -10279,7 +10367,7 @@ yydefault: case 1: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:632 +//line sql.y:633 { stmt := yyDollar[2].statementUnion() // If the statement is empty and we have comments @@ -10293,46 +10381,46 @@ yydefault: } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:645 +//line sql.y:646 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:646 +//line sql.y:647 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:650 +//line sql.y:651 { yyLOCAL = yyDollar[1].tableStmtUnion() } yyVAL.union = yyLOCAL case 40: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:689 +//line sql.y:690 { setParseTree(yylex, nil) } case 41: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:695 +//line sql.y:696 { yyLOCAL = NewVariableExpression(yyDollar[1].str, SingleAt) } yyVAL.union = yyLOCAL case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:701 +//line sql.y:702 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 43: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:707 +//line sql.y:708 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), SingleAt) } @@ -10340,7 +10428,7 @@ yydefault: case 44: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:711 +//line sql.y:712 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), DoubleAt) } @@ -10348,7 +10436,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:717 +//line sql.y:718 { yyLOCAL = &OtherAdmin{} } @@ -10356,7 +10444,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:723 +//line sql.y:724 { yyLOCAL = &Load{} } @@ -10364,7 +10452,7 @@ yydefault: case 47: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:729 +//line sql.y:730 { yyLOCAL = &With{CTEs: yyDollar[2].ctesUnion(), Recursive: false} } @@ -10372,7 +10460,7 @@ yydefault: case 48: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:733 +//line sql.y:734 { yyLOCAL = &With{CTEs: yyDollar[3].ctesUnion(), Recursive: true} } @@ -10380,7 +10468,7 @@ yydefault: case 49: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:738 +//line sql.y:739 { yyLOCAL = nil } @@ -10388,14 +10476,14 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:742 +//line sql.y:743 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 51: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:748 +//line sql.y:749 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -10403,7 +10491,7 @@ yydefault: case 52: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:752 +//line sql.y:753 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -10411,7 +10499,7 @@ yydefault: case 53: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:758 +//line sql.y:759 { yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion().Select} } @@ -10419,7 +10507,7 @@ yydefault: case 54: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:764 +//line sql.y:765 { yyLOCAL = yyDollar[2].tableStmtUnion() } @@ -10427,7 +10515,7 @@ yydefault: case 55: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:768 +//line sql.y:769 { yyLOCAL = yyDollar[2].tableStmtUnion() } @@ -10435,7 +10523,7 @@ yydefault: case 56: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableStatement -//line sql.y:772 +//line sql.y:773 { setLockIfPossible(yylex, yyDollar[2].tableStmtUnion(), yyDollar[3].lockUnion()) yyLOCAL = yyDollar[2].tableStmtUnion() @@ -10444,7 +10532,7 @@ yydefault: case 57: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:795 +//line sql.y:796 { yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10454,7 +10542,7 @@ yydefault: case 58: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableStatement -//line sql.y:801 +//line sql.y:802 { yyDollar[1].tableStmtUnion().SetLimit(yyDollar[2].limitUnion()) yyLOCAL = yyDollar[1].tableStmtUnion() @@ -10463,7 +10551,7 @@ yydefault: case 59: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:806 +//line sql.y:807 { yyDollar[1].tableStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10473,7 +10561,7 @@ yydefault: case 60: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableStatement -//line sql.y:812 +//line sql.y:813 { yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -10484,7 +10572,7 @@ yydefault: case 61: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:819 +//line sql.y:820 { yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].tableStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10494,7 +10582,7 @@ yydefault: case 62: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableStatement -//line sql.y:825 +//line sql.y:826 { yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].tableStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -10504,14 +10592,14 @@ yydefault: yyVAL.union = yyLOCAL case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:832 +//line sql.y:833 { yyDollar[2].tableStmtUnion().SetWith(yyDollar[1].withUnion()) } case 64: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL TableStatement -//line sql.y:836 +//line sql.y:837 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/, nil) } @@ -10519,7 +10607,7 @@ yydefault: case 65: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableStatement -//line sql.y:842 +//line sql.y:843 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -10527,7 +10615,7 @@ yydefault: case 66: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:846 +//line sql.y:847 { yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } @@ -10535,7 +10623,7 @@ yydefault: case 67: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:850 +//line sql.y:851 { yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } @@ -10543,7 +10631,7 @@ yydefault: case 68: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:854 +//line sql.y:855 { yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } @@ -10551,7 +10639,7 @@ yydefault: case 69: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:858 +//line sql.y:859 { yyLOCAL = &Union{Left: yyDollar[1].tableStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].tableStmtUnion()} } @@ -10559,7 +10647,7 @@ yydefault: case 70: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableStatement -//line sql.y:864 +//line sql.y:865 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -10567,7 +10655,7 @@ yydefault: case 71: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableStatement -//line sql.y:868 +//line sql.y:869 { setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) yyLOCAL = yyDollar[1].tableStmtUnion() @@ -10576,7 +10664,7 @@ yydefault: case 72: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableStatement -//line sql.y:873 +//line sql.y:874 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -10584,7 +10672,7 @@ yydefault: case 73: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableStatement -//line sql.y:877 +//line sql.y:878 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -10592,7 +10680,7 @@ yydefault: case 74: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:883 +//line sql.y:884 { yyLOCAL = yyDollar[2].tableStmtUnion() } @@ -10600,7 +10688,7 @@ yydefault: case 75: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableStatement -//line sql.y:887 +//line sql.y:888 { setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].tableStmtUnion() @@ -10609,7 +10697,7 @@ yydefault: case 76: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:892 +//line sql.y:893 { setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].lockUnion()) @@ -10619,7 +10707,7 @@ yydefault: case 77: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:898 +//line sql.y:899 { setLockIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].lockUnion()) setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[3].selectIntoUnion()) @@ -10629,7 +10717,7 @@ yydefault: case 78: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableStatement -//line sql.y:904 +//line sql.y:905 { setIntoIfPossible(yylex, yyDollar[1].tableStmtUnion(), yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].tableStmtUnion() @@ -10638,7 +10726,7 @@ yydefault: case 79: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:911 +//line sql.y:912 { yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), ListArg: ListArg(yyDollar[3].str[2:])} } @@ -10646,7 +10734,7 @@ yydefault: case 80: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableStatement -//line sql.y:915 +//line sql.y:916 { yyLOCAL = &ValuesStatement{Comments: Comments(yyDollar[2].strs).Parsed(), Rows: yyDollar[3].valuesUnion()} } @@ -10654,7 +10742,7 @@ yydefault: case 81: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:921 +//line sql.y:922 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } @@ -10662,7 +10750,7 @@ yydefault: case 82: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:927 +//line sql.y:928 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } @@ -10670,7 +10758,7 @@ yydefault: case 83: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL TableStatement -//line sql.y:935 +//line sql.y:936 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), yyDollar[8].groupByUnion(), NewWhere(HavingClause, yyDollar[9].exprUnion()), yyDollar[10].namedWindowsUnion()) } @@ -10678,7 +10766,7 @@ yydefault: case 84: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL TableStatement -//line sql.y:939 +//line sql.y:940 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), yyDollar[7].groupByUnion(), NewWhere(HavingClause, yyDollar[8].exprUnion()), yyDollar[9].namedWindowsUnion()) } @@ -10686,7 +10774,7 @@ yydefault: case 85: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableStatement -//line sql.y:943 +//line sql.y:944 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -10694,7 +10782,7 @@ yydefault: case 86: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:949 +//line sql.y:950 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -10710,7 +10798,7 @@ yydefault: case 87: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:961 +//line sql.y:962 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -10724,7 +10812,7 @@ yydefault: case 88: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:973 +//line sql.y:974 { yyLOCAL = InsertAct } @@ -10732,7 +10820,7 @@ yydefault: case 89: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:977 +//line sql.y:978 { yyLOCAL = ReplaceAct } @@ -10740,7 +10828,7 @@ yydefault: case 90: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:983 +//line sql.y:984 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } @@ -10748,7 +10836,7 @@ yydefault: case 91: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:989 +//line sql.y:990 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].identifierCS}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } @@ -10756,7 +10844,7 @@ yydefault: case 92: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:993 +//line sql.y:994 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } @@ -10764,7 +10852,7 @@ yydefault: case 93: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:997 +//line sql.y:998 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } @@ -10772,32 +10860,32 @@ yydefault: case 94: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:1001 +//line sql.y:1002 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL case 95: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1006 +//line sql.y:1007 { } case 96: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1007 +//line sql.y:1008 { } case 97: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1011 +//line sql.y:1012 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1015 +//line sql.y:1016 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10805,14 +10893,14 @@ yydefault: case 99: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1021 +//line sql.y:1022 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 100: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1025 +//line sql.y:1026 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10820,14 +10908,14 @@ yydefault: case 101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1031 +//line sql.y:1032 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 102: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1035 +//line sql.y:1036 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10835,7 +10923,7 @@ yydefault: case 103: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:1040 +//line sql.y:1041 { yyLOCAL = nil } @@ -10843,7 +10931,7 @@ yydefault: case 104: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:1044 +//line sql.y:1045 { yyLOCAL = yyDollar[3].partitionsUnion() } @@ -10851,7 +10939,7 @@ yydefault: case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:1050 +//line sql.y:1051 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[3].setExprsUnion()) } @@ -10859,14 +10947,14 @@ yydefault: case 106: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1056 +//line sql.y:1057 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 107: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1060 +//line sql.y:1061 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -10874,7 +10962,7 @@ yydefault: case 108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1066 +//line sql.y:1067 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } @@ -10882,7 +10970,7 @@ yydefault: case 109: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1070 +//line sql.y:1071 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } @@ -10890,7 +10978,7 @@ yydefault: case 110: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1074 +//line sql.y:1075 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } @@ -10898,7 +10986,7 @@ yydefault: case 111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1078 +//line sql.y:1079 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } @@ -10906,7 +10994,7 @@ yydefault: case 112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1084 +//line sql.y:1085 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } @@ -10914,7 +11002,7 @@ yydefault: case 113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1088 +//line sql.y:1089 { yyLOCAL = yyDollar[1].variableUnion() } @@ -10922,7 +11010,7 @@ yydefault: case 114: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:1092 +//line sql.y:1093 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } @@ -10930,7 +11018,7 @@ yydefault: case 115: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:1098 +//line sql.y:1099 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), UpdateSetExprsScope(yyDollar[5].setExprsUnion(), yyDollar[3].scopeUnion())) } @@ -10938,7 +11026,7 @@ yydefault: case 116: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:1102 +//line sql.y:1103 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[4].setExprsUnion()) } @@ -10946,14 +11034,14 @@ yydefault: case 117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1108 +//line sql.y:1109 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 118: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1112 +//line sql.y:1113 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -10961,7 +11049,7 @@ yydefault: case 119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1118 +//line sql.y:1119 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionIsolationStr, NextTxScope), Expr: NewStrLiteral(yyDollar[3].str)} } @@ -10969,7 +11057,7 @@ yydefault: case 120: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1122 +//line sql.y:1123 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("off")} } @@ -10977,39 +11065,39 @@ yydefault: case 121: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1126 +//line sql.y:1127 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1132 +//line sql.y:1133 { yyVAL.str = RepeatableReadStr } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1136 +//line sql.y:1137 { yyVAL.str = ReadCommittedStr } case 124: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1140 +//line sql.y:1141 { yyVAL.str = ReadUncommittedStr } case 125: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1144 +//line sql.y:1145 { yyVAL.str = SerializableStr } case 126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1150 +//line sql.y:1151 { yyLOCAL = SessionScope } @@ -11017,7 +11105,7 @@ yydefault: case 127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1154 +//line sql.y:1155 { yyLOCAL = SessionScope } @@ -11025,7 +11113,7 @@ yydefault: case 128: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1158 +//line sql.y:1159 { yyLOCAL = GlobalScope } @@ -11033,7 +11121,7 @@ yydefault: case 129: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1164 +//line sql.y:1165 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true @@ -11043,7 +11131,7 @@ yydefault: case 130: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1170 +//line sql.y:1171 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -11054,7 +11142,7 @@ yydefault: case 131: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:1177 +//line sql.y:1178 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -11067,7 +11155,7 @@ yydefault: case 132: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:1186 +//line sql.y:1187 { yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].tableStmtUnion(), CheckOption: yyDollar[12].str} } @@ -11075,7 +11163,7 @@ yydefault: case 133: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1190 +//line sql.y:1191 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].databaseOptionsUnion() @@ -11085,7 +11173,7 @@ yydefault: case 134: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1197 +//line sql.y:1198 { yyLOCAL = false } @@ -11093,33 +11181,33 @@ yydefault: case 135: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1201 +//line sql.y:1202 { yyLOCAL = true } yyVAL.union = yyLOCAL case 136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1206 +//line sql.y:1207 { yyVAL.identifierCI = NewIdentifierCI("") } case 137: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1210 +//line sql.y:1211 { yyVAL.identifierCI = yyDollar[2].identifierCI } case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1216 +//line sql.y:1217 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1221 +//line sql.y:1222 { var v []VindexParam yyLOCAL = v @@ -11128,7 +11216,7 @@ yydefault: case 140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1226 +//line sql.y:1227 { yyLOCAL = yyDollar[2].vindexParamsUnion() } @@ -11136,7 +11224,7 @@ yydefault: case 141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1232 +//line sql.y:1233 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) @@ -11144,21 +11232,21 @@ yydefault: yyVAL.union = yyLOCAL case 142: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1237 +//line sql.y:1238 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } case 143: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1243 +//line sql.y:1244 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].identifierCI, Val: yyDollar[3].str} } case 144: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1248 +//line sql.y:1249 { yyLOCAL = nil } @@ -11166,7 +11254,7 @@ yydefault: case 145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1252 +//line sql.y:1253 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } @@ -11174,28 +11262,28 @@ yydefault: case 146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1258 +//line sql.y:1259 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1262 +//line sql.y:1263 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } case 148: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1268 +//line sql.y:1269 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } case 149: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1274 +//line sql.y:1275 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -11204,7 +11292,7 @@ yydefault: case 150: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1281 +//line sql.y:1282 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) @@ -11213,7 +11301,7 @@ yydefault: case 151: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1288 +//line sql.y:1289 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -11222,7 +11310,7 @@ yydefault: case 152: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1293 +//line sql.y:1294 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeFullText}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -11231,7 +11319,7 @@ yydefault: case 153: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1298 +//line sql.y:1299 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeSpatial}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -11240,7 +11328,7 @@ yydefault: case 154: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1303 +//line sql.y:1304 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeUnique}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -11249,7 +11337,7 @@ yydefault: case 155: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1310 +//line sql.y:1311 { yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfNotExists: yyDollar[4].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -11258,7 +11346,7 @@ yydefault: case 156: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1317 +//line sql.y:1318 { yyLOCAL = &AlterDatabase{Comments: Comments(yyDollar[2].strs).Parsed()} setDDL(yylex, yyLOCAL) @@ -11267,7 +11355,7 @@ yydefault: case 159: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1328 +//line sql.y:1329 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() @@ -11277,7 +11365,7 @@ yydefault: case 160: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1335 +//line sql.y:1336 { yyLOCAL = nil } @@ -11285,7 +11373,7 @@ yydefault: case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1339 +//line sql.y:1340 { yyLOCAL = yyDollar[1].databaseOptionsUnion() } @@ -11293,7 +11381,7 @@ yydefault: case 162: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1345 +//line sql.y:1346 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -11301,7 +11389,7 @@ yydefault: case 163: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1349 +//line sql.y:1350 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -11309,28 +11397,28 @@ yydefault: case 164: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1353 +//line sql.y:1354 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL case 165: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1357 +//line sql.y:1358 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 166: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1361 +//line sql.y:1362 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 167: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1365 +//line sql.y:1366 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) @@ -11338,7 +11426,7 @@ yydefault: case 168: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1371 +//line sql.y:1372 { yyLOCAL = false } @@ -11346,51 +11434,51 @@ yydefault: case 169: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1375 +//line sql.y:1376 { yyLOCAL = true } yyVAL.union = yyLOCAL case 170: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1381 +//line sql.y:1382 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 171: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1385 +//line sql.y:1386 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 172: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1391 +//line sql.y:1392 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 173: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1395 +//line sql.y:1396 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 174: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1401 +//line sql.y:1402 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 175: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1405 +//line sql.y:1406 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1411 +//line sql.y:1412 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } @@ -11398,7 +11486,7 @@ yydefault: case 177: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1415 +//line sql.y:1416 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } @@ -11406,14 +11494,14 @@ yydefault: case 178: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1421 +//line sql.y:1422 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL case 179: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1425 +//line sql.y:1426 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) @@ -11421,7 +11509,7 @@ yydefault: case 180: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1431 +//line sql.y:1432 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) @@ -11430,7 +11518,7 @@ yydefault: case 181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1436 +//line sql.y:1437 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) @@ -11438,39 +11526,39 @@ yydefault: yyVAL.union = yyLOCAL case 182: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1441 +//line sql.y:1442 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } case 183: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1445 +//line sql.y:1446 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } case 184: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1450 +//line sql.y:1451 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } case 185: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1454 +//line sql.y:1455 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 186: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1458 +//line sql.y:1459 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1469 +//line sql.y:1470 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -11483,7 +11571,7 @@ yydefault: case 188: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1478 +//line sql.y:1479 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -11494,20 +11582,20 @@ yydefault: yyVAL.union = yyLOCAL case 189: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1487 +//line sql.y:1488 { yyVAL.str = "" } case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1491 +//line sql.y:1492 { yyVAL.str = "" } case 191: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1500 +//line sql.y:1501 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: ColKeyNone, Comment: nil, As: nil, Invisible: nil, Format: UnspecifiedFormat, EngineAttribute: nil, SecondaryEngineAttribute: nil} } @@ -11515,7 +11603,7 @@ yydefault: case 192: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1504 +//line sql.y:1505 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11524,7 +11612,7 @@ yydefault: case 193: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1509 +//line sql.y:1510 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11533,7 +11621,7 @@ yydefault: case 194: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1514 +//line sql.y:1515 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11542,7 +11630,7 @@ yydefault: case 195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1519 +//line sql.y:1520 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyDollar[1].columnTypeOptionsUnion().DefaultLiteral = true @@ -11552,7 +11640,7 @@ yydefault: case 196: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1525 +//line sql.y:1526 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11561,7 +11649,7 @@ yydefault: case 197: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1530 +//line sql.y:1531 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11570,7 +11658,7 @@ yydefault: case 198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1535 +//line sql.y:1536 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11579,7 +11667,7 @@ yydefault: case 199: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1540 +//line sql.y:1541 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11587,14 +11675,14 @@ yydefault: yyVAL.union = yyLOCAL case 200: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1545 +//line sql.y:1546 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } case 201: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1549 +//line sql.y:1550 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].identifierCI.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11602,14 +11690,14 @@ yydefault: yyVAL.union = yyLOCAL case 202: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1554 +//line sql.y:1555 { yyDollar[1].columnTypeOptionsUnion().Format = yyDollar[3].columnFormatUnion() } case 203: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1558 +//line sql.y:1559 { yyDollar[1].columnTypeOptionsUnion().SRID = NewIntLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11618,7 +11706,7 @@ yydefault: case 204: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1563 +//line sql.y:1564 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11627,7 +11715,7 @@ yydefault: case 205: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1568 +//line sql.y:1569 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11635,20 +11723,20 @@ yydefault: yyVAL.union = yyLOCAL case 206: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1573 +//line sql.y:1574 { yyDollar[1].columnTypeOptionsUnion().EngineAttribute = NewStrLiteral(yyDollar[4].str) } case 207: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1577 +//line sql.y:1578 { yyDollar[1].columnTypeOptionsUnion().SecondaryEngineAttribute = NewStrLiteral(yyDollar[4].str) } case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1583 +//line sql.y:1584 { yyLOCAL = FixedFormat } @@ -11656,7 +11744,7 @@ yydefault: case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1587 +//line sql.y:1588 { yyLOCAL = DynamicFormat } @@ -11664,7 +11752,7 @@ yydefault: case 210: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1591 +//line sql.y:1592 { yyLOCAL = DefaultFormat } @@ -11672,7 +11760,7 @@ yydefault: case 211: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1597 +//line sql.y:1598 { yyLOCAL = VirtualStorage } @@ -11680,7 +11768,7 @@ yydefault: case 212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1601 +//line sql.y:1602 { yyLOCAL = StoredStorage } @@ -11688,7 +11776,7 @@ yydefault: case 213: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1606 +//line sql.y:1607 { yyLOCAL = &ColumnTypeOptions{} } @@ -11696,7 +11784,7 @@ yydefault: case 214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1610 +//line sql.y:1611 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11705,7 +11793,7 @@ yydefault: case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1615 +//line sql.y:1616 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11714,7 +11802,7 @@ yydefault: case 216: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1620 +//line sql.y:1621 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11723,7 +11811,7 @@ yydefault: case 217: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1625 +//line sql.y:1626 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11732,7 +11820,7 @@ yydefault: case 218: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1630 +//line sql.y:1631 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11741,7 +11829,7 @@ yydefault: case 219: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1635 +//line sql.y:1636 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11750,7 +11838,7 @@ yydefault: case 220: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1640 +//line sql.y:1641 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11759,7 +11847,7 @@ yydefault: case 221: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1647 +//line sql.y:1648 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11767,7 +11855,7 @@ yydefault: case 223: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1654 +//line sql.y:1655 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_timestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11775,7 +11863,7 @@ yydefault: case 224: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1658 +//line sql.y:1659 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtime"), Fsp: yyDollar[2].integerUnion()} } @@ -11783,7 +11871,7 @@ yydefault: case 225: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1662 +//line sql.y:1663 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtimestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11791,7 +11879,7 @@ yydefault: case 226: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1666 +//line sql.y:1667 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_timestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11799,7 +11887,7 @@ yydefault: case 227: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1670 +//line sql.y:1671 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("now"), Fsp: yyDollar[2].integerUnion()} } @@ -11807,7 +11895,7 @@ yydefault: case 228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1674 +//line sql.y:1675 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("sysdate"), Fsp: yyDollar[2].integerUnion()} } @@ -11815,7 +11903,7 @@ yydefault: case 231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1684 +//line sql.y:1685 { yyLOCAL = &NullVal{} } @@ -11823,7 +11911,7 @@ yydefault: case 233: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1691 +//line sql.y:1692 { yyLOCAL = yyDollar[2].exprUnion() } @@ -11831,7 +11919,7 @@ yydefault: case 234: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1695 +//line sql.y:1696 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -11839,7 +11927,7 @@ yydefault: case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1701 +//line sql.y:1702 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11847,7 +11935,7 @@ yydefault: case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1705 +//line sql.y:1706 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11855,7 +11943,7 @@ yydefault: case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1709 +//line sql.y:1710 { yyLOCAL = yyDollar[1].boolValUnion() } @@ -11863,7 +11951,7 @@ yydefault: case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1713 +//line sql.y:1714 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } @@ -11871,7 +11959,7 @@ yydefault: case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1717 +//line sql.y:1718 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } @@ -11879,7 +11967,7 @@ yydefault: case 240: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1721 +//line sql.y:1722 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } @@ -11887,7 +11975,7 @@ yydefault: case 241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1725 +//line sql.y:1726 { yyLOCAL = NewBitLiteral("0b" + yyDollar[1].str) } @@ -11895,7 +11983,7 @@ yydefault: case 242: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1729 +//line sql.y:1730 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } @@ -11903,7 +11991,7 @@ yydefault: case 243: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1733 +//line sql.y:1734 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral("0b" + yyDollar[2].str)} } @@ -11911,7 +11999,7 @@ yydefault: case 244: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1737 +//line sql.y:1738 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } @@ -11919,7 +12007,7 @@ yydefault: case 245: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1741 +//line sql.y:1742 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } @@ -11927,7 +12015,7 @@ yydefault: case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1745 +//line sql.y:1746 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } @@ -11935,7 +12023,7 @@ yydefault: case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1749 +//line sql.y:1750 { arg := parseBindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: arg} @@ -11944,7 +12032,7 @@ yydefault: case 248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1754 +//line sql.y:1755 { yyLOCAL = NewDateLiteral(yyDollar[2].str) } @@ -11952,7 +12040,7 @@ yydefault: case 249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1758 +//line sql.y:1759 { yyLOCAL = NewTimeLiteral(yyDollar[2].str) } @@ -11960,267 +12048,267 @@ yydefault: case 250: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1762 +//line sql.y:1763 { yyLOCAL = NewTimestampLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1768 +//line sql.y:1769 { yyVAL.str = Armscii8Str } case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1772 +//line sql.y:1773 { yyVAL.str = ASCIIStr } case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1776 +//line sql.y:1777 { yyVAL.str = Big5Str } case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1780 +//line sql.y:1781 { yyVAL.str = UBinaryStr } case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1784 +//line sql.y:1785 { yyVAL.str = Cp1250Str } case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1788 +//line sql.y:1789 { yyVAL.str = Cp1251Str } case 257: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1792 +//line sql.y:1793 { yyVAL.str = Cp1256Str } case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1796 +//line sql.y:1797 { yyVAL.str = Cp1257Str } case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1800 +//line sql.y:1801 { yyVAL.str = Cp850Str } case 260: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1804 +//line sql.y:1805 { yyVAL.str = Cp852Str } case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1808 +//line sql.y:1809 { yyVAL.str = Cp866Str } case 262: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1812 +//line sql.y:1813 { yyVAL.str = Cp932Str } case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1816 +//line sql.y:1817 { yyVAL.str = Dec8Str } case 264: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1820 +//line sql.y:1821 { yyVAL.str = EucjpmsStr } case 265: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1824 +//line sql.y:1825 { yyVAL.str = EuckrStr } case 266: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1828 +//line sql.y:1829 { yyVAL.str = Gb18030Str } case 267: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1832 +//line sql.y:1833 { yyVAL.str = Gb2312Str } case 268: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1836 +//line sql.y:1837 { yyVAL.str = GbkStr } case 269: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1840 +//line sql.y:1841 { yyVAL.str = Geostd8Str } case 270: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1844 +//line sql.y:1845 { yyVAL.str = GreekStr } case 271: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1848 +//line sql.y:1849 { yyVAL.str = HebrewStr } case 272: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1852 +//line sql.y:1853 { yyVAL.str = Hp8Str } case 273: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1856 +//line sql.y:1857 { yyVAL.str = Keybcs2Str } case 274: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1860 +//line sql.y:1861 { yyVAL.str = Koi8rStr } case 275: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1864 +//line sql.y:1865 { yyVAL.str = Koi8uStr } case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1868 +//line sql.y:1869 { yyVAL.str = Latin1Str } case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1872 +//line sql.y:1873 { yyVAL.str = Latin2Str } case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1876 +//line sql.y:1877 { yyVAL.str = Latin5Str } case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1880 +//line sql.y:1881 { yyVAL.str = Latin7Str } case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1884 +//line sql.y:1885 { yyVAL.str = MacceStr } case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1888 +//line sql.y:1889 { yyVAL.str = MacromanStr } case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1892 +//line sql.y:1893 { yyVAL.str = SjisStr } case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1896 +//line sql.y:1897 { yyVAL.str = Swe7Str } case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1900 +//line sql.y:1901 { yyVAL.str = Tis620Str } case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1904 +//line sql.y:1905 { yyVAL.str = Ucs2Str } case 286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1908 +//line sql.y:1909 { yyVAL.str = UjisStr } case 287: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1912 +//line sql.y:1913 { yyVAL.str = Utf16Str } case 288: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1916 +//line sql.y:1917 { yyVAL.str = Utf16leStr } case 289: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1920 +//line sql.y:1921 { yyVAL.str = Utf32Str } case 290: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1924 +//line sql.y:1925 { yyVAL.str = Utf8mb3Str } case 291: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1928 +//line sql.y:1929 { yyVAL.str = Utf8mb4Str } case 292: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1932 +//line sql.y:1933 { yyVAL.str = Utf8mb3Str } case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1942 +//line sql.y:1943 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -12228,7 +12316,7 @@ yydefault: case 296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1946 +//line sql.y:1947 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } @@ -12236,7 +12324,7 @@ yydefault: case 297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1950 +//line sql.y:1951 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } @@ -12244,7 +12332,7 @@ yydefault: case 298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1956 +//line sql.y:1957 { yyLOCAL = yyDollar[1].exprUnion() } @@ -12252,7 +12340,7 @@ yydefault: case 299: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1960 +//line sql.y:1961 { yyLOCAL = AppendString(yyDollar[1].exprUnion(), yyDollar[2].str) } @@ -12260,7 +12348,7 @@ yydefault: case 300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1966 +//line sql.y:1967 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } @@ -12268,7 +12356,7 @@ yydefault: case 301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1970 +//line sql.y:1971 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } @@ -12276,7 +12364,7 @@ yydefault: case 302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1974 +//line sql.y:1975 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } @@ -12284,7 +12372,7 @@ yydefault: case 303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1980 +//line sql.y:1981 { yyLOCAL = yyDollar[1].exprUnion() } @@ -12292,7 +12380,7 @@ yydefault: case 304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1984 +//line sql.y:1985 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } @@ -12300,7 +12388,7 @@ yydefault: case 305: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1990 +//line sql.y:1991 { yyLOCAL = ColKeyPrimary } @@ -12308,7 +12396,7 @@ yydefault: case 306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1994 +//line sql.y:1995 { yyLOCAL = ColKeyUnique } @@ -12316,7 +12404,7 @@ yydefault: case 307: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1998 +//line sql.y:1999 { yyLOCAL = ColKeyUniqueKey } @@ -12324,14 +12412,14 @@ yydefault: case 308: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:2002 +//line sql.y:2003 { yyLOCAL = ColKey } yyVAL.union = yyLOCAL case 309: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2008 +//line sql.y:2009 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() @@ -12339,74 +12427,74 @@ yydefault: } case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2019 +//line sql.y:2020 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].intPtrUnion() } case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2024 +//line sql.y:2025 { yyVAL.columnType = yyDollar[1].columnType } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2030 +//line sql.y:2031 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2034 +//line sql.y:2035 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2038 +//line sql.y:2039 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2042 +//line sql.y:2043 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2046 +//line sql.y:2047 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2050 +//line sql.y:2051 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2054 +//line sql.y:2055 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 322: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2058 +//line sql.y:2059 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2062 +//line sql.y:2063 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2068 +//line sql.y:2069 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12414,7 +12502,7 @@ yydefault: } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2074 +//line sql.y:2075 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12422,7 +12510,7 @@ yydefault: } case 326: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2080 +//line sql.y:2081 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12430,7 +12518,7 @@ yydefault: } case 327: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2086 +//line sql.y:2087 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12438,7 +12526,7 @@ yydefault: } case 328: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2092 +//line sql.y:2093 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12446,7 +12534,7 @@ yydefault: } case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2098 +//line sql.y:2099 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12454,7 +12542,7 @@ yydefault: } case 330: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2104 +//line sql.y:2105 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12462,43 +12550,43 @@ yydefault: } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2112 +//line sql.y:2113 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2116 +//line sql.y:2117 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 333: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2120 +//line sql.y:2121 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 334: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2124 +//line sql.y:2125 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 335: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2128 +//line sql.y:2129 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 336: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2134 +//line sql.y:2135 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } case 337: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2138 +//line sql.y:2139 { // CHAR BYTE is an alias for binary. See also: // https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html @@ -12506,159 +12594,159 @@ yydefault: } case 338: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2144 +//line sql.y:2145 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } case 339: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2148 +//line sql.y:2149 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2152 +//line sql.y:2153 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 341: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2156 +//line sql.y:2157 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 342: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2160 +//line sql.y:2161 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 343: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2164 +//line sql.y:2165 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2168 +//line sql.y:2169 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2172 +//line sql.y:2173 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2176 +//line sql.y:2177 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2180 +//line sql.y:2181 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2184 +//line sql.y:2185 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2188 +//line sql.y:2189 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 350: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2192 +//line sql.y:2193 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 351: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2196 +//line sql.y:2197 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 352: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2201 +//line sql.y:2202 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2207 +//line sql.y:2208 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2211 +//line sql.y:2212 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 355: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2215 +//line sql.y:2216 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2219 +//line sql.y:2220 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2223 +//line sql.y:2224 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 358: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2227 +//line sql.y:2228 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 359: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2231 +//line sql.y:2232 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2235 +//line sql.y:2236 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2241 +//line sql.y:2242 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2246 +//line sql.y:2247 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } case 363: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *int -//line sql.y:2251 +//line sql.y:2252 { yyLOCAL = nil } @@ -12666,20 +12754,20 @@ yydefault: case 364: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *int -//line sql.y:2255 +//line sql.y:2256 { yyLOCAL = ptr.Of(convertStringToInt(yyDollar[2].str)) } yyVAL.union = yyLOCAL case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2260 +//line sql.y:2261 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 366: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2264 +//line sql.y:2265 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12688,13 +12776,13 @@ yydefault: } case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2273 +//line sql.y:2274 { yyVAL.LengthScaleOption = yyDollar[1].LengthScaleOption } case 368: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2277 +//line sql.y:2278 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12702,13 +12790,13 @@ yydefault: } case 369: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2284 +//line sql.y:2285 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 370: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2288 +//line sql.y:2289 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12716,7 +12804,7 @@ yydefault: } case 371: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2294 +//line sql.y:2295 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12726,7 +12814,7 @@ yydefault: case 372: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2302 +//line sql.y:2303 { yyLOCAL = false } @@ -12734,7 +12822,7 @@ yydefault: case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2306 +//line sql.y:2307 { yyLOCAL = true } @@ -12742,7 +12830,7 @@ yydefault: case 374: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2310 +//line sql.y:2311 { yyLOCAL = false } @@ -12750,7 +12838,7 @@ yydefault: case 375: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2315 +//line sql.y:2316 { yyLOCAL = false } @@ -12758,66 +12846,66 @@ yydefault: case 376: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2319 +//line sql.y:2320 { yyLOCAL = true } yyVAL.union = yyLOCAL case 377: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2324 +//line sql.y:2325 { yyVAL.columnCharset = ColumnCharset{} } case 378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2328 +//line sql.y:2329 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].identifierCI.String()), Binary: yyDollar[3].booleanUnion()} } case 379: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2332 +//line sql.y:2333 { yyVAL.columnCharset = ColumnCharset{Name: encodeSQLString(yyDollar[2].str), Binary: yyDollar[3].booleanUnion()} } case 380: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2336 +//line sql.y:2337 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].str)} } case 381: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2340 +//line sql.y:2341 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: yyDollar[2].booleanUnion()} } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2345 +//line sql.y:2346 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: yyDollar[2].booleanUnion()} } case 383: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2350 +//line sql.y:2351 { // BINARY: Shorthand for default CHARACTER SET but with binary collation yyVAL.columnCharset = ColumnCharset{Name: "", Binary: true} } case 384: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2355 +//line sql.y:2356 { // BINARY ASCII: Shorthand for CHARACTER SET latin1 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: true} } case 385: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2360 +//line sql.y:2361 { // BINARY UNICODE: Shorthand for CHARACTER SET ucs2 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: true} @@ -12825,7 +12913,7 @@ yydefault: case 386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2366 +//line sql.y:2367 { yyLOCAL = false } @@ -12833,33 +12921,33 @@ yydefault: case 387: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2370 +//line sql.y:2371 { yyLOCAL = true } yyVAL.union = yyLOCAL case 388: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2375 +//line sql.y:2376 { yyVAL.str = "" } case 389: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2379 +//line sql.y:2380 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } case 390: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2383 +//line sql.y:2384 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 391: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2389 +//line sql.y:2390 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } @@ -12867,7 +12955,7 @@ yydefault: case 392: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2394 +//line sql.y:2395 { yyLOCAL = nil } @@ -12875,7 +12963,7 @@ yydefault: case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2398 +//line sql.y:2399 { yyLOCAL = yyDollar[1].indexOptionsUnion() } @@ -12883,14 +12971,14 @@ yydefault: case 394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2404 +//line sql.y:2405 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL case 395: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2408 +//line sql.y:2409 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) @@ -12898,7 +12986,7 @@ yydefault: case 396: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2414 +//line sql.y:2415 { yyLOCAL = yyDollar[1].indexOptionUnion() } @@ -12906,7 +12994,7 @@ yydefault: case 397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2418 +//line sql.y:2419 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} @@ -12915,7 +13003,7 @@ yydefault: case 398: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2423 +//line sql.y:2424 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } @@ -12923,7 +13011,7 @@ yydefault: case 399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2427 +//line sql.y:2428 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -12931,7 +13019,7 @@ yydefault: case 400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2431 +//line sql.y:2432 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -12939,7 +13027,7 @@ yydefault: case 401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2435 +//line sql.y:2436 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].identifierCI.String()} } @@ -12947,7 +13035,7 @@ yydefault: case 402: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2439 +//line sql.y:2440 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12955,27 +13043,27 @@ yydefault: case 403: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2443 +//line sql.y:2444 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 404: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2449 +//line sql.y:2450 { yyVAL.str = "" } case 405: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2453 +//line sql.y:2454 { yyVAL.str = string(yyDollar[1].str) } case 406: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2459 +//line sql.y:2460 { yyLOCAL = &IndexInfo{Type: IndexTypePrimary, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI("PRIMARY")} } @@ -12983,7 +13071,7 @@ yydefault: case 407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2463 +//line sql.y:2464 { yyLOCAL = &IndexInfo{Type: IndexTypeSpatial, Name: NewIdentifierCI(yyDollar[3].str)} } @@ -12991,7 +13079,7 @@ yydefault: case 408: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2467 +//line sql.y:2468 { yyLOCAL = &IndexInfo{Type: IndexTypeFullText, Name: NewIdentifierCI(yyDollar[3].str)} } @@ -12999,7 +13087,7 @@ yydefault: case 409: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2471 +//line sql.y:2472 { yyLOCAL = &IndexInfo{Type: IndexTypeUnique, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[4].str)} } @@ -13007,100 +13095,100 @@ yydefault: case 410: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2475 +//line sql.y:2476 { yyLOCAL = &IndexInfo{Type: IndexTypeDefault, Name: NewIdentifierCI(yyDollar[2].str)} } yyVAL.union = yyLOCAL case 411: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2480 +//line sql.y:2481 { yyVAL.str = "" } case 412: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2484 +//line sql.y:2485 { yyVAL.str = yyDollar[2].str } case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2490 +//line sql.y:2491 { yyVAL.str = string(yyDollar[1].str) } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2494 +//line sql.y:2495 { yyVAL.str = string(yyDollar[1].str) } case 415: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2498 +//line sql.y:2499 { yyVAL.str = string(yyDollar[1].str) } case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2504 +//line sql.y:2505 { yyVAL.str = string(yyDollar[1].str) } case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2508 +//line sql.y:2509 { yyVAL.str = string(yyDollar[1].str) } case 418: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2513 +//line sql.y:2514 { yyVAL.str = "" } case 419: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2517 +//line sql.y:2518 { yyVAL.str = yyDollar[1].str } case 420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2523 +//line sql.y:2524 { yyVAL.str = string(yyDollar[1].str) } case 421: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2527 +//line sql.y:2528 { yyVAL.str = string(yyDollar[1].str) } case 422: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2532 +//line sql.y:2533 { yyVAL.str = "" } case 423: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2536 +//line sql.y:2537 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2542 +//line sql.y:2543 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL case 425: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2546 +//line sql.y:2547 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) @@ -13108,7 +13196,7 @@ yydefault: case 426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2552 +//line sql.y:2553 { yyLOCAL = &IndexColumn{Column: yyDollar[1].identifierCI, Length: yyDollar[2].intPtrUnion(), Direction: yyDollar[3].orderDirectionUnion()} } @@ -13116,7 +13204,7 @@ yydefault: case 427: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2556 +//line sql.y:2557 { yyLOCAL = &IndexColumn{Expression: yyDollar[2].exprUnion(), Direction: yyDollar[4].orderDirectionUnion()} } @@ -13124,7 +13212,7 @@ yydefault: case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2562 +//line sql.y:2563 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -13132,7 +13220,7 @@ yydefault: case 429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2566 +//line sql.y:2567 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -13140,7 +13228,7 @@ yydefault: case 430: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2572 +//line sql.y:2573 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -13148,7 +13236,7 @@ yydefault: case 431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2576 +//line sql.y:2577 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -13156,7 +13244,7 @@ yydefault: case 432: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2582 +//line sql.y:2583 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewIdentifierCI(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } @@ -13164,7 +13252,7 @@ yydefault: case 433: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2588 +//line sql.y:2589 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion()} } @@ -13172,7 +13260,7 @@ yydefault: case 434: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2592 +//line sql.y:2593 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion()} } @@ -13180,7 +13268,7 @@ yydefault: case 435: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2596 +//line sql.y:2597 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion()} } @@ -13188,7 +13276,7 @@ yydefault: case 436: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2600 +//line sql.y:2601 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion(), OnUpdate: yyDollar[8].referenceActionUnion()} } @@ -13196,7 +13284,7 @@ yydefault: case 437: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2604 +//line sql.y:2605 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion(), OnDelete: yyDollar[8].referenceActionUnion()} } @@ -13204,7 +13292,7 @@ yydefault: case 438: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2609 +//line sql.y:2610 { yyLOCAL = nil } @@ -13212,7 +13300,7 @@ yydefault: case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2613 +//line sql.y:2614 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } @@ -13220,7 +13308,7 @@ yydefault: case 440: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2619 +//line sql.y:2620 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } @@ -13228,7 +13316,7 @@ yydefault: case 441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2625 +//line sql.y:2626 { yyLOCAL = yyDollar[2].matchActionUnion() } @@ -13236,7 +13324,7 @@ yydefault: case 442: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2631 +//line sql.y:2632 { yyLOCAL = Full } @@ -13244,7 +13332,7 @@ yydefault: case 443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2635 +//line sql.y:2636 { yyLOCAL = Partial } @@ -13252,7 +13340,7 @@ yydefault: case 444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2639 +//line sql.y:2640 { yyLOCAL = Simple } @@ -13260,7 +13348,7 @@ yydefault: case 445: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2644 +//line sql.y:2645 { yyLOCAL = DefaultMatch } @@ -13268,7 +13356,7 @@ yydefault: case 446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2648 +//line sql.y:2649 { yyLOCAL = yyDollar[1].matchActionUnion() } @@ -13276,7 +13364,7 @@ yydefault: case 447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2654 +//line sql.y:2655 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -13284,7 +13372,7 @@ yydefault: case 448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2660 +//line sql.y:2661 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -13292,7 +13380,7 @@ yydefault: case 449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2666 +//line sql.y:2667 { yyLOCAL = Restrict } @@ -13300,7 +13388,7 @@ yydefault: case 450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2670 +//line sql.y:2671 { yyLOCAL = Cascade } @@ -13308,7 +13396,7 @@ yydefault: case 451: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2674 +//line sql.y:2675 { yyLOCAL = NoAction } @@ -13316,7 +13404,7 @@ yydefault: case 452: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2678 +//line sql.y:2679 { yyLOCAL = SetDefault } @@ -13324,33 +13412,33 @@ yydefault: case 453: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2682 +//line sql.y:2683 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL case 454: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2687 +//line sql.y:2688 { yyVAL.str = "" } case 455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2691 +//line sql.y:2692 { yyVAL.str = string(yyDollar[1].str) } case 456: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2695 +//line sql.y:2696 { yyVAL.str = string(yyDollar[1].str) } case 457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2701 +//line sql.y:2702 { yyLOCAL = true } @@ -13358,7 +13446,7 @@ yydefault: case 458: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2705 +//line sql.y:2706 { yyLOCAL = false } @@ -13366,7 +13454,7 @@ yydefault: case 459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2710 +//line sql.y:2711 { yyLOCAL = true } @@ -13374,7 +13462,7 @@ yydefault: case 460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2714 +//line sql.y:2715 { yyLOCAL = yyDollar[1].booleanUnion() } @@ -13382,7 +13470,7 @@ yydefault: case 461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2719 +//line sql.y:2720 { yyLOCAL = nil } @@ -13390,7 +13478,7 @@ yydefault: case 462: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2723 +//line sql.y:2724 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -13398,21 +13486,21 @@ yydefault: case 463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2729 +//line sql.y:2730 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 464: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2733 +//line sql.y:2734 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } case 465: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2737 +//line sql.y:2738 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -13420,14 +13508,14 @@ yydefault: case 466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2743 +//line sql.y:2744 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 467: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2747 +//line sql.y:2748 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -13435,7 +13523,7 @@ yydefault: case 468: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2753 +//line sql.y:2754 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13443,7 +13531,7 @@ yydefault: case 469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2757 +//line sql.y:2758 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13451,7 +13539,7 @@ yydefault: case 470: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2761 +//line sql.y:2762 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13459,7 +13547,7 @@ yydefault: case 471: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2765 +//line sql.y:2766 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } @@ -13467,7 +13555,7 @@ yydefault: case 472: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2769 +//line sql.y:2770 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } @@ -13475,7 +13563,7 @@ yydefault: case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2773 +//line sql.y:2774 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13483,7 +13571,7 @@ yydefault: case 474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2777 +//line sql.y:2778 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13491,7 +13579,7 @@ yydefault: case 475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2781 +//line sql.y:2782 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13499,7 +13587,7 @@ yydefault: case 476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2785 +//line sql.y:2786 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13507,7 +13595,7 @@ yydefault: case 477: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2789 +//line sql.y:2790 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -13515,7 +13603,7 @@ yydefault: case 478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2793 +//line sql.y:2794 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -13523,7 +13611,7 @@ yydefault: case 479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2797 +//line sql.y:2798 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13531,7 +13619,7 @@ yydefault: case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2801 +//line sql.y:2802 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13539,7 +13627,7 @@ yydefault: case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2805 +//line sql.y:2806 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].identifierCS.String(), CaseSensitive: true} } @@ -13547,7 +13635,7 @@ yydefault: case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2809 +//line sql.y:2810 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13555,7 +13643,7 @@ yydefault: case 483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2813 +//line sql.y:2814 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13563,7 +13651,7 @@ yydefault: case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2817 +//line sql.y:2818 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13571,7 +13659,7 @@ yydefault: case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2821 +//line sql.y:2822 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13579,7 +13667,7 @@ yydefault: case 486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2825 +//line sql.y:2826 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13587,7 +13675,7 @@ yydefault: case 487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2829 +//line sql.y:2830 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13595,7 +13683,7 @@ yydefault: case 488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2833 +//line sql.y:2834 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13603,7 +13691,7 @@ yydefault: case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2837 +//line sql.y:2838 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13611,7 +13699,7 @@ yydefault: case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2841 +//line sql.y:2842 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13619,7 +13707,7 @@ yydefault: case 491: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2845 +//line sql.y:2846 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13627,7 +13715,7 @@ yydefault: case 492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2849 +//line sql.y:2850 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13635,7 +13723,7 @@ yydefault: case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2853 +//line sql.y:2854 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13643,7 +13731,7 @@ yydefault: case 494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2857 +//line sql.y:2858 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13651,7 +13739,7 @@ yydefault: case 495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2861 +//line sql.y:2862 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13659,7 +13747,7 @@ yydefault: case 496: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2865 +//line sql.y:2866 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13667,7 +13755,7 @@ yydefault: case 497: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2869 +//line sql.y:2870 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].identifierCI.String() + yyDollar[4].str), CaseSensitive: true} } @@ -13675,63 +13763,63 @@ yydefault: case 498: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2873 +//line sql.y:2874 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL case 499: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2878 +//line sql.y:2879 { yyVAL.str = "" } case 500: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2882 +//line sql.y:2883 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 501: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2886 +//line sql.y:2887 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2905 +//line sql.y:2906 { yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 512: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2909 +//line sql.y:2910 { yyVAL.str = yyDollar[1].identifierCI.String() } case 513: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2913 +//line sql.y:2914 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 514: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2917 +//line sql.y:2918 { yyVAL.str = string(yyDollar[1].str) } case 515: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2922 +//line sql.y:2923 { yyVAL.str = "" } case 517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2928 +//line sql.y:2929 { yyLOCAL = false } @@ -13739,7 +13827,7 @@ yydefault: case 518: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2932 +//line sql.y:2933 { yyLOCAL = true } @@ -13747,7 +13835,7 @@ yydefault: case 519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2937 +//line sql.y:2938 { yyLOCAL = nil } @@ -13755,27 +13843,27 @@ yydefault: case 520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2941 +//line sql.y:2942 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL case 521: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2946 +//line sql.y:2947 { yyVAL.str = "" } case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2950 +//line sql.y:2951 { yyVAL.str = string(yyDollar[2].str) } case 523: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2955 +//line sql.y:2956 { yyLOCAL = nil } @@ -13783,7 +13871,7 @@ yydefault: case 524: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2959 +//line sql.y:2960 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } @@ -13791,7 +13879,7 @@ yydefault: case 525: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2963 +//line sql.y:2964 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } @@ -13799,7 +13887,7 @@ yydefault: case 526: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2968 +//line sql.y:2969 { yyLOCAL = nil } @@ -13807,14 +13895,14 @@ yydefault: case 527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2972 +//line sql.y:2973 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 528: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2976 +//line sql.y:2977 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) @@ -13822,14 +13910,14 @@ yydefault: case 529: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2980 +//line sql.y:2981 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 530: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2984 +//line sql.y:2985 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) @@ -13837,7 +13925,7 @@ yydefault: case 531: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2988 +//line sql.y:2989 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } @@ -13845,21 +13933,21 @@ yydefault: case 532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2994 +//line sql.y:2995 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2998 +//line sql.y:2999 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3002 +//line sql.y:3003 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -13867,7 +13955,7 @@ yydefault: case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3008 +//line sql.y:3009 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -13875,7 +13963,7 @@ yydefault: case 536: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3012 +//line sql.y:3013 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -13883,7 +13971,7 @@ yydefault: case 537: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3016 +//line sql.y:3017 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -13891,7 +13979,7 @@ yydefault: case 538: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3020 +//line sql.y:3021 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } @@ -13899,7 +13987,7 @@ yydefault: case 539: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3024 +//line sql.y:3025 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } @@ -13907,7 +13995,7 @@ yydefault: case 540: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3028 +//line sql.y:3029 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -13915,7 +14003,7 @@ yydefault: case 541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3032 +//line sql.y:3033 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } @@ -13923,7 +14011,7 @@ yydefault: case 542: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3036 +//line sql.y:3037 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion(), DefaultLiteral: true} } @@ -13931,7 +14019,7 @@ yydefault: case 543: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3040 +//line sql.y:3041 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } @@ -13939,7 +14027,7 @@ yydefault: case 544: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3044 +//line sql.y:3045 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(false)} } @@ -13947,7 +14035,7 @@ yydefault: case 545: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3048 +//line sql.y:3049 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(true)} } @@ -13955,7 +14043,7 @@ yydefault: case 546: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3052 +//line sql.y:3053 { yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } @@ -13963,7 +14051,7 @@ yydefault: case 547: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3056 +//line sql.y:3057 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } @@ -13971,7 +14059,7 @@ yydefault: case 548: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3060 +//line sql.y:3061 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } @@ -13979,7 +14067,7 @@ yydefault: case 549: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3064 +//line sql.y:3065 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } @@ -13987,7 +14075,7 @@ yydefault: case 550: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3068 +//line sql.y:3069 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -13995,7 +14083,7 @@ yydefault: case 551: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3072 +//line sql.y:3073 { yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } @@ -14003,7 +14091,7 @@ yydefault: case 552: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3076 +//line sql.y:3077 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } @@ -14011,7 +14099,7 @@ yydefault: case 553: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3080 +//line sql.y:3081 { yyLOCAL = &KeyState{Enable: false} } @@ -14019,7 +14107,7 @@ yydefault: case 554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3084 +//line sql.y:3085 { yyLOCAL = &KeyState{Enable: true} } @@ -14027,7 +14115,7 @@ yydefault: case 555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3088 +//line sql.y:3089 { yyLOCAL = &TablespaceOperation{Import: false} } @@ -14035,7 +14123,7 @@ yydefault: case 556: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3092 +//line sql.y:3093 { yyLOCAL = &TablespaceOperation{Import: true} } @@ -14043,7 +14131,7 @@ yydefault: case 557: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3096 +//line sql.y:3097 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } @@ -14051,7 +14139,7 @@ yydefault: case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3100 +//line sql.y:3101 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } @@ -14059,7 +14147,7 @@ yydefault: case 559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3104 +//line sql.y:3105 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } @@ -14067,7 +14155,7 @@ yydefault: case 560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3108 +//line sql.y:3109 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } @@ -14075,7 +14163,7 @@ yydefault: case 561: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3112 +//line sql.y:3113 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -14083,7 +14171,7 @@ yydefault: case 562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3116 +//line sql.y:3117 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -14091,7 +14179,7 @@ yydefault: case 563: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3120 +//line sql.y:3121 { yyLOCAL = &Force{} } @@ -14099,7 +14187,7 @@ yydefault: case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3124 +//line sql.y:3125 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } @@ -14107,7 +14195,7 @@ yydefault: case 565: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3128 +//line sql.y:3129 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } @@ -14115,14 +14203,14 @@ yydefault: case 566: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:3134 +//line sql.y:3135 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3138 +//line sql.y:3139 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -14130,7 +14218,7 @@ yydefault: case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3144 +//line sql.y:3145 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14138,7 +14226,7 @@ yydefault: case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3148 +//line sql.y:3149 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14146,7 +14234,7 @@ yydefault: case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3152 +//line sql.y:3153 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14154,7 +14242,7 @@ yydefault: case 571: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3156 +//line sql.y:3157 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14162,7 +14250,7 @@ yydefault: case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3160 +//line sql.y:3161 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -14170,7 +14258,7 @@ yydefault: case 573: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3164 +//line sql.y:3165 { yyLOCAL = &LockOption{Type: NoneType} } @@ -14178,7 +14266,7 @@ yydefault: case 574: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3168 +//line sql.y:3169 { yyLOCAL = &LockOption{Type: SharedType} } @@ -14186,7 +14274,7 @@ yydefault: case 575: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3172 +//line sql.y:3173 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -14194,7 +14282,7 @@ yydefault: case 576: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3176 +//line sql.y:3177 { yyLOCAL = &Validation{With: true} } @@ -14202,7 +14290,7 @@ yydefault: case 577: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3180 +//line sql.y:3181 { yyLOCAL = &Validation{With: false} } @@ -14210,7 +14298,7 @@ yydefault: case 578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3186 +//line sql.y:3187 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14221,7 +14309,7 @@ yydefault: case 579: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3193 +//line sql.y:3194 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14232,7 +14320,7 @@ yydefault: case 580: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3200 +//line sql.y:3201 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14243,7 +14331,7 @@ yydefault: case 581: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3207 +//line sql.y:3208 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() @@ -14253,7 +14341,7 @@ yydefault: case 582: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3213 +//line sql.y:3214 { yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].tableStmtUnion(), CheckOption: yyDollar[11].str} } @@ -14261,7 +14349,7 @@ yydefault: case 583: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3223 +//line sql.y:3224 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14272,7 +14360,7 @@ yydefault: case 584: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3230 +//line sql.y:3231 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14283,7 +14371,7 @@ yydefault: case 585: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3237 +//line sql.y:3238 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -14299,7 +14387,7 @@ yydefault: case 586: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3249 +//line sql.y:3250 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -14313,7 +14401,7 @@ yydefault: case 587: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3259 +//line sql.y:3260 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -14321,7 +14409,7 @@ yydefault: case 588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3263 +//line sql.y:3264 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -14329,7 +14417,7 @@ yydefault: case 589: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3267 +//line sql.y:3268 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -14346,7 +14434,7 @@ yydefault: case 590: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3280 +//line sql.y:3281 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -14360,7 +14448,7 @@ yydefault: case 591: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3290 +//line sql.y:3291 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -14368,7 +14456,7 @@ yydefault: case 592: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3294 +//line sql.y:3295 { yyLOCAL = &AlterVschema{Action: DropSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -14376,7 +14464,7 @@ yydefault: case 593: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3298 +//line sql.y:3299 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -14391,7 +14479,7 @@ yydefault: case 594: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3309 +//line sql.y:3310 { yyLOCAL = &AlterVschema{ Action: DropAutoIncDDLAction, @@ -14402,7 +14490,7 @@ yydefault: case 595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3316 +//line sql.y:3317 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -14413,7 +14501,7 @@ yydefault: case 596: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3323 +//line sql.y:3324 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -14424,7 +14512,7 @@ yydefault: case 597: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3330 +//line sql.y:3331 { yyLOCAL = &AlterMigration{ Type: CleanupAllMigrationType, @@ -14434,7 +14522,7 @@ yydefault: case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3336 +//line sql.y:3337 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14445,7 +14533,7 @@ yydefault: case 599: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3343 +//line sql.y:3344 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14457,7 +14545,7 @@ yydefault: case 600: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3351 +//line sql.y:3352 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, @@ -14467,7 +14555,7 @@ yydefault: case 601: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3357 +//line sql.y:3358 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -14478,7 +14566,7 @@ yydefault: case 602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3364 +//line sql.y:3365 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, @@ -14488,7 +14576,7 @@ yydefault: case 603: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3370 +//line sql.y:3371 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -14499,7 +14587,7 @@ yydefault: case 604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3377 +//line sql.y:3378 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, @@ -14509,7 +14597,7 @@ yydefault: case 605: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3383 +//line sql.y:3384 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -14522,7 +14610,7 @@ yydefault: case 606: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3392 +//line sql.y:3393 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -14534,7 +14622,7 @@ yydefault: case 607: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3400 +//line sql.y:3401 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -14545,7 +14633,7 @@ yydefault: case 608: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3407 +//line sql.y:3408 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, @@ -14555,7 +14643,7 @@ yydefault: case 609: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3413 +//line sql.y:3414 { yyLOCAL = &AlterMigration{ Type: ForceCutOverMigrationType, @@ -14566,7 +14654,7 @@ yydefault: case 610: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3420 +//line sql.y:3421 { yyLOCAL = &AlterMigration{ Type: ForceCutOverAllMigrationType, @@ -14576,7 +14664,7 @@ yydefault: case 611: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3426 +//line sql.y:3427 { yyLOCAL = &AlterMigration{ Type: SetCutOverThresholdMigrationType, @@ -14588,7 +14676,7 @@ yydefault: case 612: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3435 +//line sql.y:3436 { yyLOCAL = nil } @@ -14596,7 +14684,7 @@ yydefault: case 613: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3439 +//line sql.y:3440 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -14607,7 +14695,7 @@ yydefault: case 614: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3448 +//line sql.y:3449 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14619,7 +14707,7 @@ yydefault: case 615: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3456 +//line sql.y:3457 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14632,7 +14720,7 @@ yydefault: case 616: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3465 +//line sql.y:3466 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14643,7 +14731,7 @@ yydefault: case 617: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3472 +//line sql.y:3473 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14654,7 +14742,7 @@ yydefault: case 618: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3480 +//line sql.y:3481 { yyLOCAL = nil } @@ -14662,7 +14750,7 @@ yydefault: case 619: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3484 +//line sql.y:3485 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14675,7 +14763,7 @@ yydefault: case 620: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3493 +//line sql.y:3494 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14689,7 +14777,7 @@ yydefault: case 621: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3504 +//line sql.y:3505 { yyLOCAL = nil } @@ -14697,7 +14785,7 @@ yydefault: case 622: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3508 +//line sql.y:3509 { yyLOCAL = yyDollar[2].partDefsUnion() } @@ -14705,7 +14793,7 @@ yydefault: case 623: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3513 +//line sql.y:3514 { yyLOCAL = false } @@ -14713,7 +14801,7 @@ yydefault: case 624: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3517 +//line sql.y:3518 { yyLOCAL = true } @@ -14721,7 +14809,7 @@ yydefault: case 625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3522 +//line sql.y:3523 { yyLOCAL = 0 } @@ -14729,7 +14817,7 @@ yydefault: case 626: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3526 +//line sql.y:3527 { yyLOCAL = convertStringToInt(yyDollar[3].str) } @@ -14737,7 +14825,7 @@ yydefault: case 627: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3532 +//line sql.y:3533 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } @@ -14745,7 +14833,7 @@ yydefault: case 628: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3538 +//line sql.y:3539 { yyLOCAL = yyDollar[3].jtColumnListUnion() } @@ -14753,14 +14841,14 @@ yydefault: case 629: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3544 +//line sql.y:3545 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL case 630: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3548 +//line sql.y:3549 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) @@ -14768,7 +14856,7 @@ yydefault: case 631: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3554 +//line sql.y:3555 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } @@ -14776,7 +14864,7 @@ yydefault: case 632: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3558 +//line sql.y:3559 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} @@ -14786,7 +14874,7 @@ yydefault: case 633: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3564 +//line sql.y:3565 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} @@ -14796,7 +14884,7 @@ yydefault: case 634: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3570 +//line sql.y:3571 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} @@ -14806,7 +14894,7 @@ yydefault: case 635: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3576 +//line sql.y:3577 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} @@ -14816,7 +14904,7 @@ yydefault: case 636: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3582 +//line sql.y:3583 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} @@ -14825,7 +14913,7 @@ yydefault: case 637: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3588 +//line sql.y:3589 { yyLOCAL = false } @@ -14833,7 +14921,7 @@ yydefault: case 638: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3592 +//line sql.y:3593 { yyLOCAL = true } @@ -14841,7 +14929,7 @@ yydefault: case 639: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3596 +//line sql.y:3597 { yyLOCAL = false } @@ -14849,7 +14937,7 @@ yydefault: case 640: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3600 +//line sql.y:3601 { yyLOCAL = true } @@ -14857,7 +14945,7 @@ yydefault: case 641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3606 +//line sql.y:3607 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -14865,7 +14953,7 @@ yydefault: case 642: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3612 +//line sql.y:3613 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -14873,7 +14961,7 @@ yydefault: case 643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3618 +//line sql.y:3619 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } @@ -14881,7 +14969,7 @@ yydefault: case 644: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3622 +//line sql.y:3623 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } @@ -14889,7 +14977,7 @@ yydefault: case 645: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3626 +//line sql.y:3627 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } @@ -14897,7 +14985,7 @@ yydefault: case 646: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3632 +//line sql.y:3633 { yyLOCAL = RangeType } @@ -14905,7 +14993,7 @@ yydefault: case 647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3636 +//line sql.y:3637 { yyLOCAL = ListType } @@ -14913,7 +15001,7 @@ yydefault: case 648: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3641 +//line sql.y:3642 { yyLOCAL = -1 } @@ -14921,7 +15009,7 @@ yydefault: case 649: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3645 +//line sql.y:3646 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -14929,7 +15017,7 @@ yydefault: case 650: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3650 +//line sql.y:3651 { yyLOCAL = -1 } @@ -14937,7 +15025,7 @@ yydefault: case 651: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3654 +//line sql.y:3655 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -14945,7 +15033,7 @@ yydefault: case 652: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3660 +//line sql.y:3661 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } @@ -14953,7 +15041,7 @@ yydefault: case 653: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3664 +//line sql.y:3665 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } @@ -14961,7 +15049,7 @@ yydefault: case 654: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3668 +//line sql.y:3669 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } @@ -14969,7 +15057,7 @@ yydefault: case 655: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3672 +//line sql.y:3673 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } @@ -14977,7 +15065,7 @@ yydefault: case 656: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3676 +//line sql.y:3677 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } @@ -14985,7 +15073,7 @@ yydefault: case 657: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3680 +//line sql.y:3681 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } @@ -14993,7 +15081,7 @@ yydefault: case 658: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3684 +//line sql.y:3685 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } @@ -15001,7 +15089,7 @@ yydefault: case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3688 +//line sql.y:3689 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } @@ -15009,7 +15097,7 @@ yydefault: case 660: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3692 +//line sql.y:3693 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } @@ -15017,7 +15105,7 @@ yydefault: case 661: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3696 +//line sql.y:3697 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } @@ -15025,7 +15113,7 @@ yydefault: case 662: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3700 +//line sql.y:3701 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } @@ -15033,7 +15121,7 @@ yydefault: case 663: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3704 +//line sql.y:3705 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } @@ -15041,7 +15129,7 @@ yydefault: case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3708 +//line sql.y:3709 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } @@ -15049,7 +15137,7 @@ yydefault: case 665: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3712 +//line sql.y:3713 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } @@ -15057,7 +15145,7 @@ yydefault: case 666: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3716 +//line sql.y:3717 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } @@ -15065,7 +15153,7 @@ yydefault: case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3720 +//line sql.y:3721 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } @@ -15073,7 +15161,7 @@ yydefault: case 668: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3724 +//line sql.y:3725 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } @@ -15081,7 +15169,7 @@ yydefault: case 669: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3728 +//line sql.y:3729 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } @@ -15089,7 +15177,7 @@ yydefault: case 670: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3732 +//line sql.y:3733 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } @@ -15097,7 +15185,7 @@ yydefault: case 671: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3736 +//line sql.y:3737 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } @@ -15105,7 +15193,7 @@ yydefault: case 672: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3740 +//line sql.y:3741 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } @@ -15113,7 +15201,7 @@ yydefault: case 673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3744 +//line sql.y:3745 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } @@ -15121,7 +15209,7 @@ yydefault: case 674: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3749 +//line sql.y:3750 { yyLOCAL = false } @@ -15129,7 +15217,7 @@ yydefault: case 675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3753 +//line sql.y:3754 { yyLOCAL = false } @@ -15137,7 +15225,7 @@ yydefault: case 676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3757 +//line sql.y:3758 { yyLOCAL = true } @@ -15145,28 +15233,28 @@ yydefault: case 677: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3763 +//line sql.y:3764 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL case 678: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3767 +//line sql.y:3768 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } case 679: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3773 +//line sql.y:3774 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } case 680: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3778 +//line sql.y:3779 { yyLOCAL = &PartitionDefinitionOptions{} } @@ -15174,7 +15262,7 @@ yydefault: case 681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3782 +//line sql.y:3783 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15183,7 +15271,7 @@ yydefault: case 682: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3787 +//line sql.y:3788 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15192,7 +15280,7 @@ yydefault: case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3792 +//line sql.y:3793 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15201,7 +15289,7 @@ yydefault: case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3797 +//line sql.y:3798 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15210,7 +15298,7 @@ yydefault: case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3802 +//line sql.y:3803 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15219,7 +15307,7 @@ yydefault: case 686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3807 +//line sql.y:3808 { yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15228,7 +15316,7 @@ yydefault: case 687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3812 +//line sql.y:3813 { yyDollar[1].partitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15237,7 +15325,7 @@ yydefault: case 688: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3817 +//line sql.y:3818 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15246,7 +15334,7 @@ yydefault: case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3822 +//line sql.y:3823 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() @@ -15255,7 +15343,7 @@ yydefault: case 690: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3828 +//line sql.y:3829 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } @@ -15263,14 +15351,14 @@ yydefault: case 691: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3834 +//line sql.y:3835 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL case 692: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3838 +//line sql.y:3839 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) @@ -15278,7 +15366,7 @@ yydefault: case 693: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3844 +//line sql.y:3845 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } @@ -15286,7 +15374,7 @@ yydefault: case 694: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3849 +//line sql.y:3850 { yyLOCAL = &SubPartitionDefinitionOptions{} } @@ -15294,7 +15382,7 @@ yydefault: case 695: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3853 +//line sql.y:3854 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15303,7 +15391,7 @@ yydefault: case 696: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3858 +//line sql.y:3859 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15312,7 +15400,7 @@ yydefault: case 697: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3863 +//line sql.y:3864 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15321,7 +15409,7 @@ yydefault: case 698: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3868 +//line sql.y:3869 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15330,7 +15418,7 @@ yydefault: case 699: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3873 +//line sql.y:3874 { yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15339,7 +15427,7 @@ yydefault: case 700: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3878 +//line sql.y:3879 { yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15348,7 +15436,7 @@ yydefault: case 701: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3883 +//line sql.y:3884 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() @@ -15357,7 +15445,7 @@ yydefault: case 702: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3890 +//line sql.y:3891 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15368,7 +15456,7 @@ yydefault: case 703: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3897 +//line sql.y:3898 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15379,7 +15467,7 @@ yydefault: case 704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3904 +//line sql.y:3905 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -15390,7 +15478,7 @@ yydefault: case 705: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3912 +//line sql.y:3913 { yyLOCAL = false } @@ -15398,7 +15486,7 @@ yydefault: case 706: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3916 +//line sql.y:3917 { yyLOCAL = true } @@ -15406,7 +15494,7 @@ yydefault: case 707: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3922 +//line sql.y:3923 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } @@ -15414,7 +15502,7 @@ yydefault: case 708: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3928 +//line sql.y:3929 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } @@ -15422,7 +15510,7 @@ yydefault: case 709: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3934 +//line sql.y:3935 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } @@ -15430,7 +15518,7 @@ yydefault: case 710: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3940 +//line sql.y:3941 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } @@ -15438,7 +15526,7 @@ yydefault: case 711: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3946 +//line sql.y:3947 { yyLOCAL = convertStringToInt(yyDollar[3].str) } @@ -15446,41 +15534,41 @@ yydefault: case 712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3952 +//line sql.y:3953 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL case 713: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3958 +//line sql.y:3959 { yyVAL.str = yyDollar[3].identifierCS.String() } case 714: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3964 +//line sql.y:3965 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL case 715: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3970 +//line sql.y:3971 { yyVAL.str = "" } case 716: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3974 +//line sql.y:3975 { yyVAL.str = "" } case 717: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3980 +//line sql.y:3981 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } @@ -15488,14 +15576,14 @@ yydefault: case 718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3986 +//line sql.y:3987 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL case 719: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3990 +//line sql.y:3991 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) @@ -15503,7 +15591,7 @@ yydefault: case 720: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3996 +//line sql.y:3997 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } @@ -15511,7 +15599,7 @@ yydefault: case 721: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4000 +//line sql.y:4001 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { @@ -15524,7 +15612,7 @@ yydefault: case 722: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4009 +//line sql.y:4010 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } @@ -15532,7 +15620,7 @@ yydefault: case 723: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4013 +//line sql.y:4014 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } @@ -15540,7 +15628,7 @@ yydefault: case 724: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4019 +//line sql.y:4020 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } @@ -15548,7 +15636,7 @@ yydefault: case 725: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4023 +//line sql.y:4024 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } @@ -15556,7 +15644,7 @@ yydefault: case 726: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4029 +//line sql.y:4030 { yyLOCAL = &Analyze{IsLocal: yyDollar[2].booleanUnion(), Table: yyDollar[4].tableName} } @@ -15564,7 +15652,7 @@ yydefault: case 727: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4035 +//line sql.y:4036 { yyLOCAL = &PurgeBinaryLogs{To: string(yyDollar[5].str)} } @@ -15572,7 +15660,7 @@ yydefault: case 728: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4039 +//line sql.y:4040 { yyLOCAL = &PurgeBinaryLogs{Before: string(yyDollar[5].str)} } @@ -15580,7 +15668,7 @@ yydefault: case 729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4045 +//line sql.y:4046 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } @@ -15588,7 +15676,7 @@ yydefault: case 730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4049 +//line sql.y:4050 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } @@ -15596,7 +15684,7 @@ yydefault: case 731: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4053 +//line sql.y:4054 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } @@ -15604,7 +15692,7 @@ yydefault: case 732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4057 +//line sql.y:4058 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } @@ -15612,7 +15700,7 @@ yydefault: case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4061 +//line sql.y:4062 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } @@ -15620,7 +15708,7 @@ yydefault: case 734: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4065 +//line sql.y:4066 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } @@ -15628,7 +15716,7 @@ yydefault: case 735: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4069 +//line sql.y:4070 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } @@ -15636,7 +15724,7 @@ yydefault: case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4073 +//line sql.y:4074 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } @@ -15644,7 +15732,7 @@ yydefault: case 737: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4077 +//line sql.y:4078 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } @@ -15652,7 +15740,7 @@ yydefault: case 738: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4081 +//line sql.y:4082 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -15660,7 +15748,7 @@ yydefault: case 739: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4085 +//line sql.y:4086 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } @@ -15668,7 +15756,7 @@ yydefault: case 740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4089 +//line sql.y:4090 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } @@ -15676,7 +15764,7 @@ yydefault: case 741: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4093 +//line sql.y:4094 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } @@ -15684,7 +15772,7 @@ yydefault: case 742: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4097 +//line sql.y:4098 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } @@ -15692,7 +15780,7 @@ yydefault: case 743: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4101 +//line sql.y:4102 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } @@ -15700,7 +15788,7 @@ yydefault: case 744: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4105 +//line sql.y:4106 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } @@ -15708,7 +15796,7 @@ yydefault: case 745: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4109 +//line sql.y:4110 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -15716,7 +15804,7 @@ yydefault: case 746: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4113 +//line sql.y:4114 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } @@ -15724,7 +15812,7 @@ yydefault: case 747: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4117 +//line sql.y:4118 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } @@ -15732,7 +15820,7 @@ yydefault: case 748: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4121 +//line sql.y:4122 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } @@ -15740,7 +15828,7 @@ yydefault: case 749: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4125 +//line sql.y:4126 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } @@ -15748,7 +15836,7 @@ yydefault: case 750: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4129 +//line sql.y:4130 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } @@ -15756,7 +15844,7 @@ yydefault: case 751: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4133 +//line sql.y:4134 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } @@ -15764,7 +15852,7 @@ yydefault: case 752: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4137 +//line sql.y:4138 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } @@ -15772,7 +15860,7 @@ yydefault: case 753: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4141 +//line sql.y:4142 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } @@ -15780,7 +15868,7 @@ yydefault: case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4145 +//line sql.y:4146 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } @@ -15788,7 +15876,7 @@ yydefault: case 755: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4149 +//line sql.y:4150 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } @@ -15796,7 +15884,7 @@ yydefault: case 756: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4153 +//line sql.y:4154 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } @@ -15804,7 +15892,7 @@ yydefault: case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4157 +//line sql.y:4158 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } @@ -15812,7 +15900,7 @@ yydefault: case 758: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4161 +//line sql.y:4162 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } @@ -15820,7 +15908,7 @@ yydefault: case 759: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4165 +//line sql.y:4166 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } @@ -15828,7 +15916,7 @@ yydefault: case 760: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4169 +//line sql.y:4170 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } @@ -15836,7 +15924,7 @@ yydefault: case 761: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4173 +//line sql.y:4174 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } @@ -15844,7 +15932,7 @@ yydefault: case 762: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4177 +//line sql.y:4178 { yyLOCAL = &ShowThrottledApps{} } @@ -15852,7 +15940,7 @@ yydefault: case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4181 +//line sql.y:4182 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } @@ -15860,7 +15948,7 @@ yydefault: case 764: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4185 +//line sql.y:4186 { yyLOCAL = &ShowThrottlerStatus{} } @@ -15868,7 +15956,7 @@ yydefault: case 765: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4189 +//line sql.y:4190 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } @@ -15876,7 +15964,7 @@ yydefault: case 766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4193 +//line sql.y:4194 { yyLOCAL = &Show{&ShowBasic{Command: VschemaKeyspaces}} } @@ -15884,7 +15972,7 @@ yydefault: case 767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4197 +//line sql.y:4198 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } @@ -15892,7 +15980,7 @@ yydefault: case 768: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4201 +//line sql.y:4202 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } @@ -15900,7 +15988,7 @@ yydefault: case 769: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4205 +//line sql.y:4206 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } @@ -15908,7 +15996,7 @@ yydefault: case 770: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4209 +//line sql.y:4210 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } @@ -15916,7 +16004,7 @@ yydefault: case 771: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4213 +//line sql.y:4214 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } @@ -15924,7 +16012,7 @@ yydefault: case 772: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4217 +//line sql.y:4218 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } @@ -15932,7 +16020,7 @@ yydefault: case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4224 +//line sql.y:4225 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } @@ -15940,7 +16028,7 @@ yydefault: case 774: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4228 +//line sql.y:4229 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } @@ -15948,7 +16036,7 @@ yydefault: case 775: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4232 +//line sql.y:4233 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } @@ -15956,7 +16044,7 @@ yydefault: case 776: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4236 +//line sql.y:4237 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } @@ -15964,7 +16052,7 @@ yydefault: case 777: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4240 +//line sql.y:4241 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } @@ -15972,7 +16060,7 @@ yydefault: case 778: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4244 +//line sql.y:4245 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } @@ -15980,7 +16068,7 @@ yydefault: case 779: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4248 +//line sql.y:4249 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } @@ -15988,7 +16076,7 @@ yydefault: case 780: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4252 +//line sql.y:4253 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } @@ -15996,7 +16084,7 @@ yydefault: case 781: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4256 +//line sql.y:4257 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } @@ -16004,7 +16092,7 @@ yydefault: case 782: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4260 +//line sql.y:4261 { yyLOCAL = &Show{&ShowTransactionStatus{TransactionID: string(yyDollar[5].str)}} } @@ -16012,7 +16100,7 @@ yydefault: case 783: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4264 +//line sql.y:4265 { yyLOCAL = &Show{&ShowTransactionStatus{}} } @@ -16020,37 +16108,37 @@ yydefault: case 784: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4268 +//line sql.y:4269 { yyLOCAL = &Show{&ShowTransactionStatus{Keyspace: yyDollar[5].identifierCS.String()}} } yyVAL.union = yyLOCAL case 785: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4273 +//line sql.y:4274 { } case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4275 +//line sql.y:4276 { } case 787: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4279 +//line sql.y:4280 { yyVAL.str = "" } case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4283 +//line sql.y:4284 { yyVAL.str = "extended " } case 789: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4289 +//line sql.y:4290 { yyLOCAL = false } @@ -16058,45 +16146,45 @@ yydefault: case 790: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4293 +//line sql.y:4294 { yyLOCAL = true } yyVAL.union = yyLOCAL case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4299 +//line sql.y:4300 { yyVAL.str = string(yyDollar[1].str) } case 792: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4303 +//line sql.y:4304 { yyVAL.str = string(yyDollar[1].str) } case 793: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4309 +//line sql.y:4310 { yyVAL.identifierCS = NewIdentifierCS("") } case 794: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4313 +//line sql.y:4314 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 795: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4317 +//line sql.y:4318 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 796: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4323 +//line sql.y:4324 { yyLOCAL = nil } @@ -16104,7 +16192,7 @@ yydefault: case 797: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4327 +//line sql.y:4328 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } @@ -16112,7 +16200,7 @@ yydefault: case 798: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4331 +//line sql.y:4332 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } @@ -16120,7 +16208,7 @@ yydefault: case 799: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4337 +//line sql.y:4338 { yyLOCAL = nil } @@ -16128,45 +16216,45 @@ yydefault: case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4341 +//line sql.y:4342 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL case 801: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4347 +//line sql.y:4348 { yyVAL.empty = struct{}{} } case 802: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4351 +//line sql.y:4352 { yyVAL.empty = struct{}{} } case 803: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4355 +//line sql.y:4356 { yyVAL.empty = struct{}{} } case 804: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4361 +//line sql.y:4362 { yyVAL.str = string(yyDollar[1].str) } case 805: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4365 +//line sql.y:4366 { yyVAL.str = string(yyDollar[1].str) } case 806: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4371 +//line sql.y:4372 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } @@ -16174,7 +16262,7 @@ yydefault: case 807: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4375 +//line sql.y:4376 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } @@ -16182,39 +16270,39 @@ yydefault: case 808: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4379 +//line sql.y:4380 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL case 809: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4386 +//line sql.y:4387 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 810: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4390 +//line sql.y:4391 { yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 811: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4394 +//line sql.y:4395 { yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 812: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4398 +//line sql.y:4399 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 813: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4405 +//line sql.y:4406 { yyLOCAL = &Begin{} } @@ -16222,7 +16310,7 @@ yydefault: case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4409 +//line sql.y:4410 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } @@ -16230,7 +16318,7 @@ yydefault: case 815: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4414 +//line sql.y:4415 { yyLOCAL = nil } @@ -16238,7 +16326,7 @@ yydefault: case 816: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4418 +//line sql.y:4419 { yyLOCAL = yyDollar[1].txAccessModesUnion() } @@ -16246,14 +16334,14 @@ yydefault: case 817: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4424 +//line sql.y:4425 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL case 818: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4428 +//line sql.y:4429 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) @@ -16261,7 +16349,7 @@ yydefault: case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4434 +//line sql.y:4435 { yyLOCAL = WithConsistentSnapshot } @@ -16269,7 +16357,7 @@ yydefault: case 820: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4438 +//line sql.y:4439 { yyLOCAL = ReadWrite } @@ -16277,7 +16365,7 @@ yydefault: case 821: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4442 +//line sql.y:4443 { yyLOCAL = ReadOnly } @@ -16285,7 +16373,7 @@ yydefault: case 822: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4449 +//line sql.y:4450 { yyLOCAL = &Commit{} } @@ -16293,7 +16381,7 @@ yydefault: case 823: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4455 +//line sql.y:4456 { yyLOCAL = &Rollback{} } @@ -16301,39 +16389,39 @@ yydefault: case 824: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4459 +//line sql.y:4460 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL case 825: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4464 +//line sql.y:4465 { yyVAL.empty = struct{}{} } case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4466 +//line sql.y:4467 { yyVAL.empty = struct{}{} } case 827: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4469 +//line sql.y:4470 { yyVAL.empty = struct{}{} } case 828: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4471 +//line sql.y:4472 { yyVAL.empty = struct{}{} } case 829: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4475 +//line sql.y:4476 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } @@ -16341,7 +16429,7 @@ yydefault: case 830: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4481 +//line sql.y:4482 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } @@ -16349,7 +16437,7 @@ yydefault: case 831: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4486 +//line sql.y:4487 { yyLOCAL = EmptyType } @@ -16357,7 +16445,7 @@ yydefault: case 832: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4490 +//line sql.y:4491 { yyLOCAL = JSONType } @@ -16365,7 +16453,7 @@ yydefault: case 833: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4494 +//line sql.y:4495 { yyLOCAL = TreeType } @@ -16373,7 +16461,7 @@ yydefault: case 834: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4498 +//line sql.y:4499 { yyLOCAL = TraditionalType } @@ -16381,7 +16469,7 @@ yydefault: case 835: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4502 +//line sql.y:4503 { yyLOCAL = AnalyzeType } @@ -16389,7 +16477,7 @@ yydefault: case 836: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4507 +//line sql.y:4508 { yyLOCAL = PlanVExplainType } @@ -16397,7 +16485,7 @@ yydefault: case 837: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4511 +//line sql.y:4512 { yyLOCAL = PlanVExplainType } @@ -16405,7 +16493,7 @@ yydefault: case 838: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4515 +//line sql.y:4516 { yyLOCAL = AllVExplainType } @@ -16413,7 +16501,7 @@ yydefault: case 839: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4519 +//line sql.y:4520 { yyLOCAL = QueriesVExplainType } @@ -16421,7 +16509,7 @@ yydefault: case 840: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4523 +//line sql.y:4524 { yyLOCAL = TraceVExplainType } @@ -16429,33 +16517,33 @@ yydefault: case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4527 +//line sql.y:4528 { yyLOCAL = KeysVExplainType } yyVAL.union = yyLOCAL case 842: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4533 +//line sql.y:4534 { yyVAL.str = yyDollar[1].str } case 843: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4537 +//line sql.y:4538 { yyVAL.str = yyDollar[1].str } case 844: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4541 +//line sql.y:4542 { yyVAL.str = yyDollar[1].str } case 845: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4547 +//line sql.y:4548 { yyLOCAL = yyDollar[1].tableStmtUnion() } @@ -16463,7 +16551,7 @@ yydefault: case 846: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4551 +//line sql.y:4552 { yyLOCAL = yyDollar[1].statementUnion() } @@ -16471,7 +16559,7 @@ yydefault: case 847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4555 +//line sql.y:4556 { yyLOCAL = yyDollar[1].statementUnion() } @@ -16479,33 +16567,33 @@ yydefault: case 848: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4559 +//line sql.y:4560 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL case 849: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4564 +//line sql.y:4565 { yyVAL.str = "" } case 850: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4568 +//line sql.y:4569 { yyVAL.str = yyDollar[1].identifierCI.val } case 851: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4572 +//line sql.y:4573 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 852: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4578 +//line sql.y:4579 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } @@ -16513,7 +16601,7 @@ yydefault: case 853: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4582 +//line sql.y:4583 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } @@ -16521,7 +16609,7 @@ yydefault: case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4588 +//line sql.y:4589 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } @@ -16529,7 +16617,7 @@ yydefault: case 855: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4594 +//line sql.y:4595 { yyLOCAL = &OtherAdmin{} } @@ -16537,7 +16625,7 @@ yydefault: case 856: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4598 +//line sql.y:4599 { yyLOCAL = &OtherAdmin{} } @@ -16545,7 +16633,7 @@ yydefault: case 857: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4604 +//line sql.y:4605 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } @@ -16553,14 +16641,14 @@ yydefault: case 858: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4610 +//line sql.y:4611 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL case 859: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4614 +//line sql.y:4615 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) @@ -16568,7 +16656,7 @@ yydefault: case 860: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4620 +//line sql.y:4621 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } @@ -16576,7 +16664,7 @@ yydefault: case 861: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4626 +//line sql.y:4627 { yyLOCAL = Read } @@ -16584,7 +16672,7 @@ yydefault: case 862: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4630 +//line sql.y:4631 { yyLOCAL = ReadLocal } @@ -16592,7 +16680,7 @@ yydefault: case 863: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4634 +//line sql.y:4635 { yyLOCAL = Write } @@ -16600,7 +16688,7 @@ yydefault: case 864: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4638 +//line sql.y:4639 { yyLOCAL = LowPriorityWrite } @@ -16608,7 +16696,7 @@ yydefault: case 865: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4644 +//line sql.y:4645 { yyLOCAL = &UnlockTables{} } @@ -16616,7 +16704,7 @@ yydefault: case 866: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4650 +//line sql.y:4651 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } @@ -16624,7 +16712,7 @@ yydefault: case 867: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4656 +//line sql.y:4657 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } @@ -16632,7 +16720,7 @@ yydefault: case 868: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4660 +//line sql.y:4661 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } @@ -16640,7 +16728,7 @@ yydefault: case 869: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4664 +//line sql.y:4665 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } @@ -16648,7 +16736,7 @@ yydefault: case 870: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4668 +//line sql.y:4669 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } @@ -16656,7 +16744,7 @@ yydefault: case 871: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4672 +//line sql.y:4673 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } @@ -16664,99 +16752,99 @@ yydefault: case 872: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4676 +//line sql.y:4677 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL case 873: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4682 +//line sql.y:4683 { yyVAL.strs = []string{yyDollar[1].str} } case 874: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4686 +//line sql.y:4687 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } case 875: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4692 +//line sql.y:4693 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 876: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4696 +//line sql.y:4697 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 877: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4700 +//line sql.y:4701 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 878: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4704 +//line sql.y:4705 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 879: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4708 +//line sql.y:4709 { yyVAL.str = string(yyDollar[1].str) } case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4712 +//line sql.y:4713 { yyVAL.str = string(yyDollar[1].str) } case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4716 +//line sql.y:4717 { yyVAL.str = string(yyDollar[1].str) } case 882: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4720 +//line sql.y:4721 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 883: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4724 +//line sql.y:4725 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 884: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4728 +//line sql.y:4729 { yyVAL.str = string(yyDollar[1].str) } case 885: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4732 +//line sql.y:4733 { yyVAL.str = string(yyDollar[1].str) } case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4736 +//line sql.y:4737 { yyVAL.str = string(yyDollar[1].str) } case 887: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4741 +//line sql.y:4742 { yyLOCAL = false } @@ -16764,7 +16852,7 @@ yydefault: case 888: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4745 +//line sql.y:4746 { yyLOCAL = true } @@ -16772,52 +16860,52 @@ yydefault: case 889: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4749 +//line sql.y:4750 { yyLOCAL = true } yyVAL.union = yyLOCAL case 890: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4754 +//line sql.y:4755 { yyVAL.str = "" } case 891: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4758 +//line sql.y:4759 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } case 892: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4763 +//line sql.y:4764 { setAllowComments(yylex, true) } case 893: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4767 +//line sql.y:4768 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } case 894: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4773 +//line sql.y:4774 { yyVAL.strs = nil } case 895: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4777 +//line sql.y:4778 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } case 896: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4783 +//line sql.y:4784 { yyLOCAL = true } @@ -16825,7 +16913,7 @@ yydefault: case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4787 +//line sql.y:4788 { yyLOCAL = false } @@ -16833,33 +16921,33 @@ yydefault: case 898: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4791 +//line sql.y:4792 { yyLOCAL = true } yyVAL.union = yyLOCAL case 899: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4796 +//line sql.y:4797 { yyVAL.str = "" } case 900: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4800 +//line sql.y:4801 { yyVAL.str = SQLNoCacheStr } case 901: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4804 +//line sql.y:4805 { yyVAL.str = SQLCacheStr } case 902: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4809 +//line sql.y:4810 { yyLOCAL = false } @@ -16867,7 +16955,7 @@ yydefault: case 903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4813 +//line sql.y:4814 { yyLOCAL = true } @@ -16875,7 +16963,7 @@ yydefault: case 904: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4817 +//line sql.y:4818 { yyLOCAL = true } @@ -16883,7 +16971,7 @@ yydefault: case 905: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4823 +//line sql.y:4824 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } @@ -16891,7 +16979,7 @@ yydefault: case 906: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4827 +//line sql.y:4828 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -16903,7 +16991,7 @@ yydefault: case 907: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4837 +//line sql.y:4838 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } @@ -16911,7 +16999,7 @@ yydefault: case 908: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4842 +//line sql.y:4843 { yyLOCAL = nil } @@ -16919,7 +17007,7 @@ yydefault: case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4846 +//line sql.y:4847 { yyLOCAL = yyDollar[2].variablesUnion() } @@ -16927,7 +17015,7 @@ yydefault: case 910: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4852 +//line sql.y:4853 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } @@ -16935,112 +17023,112 @@ yydefault: case 911: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4856 +//line sql.y:4857 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL case 912: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4861 +//line sql.y:4862 { yyVAL.strs = nil } case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4865 +//line sql.y:4866 { yyVAL.strs = yyDollar[1].strs } case 914: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4871 +//line sql.y:4872 { yyVAL.strs = []string{yyDollar[1].str} } case 915: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4875 +//line sql.y:4876 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } case 916: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4881 +//line sql.y:4882 { yyVAL.str = SQLNoCacheStr } case 917: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4885 +//line sql.y:4886 { yyVAL.str = SQLCacheStr } case 918: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4889 +//line sql.y:4890 { yyVAL.str = DistinctStr } case 919: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4893 +//line sql.y:4894 { yyVAL.str = DistinctStr } case 920: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4897 +//line sql.y:4898 { yyVAL.str = HighPriorityStr } case 921: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4901 +//line sql.y:4902 { yyVAL.str = StraightJoinHint } case 922: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4905 +//line sql.y:4906 { yyVAL.str = SQLBufferResultStr } case 923: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4909 +//line sql.y:4910 { yyVAL.str = SQLSmallResultStr } case 924: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4913 +//line sql.y:4914 { yyVAL.str = SQLBigResultStr } case 925: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4917 +//line sql.y:4918 { yyVAL.str = SQLCalcFoundRowsStr } case 926: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4921 +//line sql.y:4922 { yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway } case 927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4927 +//line sql.y:4928 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL case 928: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4931 +//line sql.y:4932 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) @@ -17048,7 +17136,7 @@ yydefault: case 929: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4937 +//line sql.y:4938 { yyLOCAL = &StarExpr{} } @@ -17056,7 +17144,7 @@ yydefault: case 930: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4941 +//line sql.y:4942 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } @@ -17064,7 +17152,7 @@ yydefault: case 931: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4945 +//line sql.y:4946 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } @@ -17072,39 +17160,39 @@ yydefault: case 932: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4949 +//line sql.y:4950 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL case 933: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4954 +//line sql.y:4955 { yyVAL.identifierCI = IdentifierCI{} } case 934: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4958 +//line sql.y:4959 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 935: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4962 +//line sql.y:4963 { yyVAL.identifierCI = yyDollar[2].identifierCI } case 937: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4969 +//line sql.y:4970 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 938: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4974 +//line sql.y:4975 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } @@ -17112,7 +17200,7 @@ yydefault: case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4978 +//line sql.y:4979 { yyLOCAL = yyDollar[1].tableExprsUnion() } @@ -17120,7 +17208,7 @@ yydefault: case 940: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4984 +//line sql.y:4985 { yyLOCAL = yyDollar[2].tableExprsUnion() } @@ -17128,14 +17216,14 @@ yydefault: case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4990 +//line sql.y:4991 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL case 942: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4994 +//line sql.y:4995 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) @@ -17143,7 +17231,7 @@ yydefault: case 945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5004 +//line sql.y:5005 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } @@ -17151,7 +17239,7 @@ yydefault: case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5008 +//line sql.y:5009 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } @@ -17159,7 +17247,7 @@ yydefault: case 947: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5012 +//line sql.y:5013 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } @@ -17167,7 +17255,7 @@ yydefault: case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5016 +//line sql.y:5017 { yyLOCAL = yyDollar[1].tableExprUnion() } @@ -17175,7 +17263,7 @@ yydefault: case 949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5022 +//line sql.y:5023 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].tableStmtUnion()} } @@ -17183,7 +17271,7 @@ yydefault: case 950: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:5026 +//line sql.y:5027 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].tableStmtUnion()} } @@ -17191,7 +17279,7 @@ yydefault: case 951: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5032 +//line sql.y:5033 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } @@ -17199,7 +17287,7 @@ yydefault: case 952: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:5036 +//line sql.y:5037 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } @@ -17207,7 +17295,7 @@ yydefault: case 953: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5041 +//line sql.y:5042 { yyLOCAL = nil } @@ -17215,7 +17303,7 @@ yydefault: case 954: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:5045 +//line sql.y:5046 { yyLOCAL = yyDollar[2].columnsUnion() } @@ -17223,7 +17311,7 @@ yydefault: case 955: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:5050 +//line sql.y:5051 { yyLOCAL = nil } @@ -17231,7 +17319,7 @@ yydefault: case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5054 +//line sql.y:5055 { yyLOCAL = yyDollar[1].columnsUnion() } @@ -17239,14 +17327,14 @@ yydefault: case 957: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5060 +//line sql.y:5061 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL case 958: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5064 +//line sql.y:5065 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) @@ -17254,14 +17342,14 @@ yydefault: case 959: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:5070 +//line sql.y:5071 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL case 960: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5074 +//line sql.y:5075 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) @@ -17269,7 +17357,7 @@ yydefault: case 961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5080 +//line sql.y:5081 { yyLOCAL = Columns{yyDollar[1].identifierCI} } @@ -17277,21 +17365,21 @@ yydefault: case 962: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5084 +//line sql.y:5085 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL case 963: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5088 +//line sql.y:5089 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } case 964: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5092 +//line sql.y:5093 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) @@ -17299,14 +17387,14 @@ yydefault: case 965: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:5098 +//line sql.y:5099 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL case 966: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5102 +//line sql.y:5103 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) @@ -17314,7 +17402,7 @@ yydefault: case 967: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5115 +//line sql.y:5116 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -17322,7 +17410,7 @@ yydefault: case 968: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5119 +//line sql.y:5120 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -17330,7 +17418,7 @@ yydefault: case 969: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5123 +//line sql.y:5124 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } @@ -17338,87 +17426,87 @@ yydefault: case 970: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5127 +//line sql.y:5128 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL case 971: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5133 +//line sql.y:5134 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } case 972: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5135 +//line sql.y:5136 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } case 973: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5139 +//line sql.y:5140 { yyVAL.joinCondition = &JoinCondition{} } case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5141 +//line sql.y:5142 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 975: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5145 +//line sql.y:5146 { yyVAL.joinCondition = &JoinCondition{} } case 976: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5147 +//line sql.y:5148 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } case 977: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5150 +//line sql.y:5151 { yyVAL.empty = struct{}{} } case 978: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5152 +//line sql.y:5153 { yyVAL.empty = struct{}{} } case 979: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5155 +//line sql.y:5156 { yyVAL.identifierCS = NewIdentifierCS("") } case 980: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5159 +//line sql.y:5160 { yyVAL.identifierCS = yyDollar[1].identifierCS } case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5163 +//line sql.y:5164 { yyVAL.identifierCS = yyDollar[2].identifierCS } case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5170 +//line sql.y:5171 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 984: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5176 +//line sql.y:5177 { yyLOCAL = NormalJoinType } @@ -17426,7 +17514,7 @@ yydefault: case 985: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5180 +//line sql.y:5181 { yyLOCAL = NormalJoinType } @@ -17434,7 +17522,7 @@ yydefault: case 986: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5184 +//line sql.y:5185 { yyLOCAL = NormalJoinType } @@ -17442,7 +17530,7 @@ yydefault: case 987: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5190 +//line sql.y:5191 { yyLOCAL = StraightJoinType } @@ -17450,7 +17538,7 @@ yydefault: case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5196 +//line sql.y:5197 { yyLOCAL = LeftJoinType } @@ -17458,7 +17546,7 @@ yydefault: case 989: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5200 +//line sql.y:5201 { yyLOCAL = LeftJoinType } @@ -17466,7 +17554,7 @@ yydefault: case 990: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5204 +//line sql.y:5205 { yyLOCAL = RightJoinType } @@ -17474,7 +17562,7 @@ yydefault: case 991: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5208 +//line sql.y:5209 { yyLOCAL = RightJoinType } @@ -17482,7 +17570,7 @@ yydefault: case 992: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5214 +//line sql.y:5215 { yyLOCAL = NaturalJoinType } @@ -17490,7 +17578,7 @@ yydefault: case 993: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5218 +//line sql.y:5219 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -17501,38 +17589,38 @@ yydefault: yyVAL.union = yyLOCAL case 994: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5228 +//line sql.y:5229 { yyVAL.tableName = yyDollar[2].tableName } case 995: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5232 +//line sql.y:5233 { yyVAL.tableName = yyDollar[1].tableName } case 996: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5238 +//line sql.y:5239 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } case 997: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5242 +//line sql.y:5243 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } case 998: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5248 +//line sql.y:5249 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } case 999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5253 +//line sql.y:5254 { yyLOCAL = nil } @@ -17540,7 +17628,7 @@ yydefault: case 1000: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5257 +//line sql.y:5258 { yyLOCAL = yyDollar[1].indexHintsUnion() } @@ -17548,14 +17636,14 @@ yydefault: case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5263 +//line sql.y:5264 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL case 1002: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5267 +//line sql.y:5268 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) @@ -17563,7 +17651,7 @@ yydefault: case 1003: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5273 +//line sql.y:5274 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -17571,7 +17659,7 @@ yydefault: case 1004: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5277 +//line sql.y:5278 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } @@ -17579,7 +17667,7 @@ yydefault: case 1005: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5281 +//line sql.y:5282 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -17587,7 +17675,7 @@ yydefault: case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5285 +//line sql.y:5286 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } @@ -17595,7 +17683,7 @@ yydefault: case 1007: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5289 +//line sql.y:5290 { yyLOCAL = &IndexHint{Type: UseVindexOp, Indexes: yyDollar[4].columnsUnion()} } @@ -17603,7 +17691,7 @@ yydefault: case 1008: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5293 +//line sql.y:5294 { yyLOCAL = &IndexHint{Type: IgnoreVindexOp, Indexes: yyDollar[4].columnsUnion()} } @@ -17611,7 +17699,7 @@ yydefault: case 1009: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5298 +//line sql.y:5299 { yyLOCAL = NoForType } @@ -17619,7 +17707,7 @@ yydefault: case 1010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5302 +//line sql.y:5303 { yyLOCAL = JoinForType } @@ -17627,7 +17715,7 @@ yydefault: case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5306 +//line sql.y:5307 { yyLOCAL = OrderByForType } @@ -17635,7 +17723,7 @@ yydefault: case 1012: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5310 +//line sql.y:5311 { yyLOCAL = GroupByForType } @@ -17643,7 +17731,7 @@ yydefault: case 1013: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5316 +//line sql.y:5317 { yyLOCAL = nil } @@ -17651,7 +17739,7 @@ yydefault: case 1014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5320 +//line sql.y:5321 { yyLOCAL = yyDollar[2].exprUnion() } @@ -17659,7 +17747,7 @@ yydefault: case 1015: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5327 +//line sql.y:5328 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -17667,7 +17755,7 @@ yydefault: case 1016: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5331 +//line sql.y:5332 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -17675,7 +17763,7 @@ yydefault: case 1017: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5335 +//line sql.y:5336 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } @@ -17683,7 +17771,7 @@ yydefault: case 1018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5339 +//line sql.y:5340 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } @@ -17691,7 +17779,7 @@ yydefault: case 1019: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5343 +//line sql.y:5344 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } @@ -17699,7 +17787,7 @@ yydefault: case 1020: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5347 +//line sql.y:5348 { yyLOCAL = yyDollar[1].exprUnion() } @@ -17707,7 +17795,7 @@ yydefault: case 1021: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5351 +//line sql.y:5352 { yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} } @@ -17715,25 +17803,25 @@ yydefault: case 1022: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5355 +//line sql.y:5356 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1023: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5361 +//line sql.y:5362 { } case 1024: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5364 +//line sql.y:5365 { } case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5369 +//line sql.y:5370 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } @@ -17741,7 +17829,7 @@ yydefault: case 1026: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5373 +//line sql.y:5374 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } @@ -17749,7 +17837,7 @@ yydefault: case 1027: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5377 +//line sql.y:5378 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } @@ -17757,7 +17845,7 @@ yydefault: case 1028: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5381 +//line sql.y:5382 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } @@ -17765,7 +17853,7 @@ yydefault: case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5385 +//line sql.y:5386 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } @@ -17773,7 +17861,7 @@ yydefault: case 1030: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5389 +//line sql.y:5390 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: All, Right: yyDollar[4].subqueryUnion()} } @@ -17781,7 +17869,7 @@ yydefault: case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5393 +//line sql.y:5394 { yyLOCAL = yyDollar[1].exprUnion() } @@ -17789,7 +17877,7 @@ yydefault: case 1032: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5399 +//line sql.y:5400 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } @@ -17797,7 +17885,7 @@ yydefault: case 1033: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5403 +//line sql.y:5404 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } @@ -17805,7 +17893,7 @@ yydefault: case 1034: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5407 +//line sql.y:5408 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } @@ -17813,7 +17901,7 @@ yydefault: case 1035: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5411 +//line sql.y:5412 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } @@ -17821,7 +17909,7 @@ yydefault: case 1036: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5415 +//line sql.y:5416 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } @@ -17829,7 +17917,7 @@ yydefault: case 1037: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5419 +//line sql.y:5420 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } @@ -17837,7 +17925,7 @@ yydefault: case 1038: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5423 +//line sql.y:5424 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } @@ -17845,7 +17933,7 @@ yydefault: case 1039: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5427 +//line sql.y:5428 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } @@ -17853,7 +17941,7 @@ yydefault: case 1040: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5431 +//line sql.y:5432 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } @@ -17861,7 +17949,7 @@ yydefault: case 1041: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5435 +//line sql.y:5436 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } @@ -17869,25 +17957,25 @@ yydefault: case 1042: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5439 +//line sql.y:5440 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1043: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5445 +//line sql.y:5446 { } case 1044: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5448 +//line sql.y:5449 { } case 1045: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5454 +//line sql.y:5455 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } @@ -17895,7 +17983,7 @@ yydefault: case 1046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5458 +//line sql.y:5459 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } @@ -17903,7 +17991,7 @@ yydefault: case 1047: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5462 +//line sql.y:5463 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } @@ -17911,7 +17999,7 @@ yydefault: case 1048: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5466 +//line sql.y:5467 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } @@ -17919,7 +18007,7 @@ yydefault: case 1049: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5470 +//line sql.y:5471 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } @@ -17927,7 +18015,7 @@ yydefault: case 1050: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5474 +//line sql.y:5475 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } @@ -17935,7 +18023,7 @@ yydefault: case 1051: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5478 +//line sql.y:5479 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } @@ -17943,7 +18031,7 @@ yydefault: case 1052: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5482 +//line sql.y:5483 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } @@ -17951,7 +18039,7 @@ yydefault: case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5486 +//line sql.y:5487 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } @@ -17959,7 +18047,7 @@ yydefault: case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5490 +//line sql.y:5491 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } @@ -17967,7 +18055,7 @@ yydefault: case 1055: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5494 +//line sql.y:5495 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } @@ -17975,7 +18063,7 @@ yydefault: case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5498 +//line sql.y:5499 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } @@ -17983,7 +18071,7 @@ yydefault: case 1057: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5502 +//line sql.y:5503 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } @@ -17991,7 +18079,7 @@ yydefault: case 1058: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5506 +//line sql.y:5507 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } @@ -17999,7 +18087,7 @@ yydefault: case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5510 +//line sql.y:5511 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18007,7 +18095,7 @@ yydefault: case 1060: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5516 +//line sql.y:5517 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18015,7 +18103,7 @@ yydefault: case 1061: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5520 +//line sql.y:5521 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18023,7 +18111,7 @@ yydefault: case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5524 +//line sql.y:5525 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18031,7 +18119,7 @@ yydefault: case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5528 +//line sql.y:5529 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18039,7 +18127,7 @@ yydefault: case 1064: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5532 +//line sql.y:5533 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } @@ -18047,7 +18135,7 @@ yydefault: case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5536 +//line sql.y:5537 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18055,7 +18143,7 @@ yydefault: case 1066: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5540 +//line sql.y:5541 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18063,7 +18151,7 @@ yydefault: case 1067: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5544 +//line sql.y:5545 { yyLOCAL = yyDollar[1].variableUnion() } @@ -18071,7 +18159,7 @@ yydefault: case 1068: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5548 +//line sql.y:5549 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } @@ -18079,7 +18167,7 @@ yydefault: case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5552 +//line sql.y:5553 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -18087,7 +18175,7 @@ yydefault: case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5556 +//line sql.y:5557 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } @@ -18095,7 +18183,7 @@ yydefault: case 1071: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5560 +//line sql.y:5561 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } @@ -18103,7 +18191,7 @@ yydefault: case 1072: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5564 +//line sql.y:5565 { yyLOCAL = yyDollar[1].subqueryUnion() } @@ -18111,7 +18199,7 @@ yydefault: case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5568 +//line sql.y:5569 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18119,7 +18207,7 @@ yydefault: case 1074: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5572 +//line sql.y:5573 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } @@ -18127,7 +18215,7 @@ yydefault: case 1075: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5576 +//line sql.y:5577 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } @@ -18135,7 +18223,7 @@ yydefault: case 1076: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5580 +//line sql.y:5581 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } @@ -18143,7 +18231,7 @@ yydefault: case 1077: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5584 +//line sql.y:5585 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } @@ -18151,7 +18239,7 @@ yydefault: case 1078: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5588 +//line sql.y:5589 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } @@ -18159,7 +18247,7 @@ yydefault: case 1079: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5592 +//line sql.y:5593 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -18171,7 +18259,7 @@ yydefault: case 1080: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5600 +//line sql.y:5601 { yyLOCAL = &Default{ColName: yyDollar[2].str} } @@ -18179,7 +18267,7 @@ yydefault: case 1081: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5604 +//line sql.y:5605 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAddLeft, Date: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion(), Interval: yyDollar[2].exprUnion()} } @@ -18187,7 +18275,7 @@ yydefault: case 1082: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5608 +//line sql.y:5609 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } @@ -18195,7 +18283,7 @@ yydefault: case 1083: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5612 +//line sql.y:5613 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}} } @@ -18203,7 +18291,7 @@ yydefault: case 1084: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5616 +//line sql.y:5617 { yyLOCAL = &JSONUnquoteExpr{JSONValue: &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}}} } @@ -18211,7 +18299,7 @@ yydefault: case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5622 +//line sql.y:5623 { yyLOCAL = yyDollar[1].colNamesUnion() } @@ -18219,7 +18307,7 @@ yydefault: case 1086: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5626 +//line sql.y:5627 { yyLOCAL = yyDollar[2].colNamesUnion() } @@ -18227,14 +18315,14 @@ yydefault: case 1087: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5632 +//line sql.y:5633 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL case 1088: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5636 +//line sql.y:5637 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) @@ -18242,7 +18330,7 @@ yydefault: case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5642 +//line sql.y:5643 { yyLOCAL = BothTrimType } @@ -18250,7 +18338,7 @@ yydefault: case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5646 +//line sql.y:5647 { yyLOCAL = LeadingTrimType } @@ -18258,7 +18346,7 @@ yydefault: case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5650 +//line sql.y:5651 { yyLOCAL = TrailingTrimType } @@ -18266,7 +18354,7 @@ yydefault: case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5656 +//line sql.y:5657 { yyLOCAL = FrameRowsType } @@ -18274,7 +18362,7 @@ yydefault: case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5660 +//line sql.y:5661 { yyLOCAL = FrameRangeType } @@ -18282,7 +18370,7 @@ yydefault: case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5667 +//line sql.y:5668 { yyLOCAL = CumeDistExprType } @@ -18290,7 +18378,7 @@ yydefault: case 1095: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5671 +//line sql.y:5672 { yyLOCAL = DenseRankExprType } @@ -18298,7 +18386,7 @@ yydefault: case 1096: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5675 +//line sql.y:5676 { yyLOCAL = PercentRankExprType } @@ -18306,7 +18394,7 @@ yydefault: case 1097: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5679 +//line sql.y:5680 { yyLOCAL = RankExprType } @@ -18314,7 +18402,7 @@ yydefault: case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5683 +//line sql.y:5684 { yyLOCAL = RowNumberExprType } @@ -18322,7 +18410,7 @@ yydefault: case 1099: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5689 +//line sql.y:5690 { yyLOCAL = &FramePoint{Type: CurrentRowType} } @@ -18330,7 +18418,7 @@ yydefault: case 1100: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5693 +//line sql.y:5694 { yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } @@ -18338,7 +18426,7 @@ yydefault: case 1101: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5697 +//line sql.y:5698 { yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } @@ -18346,7 +18434,7 @@ yydefault: case 1102: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5701 +//line sql.y:5702 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } @@ -18354,7 +18442,7 @@ yydefault: case 1103: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5705 +//line sql.y:5706 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } @@ -18362,7 +18450,7 @@ yydefault: case 1104: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5709 +//line sql.y:5710 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } @@ -18370,7 +18458,7 @@ yydefault: case 1105: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5713 +//line sql.y:5714 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } @@ -18378,7 +18466,7 @@ yydefault: case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5718 +//line sql.y:5719 { yyLOCAL = nil } @@ -18386,7 +18474,7 @@ yydefault: case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5722 +//line sql.y:5723 { yyLOCAL = yyDollar[1].frameClauseUnion() } @@ -18394,7 +18482,7 @@ yydefault: case 1108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5728 +//line sql.y:5729 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } @@ -18402,7 +18490,7 @@ yydefault: case 1109: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5732 +//line sql.y:5733 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } @@ -18410,7 +18498,7 @@ yydefault: case 1110: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5737 +//line sql.y:5738 { yyLOCAL = nil } @@ -18418,27 +18506,27 @@ yydefault: case 1111: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5741 +//line sql.y:5742 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL case 1112: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5746 +//line sql.y:5747 { yyVAL.identifierCI = IdentifierCI{} } case 1113: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5750 +//line sql.y:5751 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 1114: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5756 +//line sql.y:5757 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } @@ -18446,7 +18534,7 @@ yydefault: case 1115: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5762 +//line sql.y:5763 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } @@ -18454,7 +18542,7 @@ yydefault: case 1116: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5766 +//line sql.y:5767 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } @@ -18462,7 +18550,7 @@ yydefault: case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5772 +//line sql.y:5773 { yyLOCAL = yyDollar[1].overClauseUnion() } @@ -18470,7 +18558,7 @@ yydefault: case 1118: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5776 +//line sql.y:5777 { yyLOCAL = nil } @@ -18478,7 +18566,7 @@ yydefault: case 1119: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5781 +//line sql.y:5782 { yyLOCAL = nil } @@ -18486,7 +18574,7 @@ yydefault: case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5788 +//line sql.y:5789 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } @@ -18494,7 +18582,7 @@ yydefault: case 1122: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5794 +//line sql.y:5795 { yyLOCAL = RespectNullsType } @@ -18502,7 +18590,7 @@ yydefault: case 1123: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5798 +//line sql.y:5799 { yyLOCAL = IgnoreNullsType } @@ -18510,7 +18598,7 @@ yydefault: case 1124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5804 +//line sql.y:5805 { yyLOCAL = FirstValueExprType } @@ -18518,7 +18606,7 @@ yydefault: case 1125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5808 +//line sql.y:5809 { yyLOCAL = LastValueExprType } @@ -18526,7 +18614,7 @@ yydefault: case 1126: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5814 +//line sql.y:5815 { yyLOCAL = FromFirstType } @@ -18534,7 +18622,7 @@ yydefault: case 1127: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5818 +//line sql.y:5819 { yyLOCAL = FromLastType } @@ -18542,7 +18630,7 @@ yydefault: case 1128: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5823 +//line sql.y:5824 { yyLOCAL = nil } @@ -18550,7 +18638,7 @@ yydefault: case 1130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5830 +//line sql.y:5831 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } @@ -18558,7 +18646,7 @@ yydefault: case 1131: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5836 +//line sql.y:5837 { yyLOCAL = LagExprType } @@ -18566,7 +18654,7 @@ yydefault: case 1132: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5840 +//line sql.y:5841 { yyLOCAL = LeadExprType } @@ -18574,7 +18662,7 @@ yydefault: case 1133: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5846 +//line sql.y:5847 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } @@ -18582,34 +18670,34 @@ yydefault: case 1134: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5852 +//line sql.y:5853 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL case 1135: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5856 +//line sql.y:5857 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } case 1136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5862 +//line sql.y:5863 { yyVAL.str = "" } case 1137: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5866 +//line sql.y:5867 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } case 1138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5872 +//line sql.y:5873 { yyLOCAL = BoolVal(true) } @@ -18617,7 +18705,7 @@ yydefault: case 1139: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5876 +//line sql.y:5877 { yyLOCAL = BoolVal(false) } @@ -18625,7 +18713,7 @@ yydefault: case 1140: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5883 +//line sql.y:5884 { yyLOCAL = IsTrueOp } @@ -18633,7 +18721,7 @@ yydefault: case 1141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5887 +//line sql.y:5888 { yyLOCAL = IsNotTrueOp } @@ -18641,7 +18729,7 @@ yydefault: case 1142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5891 +//line sql.y:5892 { yyLOCAL = IsFalseOp } @@ -18649,7 +18737,7 @@ yydefault: case 1143: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5895 +//line sql.y:5896 { yyLOCAL = IsNotFalseOp } @@ -18657,7 +18745,7 @@ yydefault: case 1144: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5901 +//line sql.y:5902 { yyLOCAL = yyDollar[1].comparisonExprOperatorUnion() } @@ -18665,7 +18753,7 @@ yydefault: case 1145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5905 +//line sql.y:5906 { yyLOCAL = NullSafeEqualOp } @@ -18673,7 +18761,7 @@ yydefault: case 1146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5911 +//line sql.y:5912 { yyLOCAL = EqualOp } @@ -18681,7 +18769,7 @@ yydefault: case 1147: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5915 +//line sql.y:5916 { yyLOCAL = LessThanOp } @@ -18689,7 +18777,7 @@ yydefault: case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5919 +//line sql.y:5920 { yyLOCAL = GreaterThanOp } @@ -18697,7 +18785,7 @@ yydefault: case 1149: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5923 +//line sql.y:5924 { yyLOCAL = LessEqualOp } @@ -18705,7 +18793,7 @@ yydefault: case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5927 +//line sql.y:5928 { yyLOCAL = GreaterEqualOp } @@ -18713,7 +18801,7 @@ yydefault: case 1151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5931 +//line sql.y:5932 { yyLOCAL = NotEqualOp } @@ -18721,7 +18809,7 @@ yydefault: case 1152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5937 +//line sql.y:5938 { yyLOCAL = yyDollar[1].valTupleUnion() } @@ -18729,7 +18817,7 @@ yydefault: case 1153: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5941 +//line sql.y:5942 { yyLOCAL = yyDollar[1].subqueryUnion() } @@ -18737,7 +18825,7 @@ yydefault: case 1154: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5945 +//line sql.y:5946 { yyLOCAL = ListArg(yyDollar[1].str[2:]) markBindVariable(yylex, yyDollar[1].str[2:]) @@ -18746,7 +18834,7 @@ yydefault: case 1155: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5952 +//line sql.y:5953 { yyLOCAL = &Subquery{yyDollar[1].tableStmtUnion()} } @@ -18754,14 +18842,14 @@ yydefault: case 1156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5958 +//line sql.y:5959 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1157: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5962 +//line sql.y:5963 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) @@ -18769,7 +18857,7 @@ yydefault: case 1158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5972 +//line sql.y:5973 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].exprsUnion()} } @@ -18777,7 +18865,7 @@ yydefault: case 1159: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5976 +//line sql.y:5977 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].exprsUnion()} } @@ -18785,7 +18873,7 @@ yydefault: case 1160: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5986 +//line sql.y:5987 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].exprsUnion()} } @@ -18793,7 +18881,7 @@ yydefault: case 1161: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5990 +//line sql.y:5991 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].exprsUnion()} } @@ -18801,7 +18889,7 @@ yydefault: case 1162: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5994 +//line sql.y:5995 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } @@ -18809,7 +18897,7 @@ yydefault: case 1163: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5998 +//line sql.y:5999 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } @@ -18817,7 +18905,7 @@ yydefault: case 1164: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6002 +//line sql.y:6003 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } @@ -18825,7 +18913,7 @@ yydefault: case 1165: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6006 +//line sql.y:6007 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } @@ -18833,7 +18921,7 @@ yydefault: case 1166: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6010 +//line sql.y:6011 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } @@ -18841,7 +18929,7 @@ yydefault: case 1167: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6014 +//line sql.y:6015 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } @@ -18849,7 +18937,7 @@ yydefault: case 1168: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6018 +//line sql.y:6019 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } @@ -18857,7 +18945,7 @@ yydefault: case 1169: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6022 +//line sql.y:6023 { yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } @@ -18865,7 +18953,7 @@ yydefault: case 1170: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6026 +//line sql.y:6027 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } @@ -18873,7 +18961,7 @@ yydefault: case 1171: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6037 +//line sql.y:6038 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } @@ -18881,7 +18969,7 @@ yydefault: case 1172: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6041 +//line sql.y:6042 { yyLOCAL = yyDollar[1].exprUnion() } @@ -18889,7 +18977,7 @@ yydefault: case 1173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6047 +//line sql.y:6048 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } @@ -18897,7 +18985,7 @@ yydefault: case 1174: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6051 +//line sql.y:6052 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} } @@ -18905,7 +18993,7 @@ yydefault: case 1175: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6055 +//line sql.y:6056 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} } @@ -18913,7 +19001,7 @@ yydefault: case 1176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6060 +//line sql.y:6061 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} } @@ -18921,7 +19009,7 @@ yydefault: case 1177: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6065 +//line sql.y:6066 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} } @@ -18929,7 +19017,7 @@ yydefault: case 1178: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6069 +//line sql.y:6070 { yyLOCAL = &CountStar{OverClause: yyDollar[5].overClauseUnion()} } @@ -18937,7 +19025,7 @@ yydefault: case 1179: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6073 +//line sql.y:6074 { yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -18945,7 +19033,7 @@ yydefault: case 1180: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6077 +//line sql.y:6078 { yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -18953,7 +19041,7 @@ yydefault: case 1181: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6081 +//line sql.y:6082 { yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -18961,7 +19049,7 @@ yydefault: case 1182: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6085 +//line sql.y:6086 { yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -18969,7 +19057,7 @@ yydefault: case 1183: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6089 +//line sql.y:6090 { yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -18977,7 +19065,7 @@ yydefault: case 1184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6093 +//line sql.y:6094 { yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -18985,7 +19073,7 @@ yydefault: case 1185: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6097 +//line sql.y:6098 { yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -18993,7 +19081,7 @@ yydefault: case 1186: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6101 +//line sql.y:6102 { yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19001,7 +19089,7 @@ yydefault: case 1187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6105 +//line sql.y:6106 { yyLOCAL = &Std{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19009,7 +19097,7 @@ yydefault: case 1188: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6109 +//line sql.y:6110 { yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19017,7 +19105,7 @@ yydefault: case 1189: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6113 +//line sql.y:6114 { yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19025,7 +19113,7 @@ yydefault: case 1190: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6117 +//line sql.y:6118 { yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19033,7 +19121,7 @@ yydefault: case 1191: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6121 +//line sql.y:6122 { yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19041,7 +19129,7 @@ yydefault: case 1192: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6125 +//line sql.y:6126 { yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19049,7 +19137,7 @@ yydefault: case 1193: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6129 +//line sql.y:6130 { yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19057,7 +19145,7 @@ yydefault: case 1194: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6133 +//line sql.y:6134 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } @@ -19065,7 +19153,7 @@ yydefault: case 1195: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6137 +//line sql.y:6138 { yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} } @@ -19073,7 +19161,7 @@ yydefault: case 1196: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6141 +//line sql.y:6142 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } @@ -19081,7 +19169,7 @@ yydefault: case 1197: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6145 +//line sql.y:6146 { yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } @@ -19089,7 +19177,7 @@ yydefault: case 1198: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6149 +//line sql.y:6150 { yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } @@ -19097,7 +19185,7 @@ yydefault: case 1199: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6153 +//line sql.y:6154 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } @@ -19105,7 +19193,7 @@ yydefault: case 1200: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6157 +//line sql.y:6158 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -19113,7 +19201,7 @@ yydefault: case 1201: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6161 +//line sql.y:6162 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -19121,7 +19209,7 @@ yydefault: case 1202: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6165 +//line sql.y:6166 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } @@ -19129,7 +19217,7 @@ yydefault: case 1203: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6169 +//line sql.y:6170 { yyLOCAL = &JSONArrayAgg{Expr: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -19137,7 +19225,7 @@ yydefault: case 1204: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6173 +//line sql.y:6174 { yyLOCAL = &JSONObjectAgg{Key: yyDollar[3].exprUnion(), Value: yyDollar[5].exprUnion(), OverClause: yyDollar[7].overClauseUnion()} } @@ -19145,7 +19233,7 @@ yydefault: case 1205: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6177 +//line sql.y:6178 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} } @@ -19153,7 +19241,7 @@ yydefault: case 1206: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6181 +//line sql.y:6182 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} } @@ -19161,7 +19249,7 @@ yydefault: case 1207: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6185 +//line sql.y:6186 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } @@ -19169,7 +19257,7 @@ yydefault: case 1208: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6189 +//line sql.y:6190 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } @@ -19177,7 +19265,7 @@ yydefault: case 1209: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6193 +//line sql.y:6194 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } @@ -19185,7 +19273,7 @@ yydefault: case 1210: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6197 +//line sql.y:6198 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } @@ -19193,7 +19281,7 @@ yydefault: case 1211: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6201 +//line sql.y:6202 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } @@ -19201,7 +19289,7 @@ yydefault: case 1212: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6205 +//line sql.y:6206 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } @@ -19209,7 +19297,7 @@ yydefault: case 1213: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6209 +//line sql.y:6210 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } @@ -19217,7 +19305,7 @@ yydefault: case 1214: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6213 +//line sql.y:6214 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } @@ -19225,7 +19313,7 @@ yydefault: case 1215: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6217 +//line sql.y:6218 { yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -19233,7 +19321,7 @@ yydefault: case 1216: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6221 +//line sql.y:6222 { yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } @@ -19241,7 +19329,7 @@ yydefault: case 1217: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6225 +//line sql.y:6226 { yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } @@ -19249,7 +19337,7 @@ yydefault: case 1218: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6229 +//line sql.y:6230 { yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } @@ -19257,7 +19345,7 @@ yydefault: case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6233 +//line sql.y:6234 { yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } @@ -19265,7 +19353,7 @@ yydefault: case 1220: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6237 +//line sql.y:6238 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } @@ -19273,7 +19361,7 @@ yydefault: case 1221: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6241 +//line sql.y:6242 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } @@ -19281,7 +19369,7 @@ yydefault: case 1222: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6245 +//line sql.y:6246 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } @@ -19289,7 +19377,7 @@ yydefault: case 1223: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6249 +//line sql.y:6250 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} } @@ -19297,7 +19385,7 @@ yydefault: case 1224: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6253 +//line sql.y:6254 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } @@ -19305,7 +19393,7 @@ yydefault: case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6257 +//line sql.y:6258 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} } @@ -19313,7 +19401,7 @@ yydefault: case 1226: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6261 +//line sql.y:6262 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } @@ -19321,7 +19409,7 @@ yydefault: case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6265 +//line sql.y:6266 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} } @@ -19329,7 +19417,7 @@ yydefault: case 1228: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6269 +//line sql.y:6270 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} } @@ -19337,7 +19425,7 @@ yydefault: case 1229: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6273 +//line sql.y:6274 { yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} } @@ -19345,7 +19433,7 @@ yydefault: case 1230: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6277 +//line sql.y:6278 { yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} } @@ -19353,7 +19441,7 @@ yydefault: case 1231: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6281 +//line sql.y:6282 { yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} } @@ -19361,7 +19449,7 @@ yydefault: case 1232: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6285 +//line sql.y:6286 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} } @@ -19369,7 +19457,7 @@ yydefault: case 1233: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6289 +//line sql.y:6290 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } @@ -19377,7 +19465,7 @@ yydefault: case 1234: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6293 +//line sql.y:6294 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} } @@ -19385,7 +19473,7 @@ yydefault: case 1235: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6297 +//line sql.y:6298 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } @@ -19393,7 +19481,7 @@ yydefault: case 1236: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6301 +//line sql.y:6302 { yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} } @@ -19401,7 +19489,7 @@ yydefault: case 1237: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6305 +//line sql.y:6306 { yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} } @@ -19409,7 +19497,7 @@ yydefault: case 1238: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6309 +//line sql.y:6310 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} } @@ -19417,7 +19505,7 @@ yydefault: case 1239: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6313 +//line sql.y:6314 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } @@ -19425,7 +19513,7 @@ yydefault: case 1240: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6317 +//line sql.y:6318 { yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} } @@ -19433,7 +19521,7 @@ yydefault: case 1241: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6321 +//line sql.y:6322 { yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } @@ -19441,7 +19529,7 @@ yydefault: case 1242: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6325 +//line sql.y:6326 { yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} } @@ -19449,7 +19537,7 @@ yydefault: case 1243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6329 +//line sql.y:6330 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} } @@ -19457,7 +19545,7 @@ yydefault: case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6333 +//line sql.y:6334 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } @@ -19465,7 +19553,7 @@ yydefault: case 1245: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6337 +//line sql.y:6338 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} } @@ -19473,7 +19561,7 @@ yydefault: case 1246: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6341 +//line sql.y:6342 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } @@ -19481,7 +19569,7 @@ yydefault: case 1247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6345 +//line sql.y:6346 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} } @@ -19489,7 +19577,7 @@ yydefault: case 1248: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6349 +//line sql.y:6350 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19497,7 +19585,7 @@ yydefault: case 1249: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6353 +//line sql.y:6354 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19505,7 +19593,7 @@ yydefault: case 1250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6357 +//line sql.y:6358 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} } @@ -19513,7 +19601,7 @@ yydefault: case 1251: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6361 +//line sql.y:6362 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19521,7 +19609,7 @@ yydefault: case 1252: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6365 +//line sql.y:6366 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19529,7 +19617,7 @@ yydefault: case 1253: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6369 +//line sql.y:6370 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} } @@ -19537,7 +19625,7 @@ yydefault: case 1254: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6373 +//line sql.y:6374 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19545,7 +19633,7 @@ yydefault: case 1255: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6377 +//line sql.y:6378 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19553,7 +19641,7 @@ yydefault: case 1256: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6381 +//line sql.y:6382 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} } @@ -19561,7 +19649,7 @@ yydefault: case 1257: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6385 +//line sql.y:6386 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19569,7 +19657,7 @@ yydefault: case 1258: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6389 +//line sql.y:6390 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19577,7 +19665,7 @@ yydefault: case 1259: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6393 +//line sql.y:6394 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} } @@ -19585,7 +19673,7 @@ yydefault: case 1260: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6397 +//line sql.y:6398 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19593,7 +19681,7 @@ yydefault: case 1261: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6401 +//line sql.y:6402 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19601,7 +19689,7 @@ yydefault: case 1262: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6405 +//line sql.y:6406 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} } @@ -19609,7 +19697,7 @@ yydefault: case 1263: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6409 +//line sql.y:6410 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19617,7 +19705,7 @@ yydefault: case 1264: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6413 +//line sql.y:6414 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19625,7 +19713,7 @@ yydefault: case 1265: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6417 +//line sql.y:6418 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} } @@ -19633,7 +19721,7 @@ yydefault: case 1266: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6421 +//line sql.y:6422 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19641,7 +19729,7 @@ yydefault: case 1267: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6425 +//line sql.y:6426 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19649,7 +19737,7 @@ yydefault: case 1268: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6429 +//line sql.y:6430 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} } @@ -19657,7 +19745,7 @@ yydefault: case 1269: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6433 +//line sql.y:6434 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19665,7 +19753,7 @@ yydefault: case 1270: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6437 +//line sql.y:6438 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19673,7 +19761,7 @@ yydefault: case 1271: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6441 +//line sql.y:6442 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19681,7 +19769,7 @@ yydefault: case 1272: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6445 +//line sql.y:6446 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19689,7 +19777,7 @@ yydefault: case 1273: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6449 +//line sql.y:6450 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19697,7 +19785,7 @@ yydefault: case 1274: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6453 +//line sql.y:6454 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19705,7 +19793,7 @@ yydefault: case 1275: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6457 +//line sql.y:6458 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19713,7 +19801,7 @@ yydefault: case 1276: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6461 +//line sql.y:6462 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19721,7 +19809,7 @@ yydefault: case 1277: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6465 +//line sql.y:6466 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19729,7 +19817,7 @@ yydefault: case 1278: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6469 +//line sql.y:6470 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19737,7 +19825,7 @@ yydefault: case 1279: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6473 +//line sql.y:6474 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19745,7 +19833,7 @@ yydefault: case 1280: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6477 +//line sql.y:6478 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19753,7 +19841,7 @@ yydefault: case 1281: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6481 +//line sql.y:6482 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19761,7 +19849,7 @@ yydefault: case 1282: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6485 +//line sql.y:6486 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19769,7 +19857,7 @@ yydefault: case 1283: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6489 +//line sql.y:6490 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19777,7 +19865,7 @@ yydefault: case 1284: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6493 +//line sql.y:6494 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19785,7 +19873,7 @@ yydefault: case 1285: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6497 +//line sql.y:6498 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19793,7 +19881,7 @@ yydefault: case 1286: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6501 +//line sql.y:6502 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19801,7 +19889,7 @@ yydefault: case 1287: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6505 +//line sql.y:6506 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19809,7 +19897,7 @@ yydefault: case 1288: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6509 +//line sql.y:6510 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19817,7 +19905,7 @@ yydefault: case 1289: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6513 +//line sql.y:6514 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19825,7 +19913,7 @@ yydefault: case 1290: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6517 +//line sql.y:6518 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19833,7 +19921,7 @@ yydefault: case 1291: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6521 +//line sql.y:6522 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19841,7 +19929,7 @@ yydefault: case 1292: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6525 +//line sql.y:6526 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } @@ -19849,7 +19937,7 @@ yydefault: case 1293: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6529 +//line sql.y:6530 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } @@ -19857,7 +19945,7 @@ yydefault: case 1294: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6533 +//line sql.y:6534 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } @@ -19865,7 +19953,7 @@ yydefault: case 1295: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6537 +//line sql.y:6538 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} } @@ -19873,7 +19961,7 @@ yydefault: case 1296: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6541 +//line sql.y:6542 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} } @@ -19881,7 +19969,7 @@ yydefault: case 1297: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6545 +//line sql.y:6546 { yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} } @@ -19889,7 +19977,7 @@ yydefault: case 1298: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6549 +//line sql.y:6550 { yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } @@ -19897,7 +19985,7 @@ yydefault: case 1299: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6553 +//line sql.y:6554 { yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} } @@ -19905,7 +19993,7 @@ yydefault: case 1300: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6557 +//line sql.y:6558 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } @@ -19913,7 +20001,7 @@ yydefault: case 1301: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6561 +//line sql.y:6562 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} } @@ -19921,7 +20009,7 @@ yydefault: case 1302: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6565 +//line sql.y:6566 { yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} } @@ -19929,7 +20017,7 @@ yydefault: case 1303: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6569 +//line sql.y:6570 { yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} } @@ -19937,7 +20025,7 @@ yydefault: case 1304: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6573 +//line sql.y:6574 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } @@ -19945,7 +20033,7 @@ yydefault: case 1305: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6577 +//line sql.y:6578 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } @@ -19953,7 +20041,7 @@ yydefault: case 1306: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6581 +//line sql.y:6582 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} } @@ -19961,7 +20049,7 @@ yydefault: case 1307: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6585 +//line sql.y:6586 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} } @@ -19969,7 +20057,7 @@ yydefault: case 1308: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6589 +//line sql.y:6590 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} } @@ -19977,7 +20065,7 @@ yydefault: case 1309: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6593 +//line sql.y:6594 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} } @@ -19985,7 +20073,7 @@ yydefault: case 1310: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6597 +//line sql.y:6598 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} } @@ -19993,7 +20081,7 @@ yydefault: case 1311: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6601 +//line sql.y:6602 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} } @@ -20001,7 +20089,7 @@ yydefault: case 1312: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6605 +//line sql.y:6606 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} } @@ -20009,7 +20097,7 @@ yydefault: case 1313: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6609 +//line sql.y:6610 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } @@ -20017,7 +20105,7 @@ yydefault: case 1314: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6613 +//line sql.y:6614 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } @@ -20025,7 +20113,7 @@ yydefault: case 1315: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6617 +//line sql.y:6618 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } @@ -20033,7 +20121,7 @@ yydefault: case 1316: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6621 +//line sql.y:6622 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } @@ -20041,7 +20129,7 @@ yydefault: case 1317: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6625 +//line sql.y:6626 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } @@ -20049,7 +20137,7 @@ yydefault: case 1318: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6629 +//line sql.y:6630 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } @@ -20057,7 +20145,7 @@ yydefault: case 1319: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6633 +//line sql.y:6634 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } @@ -20065,7 +20153,7 @@ yydefault: case 1320: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6637 +//line sql.y:6638 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } @@ -20073,7 +20161,7 @@ yydefault: case 1321: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6641 +//line sql.y:6642 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } @@ -20081,7 +20169,7 @@ yydefault: case 1322: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6645 +//line sql.y:6646 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } @@ -20089,7 +20177,7 @@ yydefault: case 1323: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6649 +//line sql.y:6650 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } @@ -20097,7 +20185,7 @@ yydefault: case 1324: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6653 +//line sql.y:6654 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } @@ -20105,7 +20193,7 @@ yydefault: case 1325: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6657 +//line sql.y:6658 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } @@ -20113,7 +20201,7 @@ yydefault: case 1326: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6661 +//line sql.y:6662 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } @@ -20121,7 +20209,7 @@ yydefault: case 1327: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6665 +//line sql.y:6666 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -20129,7 +20217,7 @@ yydefault: case 1328: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6669 +//line sql.y:6670 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -20137,7 +20225,7 @@ yydefault: case 1329: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6673 +//line sql.y:6674 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -20145,7 +20233,7 @@ yydefault: case 1330: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6677 +//line sql.y:6678 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } @@ -20153,7 +20241,7 @@ yydefault: case 1331: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6681 +//line sql.y:6682 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } @@ -20161,7 +20249,7 @@ yydefault: case 1332: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6685 +//line sql.y:6686 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -20169,7 +20257,7 @@ yydefault: case 1333: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6689 +//line sql.y:6690 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -20177,7 +20265,7 @@ yydefault: case 1334: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6693 +//line sql.y:6694 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -20185,7 +20273,7 @@ yydefault: case 1335: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6697 +//line sql.y:6698 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -20193,7 +20281,7 @@ yydefault: case 1336: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6701 +//line sql.y:6702 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } @@ -20201,7 +20289,7 @@ yydefault: case 1337: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6705 +//line sql.y:6706 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -20209,7 +20297,7 @@ yydefault: case 1338: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6709 +//line sql.y:6710 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -20217,7 +20305,7 @@ yydefault: case 1339: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6713 +//line sql.y:6714 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } @@ -20225,7 +20313,7 @@ yydefault: case 1340: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6717 +//line sql.y:6718 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } @@ -20233,7 +20321,7 @@ yydefault: case 1341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6721 +//line sql.y:6722 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } @@ -20241,7 +20329,7 @@ yydefault: case 1342: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6725 +//line sql.y:6726 { yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} } @@ -20249,7 +20337,7 @@ yydefault: case 1343: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6729 +//line sql.y:6730 { yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} } @@ -20257,7 +20345,7 @@ yydefault: case 1344: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6733 +//line sql.y:6734 { yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} } @@ -20265,7 +20353,7 @@ yydefault: case 1345: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6737 +//line sql.y:6738 { yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} } @@ -20273,7 +20361,7 @@ yydefault: case 1346: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6741 +//line sql.y:6742 { yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} } @@ -20281,7 +20369,7 @@ yydefault: case 1347: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6745 +//line sql.y:6746 { yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} } @@ -20289,7 +20377,7 @@ yydefault: case 1348: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6749 +//line sql.y:6750 { yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } @@ -20297,7 +20385,7 @@ yydefault: case 1349: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6753 +//line sql.y:6754 { yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -20305,7 +20393,7 @@ yydefault: case 1350: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6757 +//line sql.y:6758 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } @@ -20313,7 +20401,7 @@ yydefault: case 1351: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6761 +//line sql.y:6762 { yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } @@ -20321,7 +20409,7 @@ yydefault: case 1352: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6765 +//line sql.y:6766 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } @@ -20329,7 +20417,7 @@ yydefault: case 1353: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6769 +//line sql.y:6770 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } @@ -20337,7 +20425,7 @@ yydefault: case 1354: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6773 +//line sql.y:6774 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } @@ -20345,7 +20433,7 @@ yydefault: case 1355: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6777 +//line sql.y:6778 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } @@ -20353,7 +20441,7 @@ yydefault: case 1356: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6781 +//line sql.y:6782 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } @@ -20361,7 +20449,7 @@ yydefault: case 1357: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6785 +//line sql.y:6786 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } @@ -20369,7 +20457,7 @@ yydefault: case 1358: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6789 +//line sql.y:6790 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } @@ -20377,7 +20465,7 @@ yydefault: case 1359: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6793 +//line sql.y:6794 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } @@ -20385,7 +20473,7 @@ yydefault: case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6803 +//line sql.y:6804 { yyLOCAL = yyDollar[1].exprUnion() } @@ -20393,7 +20481,7 @@ yydefault: case 1365: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6807 +//line sql.y:6808 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -20401,7 +20489,7 @@ yydefault: case 1366: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6811 +//line sql.y:6812 { yyLOCAL = yyDollar[1].variableUnion() } @@ -20409,7 +20497,7 @@ yydefault: case 1367: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6815 +//line sql.y:6816 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } @@ -20417,7 +20505,7 @@ yydefault: case 1368: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6820 +//line sql.y:6821 { yyLOCAL = nil } @@ -20425,7 +20513,7 @@ yydefault: case 1369: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6824 +//line sql.y:6825 { yyLOCAL = yyDollar[2].exprUnion() } @@ -20433,7 +20521,7 @@ yydefault: case 1370: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6830 +//line sql.y:6831 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -20441,7 +20529,7 @@ yydefault: case 1371: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6834 +//line sql.y:6835 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } @@ -20449,7 +20537,7 @@ yydefault: case 1372: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6838 +//line sql.y:6839 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } @@ -20457,7 +20545,7 @@ yydefault: case 1373: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6842 +//line sql.y:6843 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } @@ -20465,7 +20553,7 @@ yydefault: case 1374: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6846 +//line sql.y:6847 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} @@ -20474,7 +20562,7 @@ yydefault: case 1375: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6851 +//line sql.y:6852 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -20482,7 +20570,7 @@ yydefault: case 1376: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6855 +//line sql.y:6856 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } @@ -20490,7 +20578,7 @@ yydefault: case 1377: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6859 +//line sql.y:6860 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } @@ -20498,7 +20586,7 @@ yydefault: case 1378: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6863 +//line sql.y:6864 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } @@ -20506,7 +20594,7 @@ yydefault: case 1379: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6867 +//line sql.y:6868 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } @@ -20514,7 +20602,7 @@ yydefault: case 1380: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6871 +//line sql.y:6872 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} @@ -20523,7 +20611,7 @@ yydefault: case 1381: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6876 +//line sql.y:6877 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } @@ -20531,7 +20619,7 @@ yydefault: case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6880 +//line sql.y:6881 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } @@ -20539,7 +20627,7 @@ yydefault: case 1383: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6884 +//line sql.y:6885 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } @@ -20547,7 +20635,7 @@ yydefault: case 1384: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6888 +//line sql.y:6889 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} @@ -20556,7 +20644,7 @@ yydefault: case 1385: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6895 +//line sql.y:6896 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } @@ -20564,7 +20652,7 @@ yydefault: case 1386: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6899 +//line sql.y:6900 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } @@ -20572,7 +20660,7 @@ yydefault: case 1387: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6905 +//line sql.y:6906 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } @@ -20580,7 +20668,7 @@ yydefault: case 1388: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6909 +//line sql.y:6910 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } @@ -20588,7 +20676,7 @@ yydefault: case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6913 +//line sql.y:6914 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } @@ -20596,7 +20684,7 @@ yydefault: case 1390: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6917 +//line sql.y:6918 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } @@ -20604,7 +20692,7 @@ yydefault: case 1391: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6923 +//line sql.y:6924 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } @@ -20612,7 +20700,7 @@ yydefault: case 1392: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6927 +//line sql.y:6928 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } @@ -20620,7 +20708,7 @@ yydefault: case 1393: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6931 +//line sql.y:6932 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } @@ -20628,7 +20716,7 @@ yydefault: case 1394: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6935 +//line sql.y:6936 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -20636,7 +20724,7 @@ yydefault: case 1395: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6939 +//line sql.y:6940 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } @@ -20644,7 +20732,7 @@ yydefault: case 1396: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6943 +//line sql.y:6944 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } @@ -20652,7 +20740,7 @@ yydefault: case 1397: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6947 +//line sql.y:6948 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } @@ -20660,7 +20748,7 @@ yydefault: case 1398: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6952 +//line sql.y:6953 { yyLOCAL = nil } @@ -20668,7 +20756,7 @@ yydefault: case 1399: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6956 +//line sql.y:6957 { yyLOCAL = yyDollar[2].convertTypeUnion() } @@ -20676,7 +20764,7 @@ yydefault: case 1400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6962 +//line sql.y:6963 { yyLOCAL = IntervalDayHour } @@ -20684,7 +20772,7 @@ yydefault: case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6966 +//line sql.y:6967 { yyLOCAL = IntervalDayMicrosecond } @@ -20692,7 +20780,7 @@ yydefault: case 1402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6970 +//line sql.y:6971 { yyLOCAL = IntervalDayMinute } @@ -20700,7 +20788,7 @@ yydefault: case 1403: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6974 +//line sql.y:6975 { yyLOCAL = IntervalDaySecond } @@ -20708,7 +20796,7 @@ yydefault: case 1404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6978 +//line sql.y:6979 { yyLOCAL = IntervalHourMicrosecond } @@ -20716,7 +20804,7 @@ yydefault: case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6982 +//line sql.y:6983 { yyLOCAL = IntervalHourMinute } @@ -20724,7 +20812,7 @@ yydefault: case 1406: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6986 +//line sql.y:6987 { yyLOCAL = IntervalHourSecond } @@ -20732,7 +20820,7 @@ yydefault: case 1407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6990 +//line sql.y:6991 { yyLOCAL = IntervalMinuteMicrosecond } @@ -20740,7 +20828,7 @@ yydefault: case 1408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6994 +//line sql.y:6995 { yyLOCAL = IntervalMinuteSecond } @@ -20748,7 +20836,7 @@ yydefault: case 1409: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6998 +//line sql.y:6999 { yyLOCAL = IntervalSecondMicrosecond } @@ -20756,7 +20844,7 @@ yydefault: case 1410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7002 +//line sql.y:7003 { yyLOCAL = IntervalYearMonth } @@ -20764,7 +20852,7 @@ yydefault: case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7006 +//line sql.y:7007 { yyLOCAL = IntervalDay } @@ -20772,7 +20860,7 @@ yydefault: case 1412: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7010 +//line sql.y:7011 { yyLOCAL = IntervalWeek } @@ -20780,7 +20868,7 @@ yydefault: case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7014 +//line sql.y:7015 { yyLOCAL = IntervalHour } @@ -20788,7 +20876,7 @@ yydefault: case 1414: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7018 +//line sql.y:7019 { yyLOCAL = IntervalMinute } @@ -20796,7 +20884,7 @@ yydefault: case 1415: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7022 +//line sql.y:7023 { yyLOCAL = IntervalMonth } @@ -20804,7 +20892,7 @@ yydefault: case 1416: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7026 +//line sql.y:7027 { yyLOCAL = IntervalQuarter } @@ -20812,7 +20900,7 @@ yydefault: case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7030 +//line sql.y:7031 { yyLOCAL = IntervalSecond } @@ -20820,7 +20908,7 @@ yydefault: case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7034 +//line sql.y:7035 { yyLOCAL = IntervalMicrosecond } @@ -20828,7 +20916,7 @@ yydefault: case 1419: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7038 +//line sql.y:7039 { yyLOCAL = IntervalYear } @@ -20836,7 +20924,7 @@ yydefault: case 1420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7044 +//line sql.y:7045 { yyLOCAL = IntervalDay } @@ -20844,7 +20932,7 @@ yydefault: case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7048 +//line sql.y:7049 { yyLOCAL = IntervalWeek } @@ -20852,7 +20940,7 @@ yydefault: case 1422: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7052 +//line sql.y:7053 { yyLOCAL = IntervalHour } @@ -20860,7 +20948,7 @@ yydefault: case 1423: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7056 +//line sql.y:7057 { yyLOCAL = IntervalMinute } @@ -20868,7 +20956,7 @@ yydefault: case 1424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7060 +//line sql.y:7061 { yyLOCAL = IntervalMonth } @@ -20876,7 +20964,7 @@ yydefault: case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7064 +//line sql.y:7065 { yyLOCAL = IntervalQuarter } @@ -20884,7 +20972,7 @@ yydefault: case 1426: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7068 +//line sql.y:7069 { yyLOCAL = IntervalSecond } @@ -20892,7 +20980,7 @@ yydefault: case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7072 +//line sql.y:7073 { yyLOCAL = IntervalMicrosecond } @@ -20900,7 +20988,7 @@ yydefault: case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7076 +//line sql.y:7077 { yyLOCAL = IntervalYear } @@ -20908,7 +20996,7 @@ yydefault: case 1429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7080 +//line sql.y:7081 { yyLOCAL = IntervalDay } @@ -20916,7 +21004,7 @@ yydefault: case 1430: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7084 +//line sql.y:7085 { yyLOCAL = IntervalWeek } @@ -20924,7 +21012,7 @@ yydefault: case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7088 +//line sql.y:7089 { yyLOCAL = IntervalHour } @@ -20932,7 +21020,7 @@ yydefault: case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7092 +//line sql.y:7093 { yyLOCAL = IntervalMinute } @@ -20940,7 +21028,7 @@ yydefault: case 1433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7096 +//line sql.y:7097 { yyLOCAL = IntervalMonth } @@ -20948,7 +21036,7 @@ yydefault: case 1434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7100 +//line sql.y:7101 { yyLOCAL = IntervalQuarter } @@ -20956,7 +21044,7 @@ yydefault: case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7104 +//line sql.y:7105 { yyLOCAL = IntervalSecond } @@ -20964,7 +21052,7 @@ yydefault: case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7108 +//line sql.y:7109 { yyLOCAL = IntervalMicrosecond } @@ -20972,7 +21060,7 @@ yydefault: case 1437: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7112 +//line sql.y:7113 { yyLOCAL = IntervalYear } @@ -20980,7 +21068,7 @@ yydefault: case 1440: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:7122 +//line sql.y:7123 { yyLOCAL = 0 } @@ -20988,7 +21076,7 @@ yydefault: case 1441: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:7126 +//line sql.y:7127 { yyLOCAL = 0 } @@ -20996,7 +21084,7 @@ yydefault: case 1442: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:7130 +//line sql.y:7131 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -21004,7 +21092,7 @@ yydefault: case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7140 +//line sql.y:7141 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].exprsUnion()} } @@ -21012,7 +21100,7 @@ yydefault: case 1444: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7144 +//line sql.y:7145 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].exprsUnion()} } @@ -21020,7 +21108,7 @@ yydefault: case 1445: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7148 +//line sql.y:7149 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].exprsUnion()} } @@ -21028,7 +21116,7 @@ yydefault: case 1446: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7152 +//line sql.y:7153 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].exprsUnion()} } @@ -21036,7 +21124,7 @@ yydefault: case 1447: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7156 +//line sql.y:7157 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].exprsUnion()} } @@ -21044,7 +21132,7 @@ yydefault: case 1448: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7162 +//line sql.y:7163 { yyLOCAL = NoOption } @@ -21052,7 +21140,7 @@ yydefault: case 1449: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7166 +//line sql.y:7167 { yyLOCAL = BooleanModeOpt } @@ -21060,7 +21148,7 @@ yydefault: case 1450: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7170 +//line sql.y:7171 { yyLOCAL = NaturalLanguageModeOpt } @@ -21068,7 +21156,7 @@ yydefault: case 1451: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7174 +//line sql.y:7175 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } @@ -21076,33 +21164,33 @@ yydefault: case 1452: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7178 +//line sql.y:7179 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL case 1453: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7184 +//line sql.y:7185 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1454: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7188 +//line sql.y:7189 { yyVAL.str = string(yyDollar[1].str) } case 1455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7192 +//line sql.y:7193 { yyVAL.str = string(yyDollar[1].str) } case 1456: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7198 +//line sql.y:7199 { yyLOCAL = nil } @@ -21110,7 +21198,7 @@ yydefault: case 1457: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7202 +//line sql.y:7203 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } @@ -21118,7 +21206,7 @@ yydefault: case 1458: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7206 +//line sql.y:7207 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } @@ -21126,7 +21214,7 @@ yydefault: case 1459: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7212 +//line sql.y:7213 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } @@ -21134,7 +21222,7 @@ yydefault: case 1460: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7216 +//line sql.y:7217 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } @@ -21142,7 +21230,7 @@ yydefault: case 1461: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7220 +//line sql.y:7221 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21150,7 +21238,7 @@ yydefault: case 1462: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7224 +//line sql.y:7225 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } @@ -21158,7 +21246,7 @@ yydefault: case 1463: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7228 +//line sql.y:7229 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length @@ -21168,7 +21256,7 @@ yydefault: case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7234 +//line sql.y:7235 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21176,7 +21264,7 @@ yydefault: case 1465: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7238 +//line sql.y:7239 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } @@ -21184,7 +21272,7 @@ yydefault: case 1466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7242 +//line sql.y:7243 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21192,7 +21280,7 @@ yydefault: case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7246 +//line sql.y:7247 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21200,7 +21288,7 @@ yydefault: case 1468: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7250 +//line sql.y:7251 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } @@ -21208,7 +21296,7 @@ yydefault: case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7254 +//line sql.y:7255 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21216,7 +21304,7 @@ yydefault: case 1470: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7258 +//line sql.y:7259 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21224,7 +21312,7 @@ yydefault: case 1471: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7262 +//line sql.y:7263 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } @@ -21232,7 +21320,7 @@ yydefault: case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7266 +//line sql.y:7267 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21240,7 +21328,7 @@ yydefault: case 1473: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7270 +//line sql.y:7271 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } @@ -21248,7 +21336,7 @@ yydefault: case 1474: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7276 +//line sql.y:7277 { yyLOCAL = false } @@ -21256,7 +21344,7 @@ yydefault: case 1475: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7280 +//line sql.y:7281 { yyLOCAL = true } @@ -21264,7 +21352,7 @@ yydefault: case 1476: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7285 +//line sql.y:7286 { yyLOCAL = nil } @@ -21272,34 +21360,34 @@ yydefault: case 1477: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7289 +//line sql.y:7290 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1478: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7294 +//line sql.y:7295 { yyVAL.str = string("") } case 1479: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7298 +//line sql.y:7299 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 1480: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:7304 +//line sql.y:7305 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL case 1481: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7308 +//line sql.y:7309 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) @@ -21307,7 +21395,7 @@ yydefault: case 1482: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:7314 +//line sql.y:7315 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } @@ -21315,7 +21403,7 @@ yydefault: case 1483: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7319 +//line sql.y:7320 { yyLOCAL = nil } @@ -21323,7 +21411,7 @@ yydefault: case 1484: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7323 +//line sql.y:7324 { yyLOCAL = yyDollar[2].exprUnion() } @@ -21331,7 +21419,7 @@ yydefault: case 1485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7329 +//line sql.y:7330 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } @@ -21339,7 +21427,7 @@ yydefault: case 1486: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7333 +//line sql.y:7334 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } @@ -21347,7 +21435,7 @@ yydefault: case 1487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:7337 +//line sql.y:7338 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } @@ -21355,7 +21443,7 @@ yydefault: case 1488: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:7341 +//line sql.y:7342 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } @@ -21363,7 +21451,7 @@ yydefault: case 1489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7347 +//line sql.y:7348 { yyLOCAL = yyDollar[1].colNameUnion() } @@ -21371,7 +21459,7 @@ yydefault: case 1490: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7351 +//line sql.y:7352 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } @@ -21379,7 +21467,7 @@ yydefault: case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7357 +//line sql.y:7358 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -21392,7 +21480,7 @@ yydefault: case 1492: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7366 +//line sql.y:7367 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -21400,7 +21488,7 @@ yydefault: case 1493: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7370 +//line sql.y:7371 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } @@ -21408,7 +21496,7 @@ yydefault: case 1494: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7375 +//line sql.y:7376 { yyLOCAL = nil } @@ -21416,7 +21504,7 @@ yydefault: case 1495: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7379 +//line sql.y:7380 { yyLOCAL = &GroupBy{Exprs: yyDollar[3].exprsUnion(), WithRollup: yyDollar[4].booleanUnion()} } @@ -21424,7 +21512,7 @@ yydefault: case 1496: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7384 +//line sql.y:7385 { yyLOCAL = false } @@ -21432,7 +21520,7 @@ yydefault: case 1497: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7388 +//line sql.y:7389 { yyLOCAL = true } @@ -21440,7 +21528,7 @@ yydefault: case 1498: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7394 +//line sql.y:7395 { yyLOCAL = nil } @@ -21448,7 +21536,7 @@ yydefault: case 1499: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7398 +//line sql.y:7399 { yyLOCAL = yyDollar[2].exprUnion() } @@ -21456,7 +21544,7 @@ yydefault: case 1500: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:7404 +//line sql.y:7405 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } @@ -21464,14 +21552,14 @@ yydefault: case 1501: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7410 +//line sql.y:7411 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL case 1502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7414 +//line sql.y:7415 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) @@ -21479,7 +21567,7 @@ yydefault: case 1503: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7419 +//line sql.y:7420 { yyLOCAL = nil } @@ -21487,7 +21575,7 @@ yydefault: case 1504: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7423 +//line sql.y:7424 { yyLOCAL = yyDollar[1].namedWindowsUnion() } @@ -21495,7 +21583,7 @@ yydefault: case 1505: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7428 +//line sql.y:7429 { yyLOCAL = nil } @@ -21503,7 +21591,7 @@ yydefault: case 1506: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7432 +//line sql.y:7433 { yyLOCAL = yyDollar[1].orderByUnion() } @@ -21511,7 +21599,7 @@ yydefault: case 1507: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7438 +//line sql.y:7439 { yyLOCAL = yyDollar[3].orderByUnion() } @@ -21519,14 +21607,14 @@ yydefault: case 1508: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7444 +//line sql.y:7445 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL case 1509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7448 +//line sql.y:7449 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) @@ -21534,7 +21622,7 @@ yydefault: case 1510: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:7454 +//line sql.y:7455 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } @@ -21542,7 +21630,7 @@ yydefault: case 1511: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7459 +//line sql.y:7460 { yyLOCAL = AscOrder } @@ -21550,7 +21638,7 @@ yydefault: case 1512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7463 +//line sql.y:7464 { yyLOCAL = AscOrder } @@ -21558,7 +21646,7 @@ yydefault: case 1513: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7467 +//line sql.y:7468 { yyLOCAL = DescOrder } @@ -21566,7 +21654,7 @@ yydefault: case 1514: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:7472 +//line sql.y:7473 { yyLOCAL = nil } @@ -21574,7 +21662,7 @@ yydefault: case 1515: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:7476 +//line sql.y:7477 { yyLOCAL = yyDollar[1].limitUnion() } @@ -21582,7 +21670,7 @@ yydefault: case 1516: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:7482 +//line sql.y:7483 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } @@ -21590,7 +21678,7 @@ yydefault: case 1517: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7486 +//line sql.y:7487 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } @@ -21598,7 +21686,7 @@ yydefault: case 1518: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7490 +//line sql.y:7491 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } @@ -21606,7 +21694,7 @@ yydefault: case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7495 +//line sql.y:7496 { yyLOCAL = nil } @@ -21614,7 +21702,7 @@ yydefault: case 1520: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7499 +//line sql.y:7500 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } @@ -21622,7 +21710,7 @@ yydefault: case 1521: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7503 +//line sql.y:7504 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } @@ -21630,7 +21718,7 @@ yydefault: case 1522: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7507 +//line sql.y:7508 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } @@ -21638,7 +21726,7 @@ yydefault: case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7511 +//line sql.y:7512 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } @@ -21646,7 +21734,7 @@ yydefault: case 1524: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7518 +//line sql.y:7519 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -21654,7 +21742,7 @@ yydefault: case 1525: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7522 +//line sql.y:7523 { yyLOCAL = &LockOption{Type: NoneType} } @@ -21662,7 +21750,7 @@ yydefault: case 1526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7526 +//line sql.y:7527 { yyLOCAL = &LockOption{Type: SharedType} } @@ -21670,7 +21758,7 @@ yydefault: case 1527: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7530 +//line sql.y:7531 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -21678,7 +21766,7 @@ yydefault: case 1528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7536 +//line sql.y:7537 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -21686,7 +21774,7 @@ yydefault: case 1529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7540 +//line sql.y:7541 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -21694,7 +21782,7 @@ yydefault: case 1530: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7544 +//line sql.y:7545 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } @@ -21702,93 +21790,93 @@ yydefault: case 1531: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7548 +//line sql.y:7549 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL case 1532: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7553 +//line sql.y:7554 { yyVAL.str = "" } case 1533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7557 +//line sql.y:7558 { yyVAL.str = string(yyDollar[3].str) } case 1534: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7561 +//line sql.y:7562 { yyVAL.str = string(yyDollar[3].str) } case 1535: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7565 +//line sql.y:7566 { yyVAL.str = string(yyDollar[3].str) } case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7570 +//line sql.y:7571 { yyVAL.str = "" } case 1537: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7574 +//line sql.y:7575 { yyVAL.str = yyDollar[3].str } case 1538: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7580 +//line sql.y:7581 { yyVAL.str = string(yyDollar[1].str) } case 1539: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7584 +//line sql.y:7585 { yyVAL.str = string(yyDollar[1].str) } case 1540: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7589 +//line sql.y:7590 { yyVAL.str = "" } case 1541: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7593 +//line sql.y:7594 { yyVAL.str = yyDollar[2].str } case 1542: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7598 +//line sql.y:7599 { yyVAL.str = "cascaded" } case 1543: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7602 +//line sql.y:7603 { yyVAL.str = string(yyDollar[1].str) } case 1544: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7606 +//line sql.y:7607 { yyVAL.str = string(yyDollar[1].str) } case 1545: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:7611 +//line sql.y:7612 { yyLOCAL = nil } @@ -21796,7 +21884,7 @@ yydefault: case 1546: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7615 +//line sql.y:7616 { yyLOCAL = yyDollar[3].definerUnion() } @@ -21804,7 +21892,7 @@ yydefault: case 1547: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:7621 +//line sql.y:7622 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), @@ -21814,7 +21902,7 @@ yydefault: case 1548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7627 +//line sql.y:7628 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), @@ -21824,7 +21912,7 @@ yydefault: case 1549: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:7633 +//line sql.y:7634 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -21834,32 +21922,32 @@ yydefault: yyVAL.union = yyLOCAL case 1550: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7642 +//line sql.y:7643 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 1551: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7646 +//line sql.y:7647 { yyVAL.str = formatIdentifier(yyDollar[1].str) } case 1552: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7651 +//line sql.y:7652 { yyVAL.str = "" } case 1553: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7655 +//line sql.y:7656 { yyVAL.str = formatAddress(yyDollar[1].str) } case 1554: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7661 +//line sql.y:7662 { yyLOCAL = ForUpdateLock } @@ -21867,7 +21955,7 @@ yydefault: case 1555: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7665 +//line sql.y:7666 { yyLOCAL = ForUpdateLockNoWait } @@ -21875,7 +21963,7 @@ yydefault: case 1556: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7669 +//line sql.y:7670 { yyLOCAL = ForUpdateLockSkipLocked } @@ -21883,7 +21971,7 @@ yydefault: case 1557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7673 +//line sql.y:7674 { yyLOCAL = ForShareLock } @@ -21891,7 +21979,7 @@ yydefault: case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7677 +//line sql.y:7678 { yyLOCAL = ForShareLockNoWait } @@ -21899,7 +21987,7 @@ yydefault: case 1559: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7681 +//line sql.y:7682 { yyLOCAL = ForShareLockSkipLocked } @@ -21907,7 +21995,7 @@ yydefault: case 1560: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7685 +//line sql.y:7686 { yyLOCAL = ShareModeLock } @@ -21915,7 +22003,7 @@ yydefault: case 1561: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7691 +//line sql.y:7692 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } @@ -21923,7 +22011,7 @@ yydefault: case 1562: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7695 +//line sql.y:7696 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } @@ -21931,177 +22019,177 @@ yydefault: case 1563: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7699 +//line sql.y:7700 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL case 1564: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7704 +//line sql.y:7705 { yyVAL.str = "" } case 1565: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7708 +//line sql.y:7709 { yyVAL.str = " format csv" + yyDollar[3].str } case 1566: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7712 +//line sql.y:7713 { yyVAL.str = " format text" + yyDollar[3].str } case 1567: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7717 +//line sql.y:7718 { yyVAL.str = "" } case 1568: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7721 +//line sql.y:7722 { yyVAL.str = " header" } case 1569: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7726 +//line sql.y:7727 { yyVAL.str = "" } case 1570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7730 +//line sql.y:7731 { yyVAL.str = " manifest on" } case 1571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7734 +//line sql.y:7735 { yyVAL.str = " manifest off" } case 1572: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7739 +//line sql.y:7740 { yyVAL.str = "" } case 1573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7743 +//line sql.y:7744 { yyVAL.str = " overwrite on" } case 1574: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7747 +//line sql.y:7748 { yyVAL.str = " overwrite off" } case 1575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7753 +//line sql.y:7754 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1576: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7758 +//line sql.y:7759 { yyVAL.str = "" } case 1577: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7762 +//line sql.y:7763 { yyVAL.str = " lines" + yyDollar[2].str } case 1578: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7768 +//line sql.y:7769 { yyVAL.str = yyDollar[1].str } case 1579: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7772 +//line sql.y:7773 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1580: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7778 +//line sql.y:7779 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } case 1581: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7782 +//line sql.y:7783 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } case 1582: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7787 +//line sql.y:7788 { yyVAL.str = "" } case 1583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7791 +//line sql.y:7792 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } case 1584: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7797 +//line sql.y:7798 { yyVAL.str = yyDollar[1].str } case 1585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7801 +//line sql.y:7802 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } case 1586: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7807 +//line sql.y:7808 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } case 1587: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7811 +//line sql.y:7812 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } case 1588: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7815 +//line sql.y:7816 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } case 1589: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7820 +//line sql.y:7821 { yyVAL.str = "" } case 1590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7824 +//line sql.y:7825 { yyVAL.str = " optionally" } case 1591: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Insert -//line sql.y:7837 +//line sql.y:7838 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion(), RowAlias: yyDollar[3].rowAliasUnion()} } @@ -22109,7 +22197,7 @@ yydefault: case 1592: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7841 +//line sql.y:7842 { yyLOCAL = &Insert{Rows: yyDollar[1].tableStmtUnion()} } @@ -22117,7 +22205,7 @@ yydefault: case 1593: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *Insert -//line sql.y:7845 +//line sql.y:7846 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion(), RowAlias: yyDollar[6].rowAliasUnion()} } @@ -22125,7 +22213,7 @@ yydefault: case 1594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7849 +//line sql.y:7850 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion(), RowAlias: yyDollar[5].rowAliasUnion()} } @@ -22133,7 +22221,7 @@ yydefault: case 1595: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7853 +//line sql.y:7854 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].tableStmtUnion()} } @@ -22141,7 +22229,7 @@ yydefault: case 1596: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7859 +//line sql.y:7860 { yyLOCAL = Columns{yyDollar[1].identifierCI} } @@ -22149,21 +22237,21 @@ yydefault: case 1597: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7863 +//line sql.y:7864 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL case 1598: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7867 +//line sql.y:7868 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } case 1599: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7871 +//line sql.y:7872 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) @@ -22171,7 +22259,7 @@ yydefault: case 1600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7876 +//line sql.y:7877 { yyLOCAL = nil } @@ -22179,7 +22267,7 @@ yydefault: case 1601: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7880 +//line sql.y:7881 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS} } @@ -22187,7 +22275,7 @@ yydefault: case 1602: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7884 +//line sql.y:7885 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS, Columns: yyDollar[4].columnsUnion()} } @@ -22195,7 +22283,7 @@ yydefault: case 1603: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7889 +//line sql.y:7890 { yyLOCAL = nil } @@ -22203,7 +22291,7 @@ yydefault: case 1604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7893 +//line sql.y:7894 { yyLOCAL = yyDollar[5].updateExprsUnion() } @@ -22211,14 +22299,14 @@ yydefault: case 1605: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7899 +//line sql.y:7900 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL case 1606: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7903 +//line sql.y:7904 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) @@ -22226,14 +22314,14 @@ yydefault: case 1607: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7909 +//line sql.y:7910 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL case 1608: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7913 +//line sql.y:7914 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) @@ -22241,7 +22329,7 @@ yydefault: case 1609: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7919 +//line sql.y:7920 { yyLOCAL = yyDollar[1].valTupleUnion() } @@ -22249,7 +22337,7 @@ yydefault: case 1610: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7923 +//line sql.y:7924 { yyLOCAL = ValTuple{} } @@ -22257,7 +22345,7 @@ yydefault: case 1611: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7929 +//line sql.y:7930 { yyLOCAL = yyDollar[1].valTupleUnion() } @@ -22265,7 +22353,7 @@ yydefault: case 1612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7933 +//line sql.y:7934 { yyLOCAL = ValTuple{} } @@ -22273,7 +22361,7 @@ yydefault: case 1613: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7939 +//line sql.y:7940 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } @@ -22281,7 +22369,7 @@ yydefault: case 1614: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7945 +//line sql.y:7946 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } @@ -22289,7 +22377,7 @@ yydefault: case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7955 +//line sql.y:7956 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -22301,14 +22389,14 @@ yydefault: case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7965 +//line sql.y:7966 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL case 1619: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7969 +//line sql.y:7970 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) @@ -22316,21 +22404,21 @@ yydefault: case 1620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7975 +//line sql.y:7976 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1622: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7982 +//line sql.y:7983 { yyVAL.str = "charset" } case 1625: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7992 +//line sql.y:7993 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } @@ -22338,7 +22426,7 @@ yydefault: case 1626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7996 +//line sql.y:7997 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } @@ -22346,7 +22434,7 @@ yydefault: case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:8000 +//line sql.y:8001 { yyLOCAL = &Default{} } @@ -22354,7 +22442,7 @@ yydefault: case 1630: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:8009 +//line sql.y:8010 { yyLOCAL = false } @@ -22362,7 +22450,7 @@ yydefault: case 1631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:8011 +//line sql.y:8012 { yyLOCAL = true } @@ -22370,7 +22458,7 @@ yydefault: case 1632: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:8014 +//line sql.y:8015 { yyLOCAL = false } @@ -22378,7 +22466,7 @@ yydefault: case 1633: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:8016 +//line sql.y:8017 { yyLOCAL = true } @@ -22386,7 +22474,7 @@ yydefault: case 1634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:8019 +//line sql.y:8020 { yyLOCAL = false } @@ -22394,7 +22482,7 @@ yydefault: case 1635: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:8021 +//line sql.y:8022 { yyLOCAL = true } @@ -22402,7 +22490,7 @@ yydefault: case 1636: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:8024 +//line sql.y:8025 { yyLOCAL = false } @@ -22410,33 +22498,33 @@ yydefault: case 1637: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:8026 +//line sql.y:8027 { yyLOCAL = true } yyVAL.union = yyLOCAL case 1638: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8029 +//line sql.y:8030 { yyVAL.empty = struct{}{} } case 1639: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8031 +//line sql.y:8032 { yyVAL.empty = struct{}{} } case 1640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8033 +//line sql.y:8034 { yyVAL.empty = struct{}{} } case 1641: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:8037 +//line sql.y:8038 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } @@ -22444,7 +22532,7 @@ yydefault: case 1642: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:8042 +//line sql.y:8043 { yyLOCAL = nil } @@ -22452,7 +22540,7 @@ yydefault: case 1643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:8046 +//line sql.y:8047 { yyLOCAL = yyDollar[1].exprsUnion() } @@ -22460,7 +22548,7 @@ yydefault: case 1644: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8051 +//line sql.y:8052 { yyLOCAL = nil } @@ -22468,7 +22556,7 @@ yydefault: case 1645: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:8053 +//line sql.y:8054 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } @@ -22476,63 +22564,63 @@ yydefault: case 1646: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:8057 +//line sql.y:8058 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL case 1647: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8063 +//line sql.y:8064 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 1648: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8067 +//line sql.y:8068 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8074 +//line sql.y:8075 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8080 +//line sql.y:8081 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8084 +//line sql.y:8085 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1653: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8090 +//line sql.y:8091 { yyVAL.identifierCS = NewIdentifierCS("") } case 1654: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8094 +//line sql.y:8095 { yyVAL.identifierCS = yyDollar[1].identifierCS } case 1656: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8101 +//line sql.y:8102 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1657: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:8107 +//line sql.y:8108 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } @@ -22540,7 +22628,7 @@ yydefault: case 1658: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:8113 +//line sql.y:8114 { yyLOCAL = ConnectionType } @@ -22548,7 +22636,7 @@ yydefault: case 1659: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8117 +//line sql.y:8118 { yyLOCAL = ConnectionType } @@ -22556,42 +22644,42 @@ yydefault: case 1660: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8121 +//line sql.y:8122 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2292: + case 2296: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8781 +//line sql.y:8786 { } - case 2293: + case 2297: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8786 +//line sql.y:8791 { } - case 2294: + case 2298: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8790 +//line sql.y:8795 { skipToEnd(yylex) } - case 2295: + case 2299: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8795 +//line sql.y:8800 { skipToEnd(yylex) } - case 2296: + case 2300: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8799 +//line sql.y:8804 { skipToEnd(yylex) } - case 2297: + case 2301: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8803 +//line sql.y:8808 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 65c7bc84d01..b6835ad32a5 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -402,6 +402,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %token NESTED NETWORK_NAMESPACE NOWAIT NULLS OJ OLD OPTIONAL ORDINALITY ORGANIZATION OTHERS PARTIAL PATH PERSIST PERSIST_ONLY PRECEDING PRIVILEGE_CHECKS_USER PROCESS %token RANDOM REFERENCE REQUIRE_ROW_FORMAT RESOURCE RESPECT RESTART RETAIN REUSE ROLE SECONDARY SECONDARY_ENGINE SECONDARY_ENGINE_ATTRIBUTE SECONDARY_LOAD SECONDARY_UNLOAD SIMPLE SKIP SRID %token THREAD_PRIORITY TIES UNBOUNDED VCPU VISIBLE RETURNING +%token MANUAL PARALLEL QUALIFY TABLESAMPLE // Performance Schema Functions %token FORMAT_BYTES FORMAT_PICO_TIME PS_CURRENT_THREAD_ID PS_THREAD_ID @@ -8485,6 +8486,7 @@ non_reserved_keyword: | LONGBLOB | LONGTEXT | LTRIM %prec FUNCTION_CALL_NON_KEYWORD +| MANUAL | MANIFEST | MASTER_COMPRESSION_ALGORITHMS | MASTER_PUBLIC_KEY_PATH @@ -8530,6 +8532,7 @@ non_reserved_keyword: | OTHERS | OVERWRITE | PACK_KEYS +| PARALLEL | PARSER | PARTIAL | PARTITIONING @@ -8553,6 +8556,7 @@ non_reserved_keyword: | PROCEDURE | PROCESSLIST | PURGE +| QUALIFY | QUERIES | QUERY | RANDOM @@ -8680,6 +8684,7 @@ non_reserved_keyword: | SUBPARTITIONS | SUM %prec FUNCTION_CALL_NON_KEYWORD | TABLES +| TABLESAMPLE | TABLESPACE | TEMPORARY | TEMPTABLE diff --git a/go/vt/sqlparser/testdata/mysql_keywords.txt b/go/vt/sqlparser/testdata/mysql_keywords.txt index 9e5c6eab6d8..dc24fe94c0a 100644 --- a/go/vt/sqlparser/testdata/mysql_keywords.txt +++ b/go/vt/sqlparser/testdata/mysql_keywords.txt @@ -1,5 +1,5 @@ // Code generated by `SELECT * FROM INFORMATION_SCHEMA.KEYWORDS`. -// Reference: https://dev.mysql.com/doc/refman/8.0/en/information-schema-keywords-table.html +// Reference: https://dev.mysql.com/doc/refman/8.4/en/information-schema-keywords-table.html // DO NOT EDIT. WORD RESERVED ACCESSIBLE 1 @@ -23,8 +23,11 @@ AS 1 ASC 1 ASCII 0 ASENSITIVE 1 +ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 0 AT 0 ATTRIBUTE 0 +AUTHENTICATION 0 +AUTO 0 AUTOEXTEND_SIZE 0 AUTO_INCREMENT 0 AVG 0 @@ -32,6 +35,7 @@ AVG_ROW_LENGTH 0 BACKUP 0 BEFORE 1 BEGIN 0 +BERNOULLI 0 BETWEEN 1 BIGINT 1 BINARY 1 @@ -44,6 +48,7 @@ BOOLEAN 0 BOTH 1 BTREE 0 BUCKETS 0 +BULK 0 BY 1 BYTE 0 CACHE 0 @@ -53,6 +58,7 @@ CASCADED 0 CASE 1 CATALOG_NAME 0 CHAIN 0 +CHALLENGE_RESPONSE 0 CHANGE 1 CHANGED 0 CHANNEL 0 @@ -181,6 +187,7 @@ EXPLAIN 1 EXPORT 0 EXTENDED 0 EXTENT_SIZE 0 +FACTOR 0 FAILED_LOGIN_ATTEMPTS 0 FALSE 1 FAST 0 @@ -190,6 +197,7 @@ FIELDS 0 FILE 0 FILE_BLOCK_SIZE 0 FILTER 0 +FINISH 0 FIRST 0 FIRST_VALUE 1 FIXED 0 @@ -209,6 +217,7 @@ FULL 0 FULLTEXT 1 FUNCTION 1 GENERAL 0 +GENERATE 0 GENERATED 1 GEOMCOLLECTION 0 GEOMETRY 0 @@ -216,6 +225,7 @@ GEOMETRYCOLLECTION 0 GET 1 GET_FORMAT 0 GET_MASTER_PUBLIC_KEY 0 +GET_SOURCE_PUBLIC_KEY 0 GLOBAL 0 GRANT 1 GRANTS 0 @@ -223,6 +233,8 @@ GROUP 1 GROUPING 1 GROUPS 1 GROUP_REPLICATION 0 +GTIDS 0 +GTID_ONLY 0 HANDLER 0 HASH 0 HAVING 1 @@ -246,7 +258,9 @@ INACTIVE 0 INDEX 1 INDEXES 0 INFILE 1 +INITIAL 0 INITIAL_SIZE 0 +INITIATE 0 INNER 1 INOUT 1 INSENSITIVE 1 @@ -261,6 +275,7 @@ INT3 1 INT4 1 INT8 1 INTEGER 1 +INTERSECT 1 INTERVAL 1 INTO 1 INVISIBLE 0 @@ -279,6 +294,7 @@ JSON 0 JSON_TABLE 1 JSON_VALUE 0 KEY 1 +KEYRING 0 KEYS 1 KEY_BLOCK_SIZE 0 KILL 1 @@ -307,6 +323,7 @@ LOCALTIMESTAMP 1 LOCK 1 LOCKED 0 LOCKS 0 +LOG 0 LOGFILE 0 LOGS 0 LONG 1 @@ -314,6 +331,7 @@ LONGBLOB 1 LONGTEXT 1 LOOP 1 LOW_PRIORITY 1 +MANUAL 0 MASTER 0 MASTER_AUTO_POSITION 0 MASTER_BIND 1 @@ -428,7 +446,9 @@ OVER 1 OWNER 0 PACK_KEYS 0 PAGE 0 +PARALLEL 0 PARSER 0 +PARSE_TREE 0 PARTIAL 0 PARTITION 1 PARTITIONING 0 @@ -462,6 +482,7 @@ PROFILE 0 PROFILES 0 PROXY 0 PURGE 1 +QUALIFY 0 QUARTER 0 QUERY 0 QUICK 0 @@ -481,6 +502,7 @@ REDUNDANT 0 REFERENCE 0 REFERENCES 1 REGEXP 1 +REGISTRATION 0 RELAY 0 RELAYLOG 0 RELAY_LOG_FILE 0 @@ -537,6 +559,7 @@ ROW_COUNT 0 ROW_FORMAT 0 ROW_NUMBER 1 RTREE 0 +S3 0 SAVEPOINT 0 SCHEDULE 0 SCHEMA 1 @@ -574,7 +597,33 @@ SOME 0 SONAME 0 SOUNDS 0 SOURCE 0 +SOURCE_AUTO_POSITION 0 +SOURCE_BIND 0 +SOURCE_COMPRESSION_ALGORITHMS 0 SOURCE_CONNECTION_AUTO_FAILOVER 0 +SOURCE_CONNECT_RETRY 0 +SOURCE_DELAY 0 +SOURCE_HEARTBEAT_PERIOD 0 +SOURCE_HOST 0 +SOURCE_LOG_FILE 0 +SOURCE_LOG_POS 0 +SOURCE_PASSWORD 0 +SOURCE_PORT 0 +SOURCE_PUBLIC_KEY_PATH 0 +SOURCE_RETRY_COUNT 0 +SOURCE_SSL 0 +SOURCE_SSL_CA 0 +SOURCE_SSL_CAPATH 0 +SOURCE_SSL_CERT 0 +SOURCE_SSL_CIPHER 0 +SOURCE_SSL_CRL 0 +SOURCE_SSL_CRLPATH 0 +SOURCE_SSL_KEY 0 +SOURCE_SSL_VERIFY_SERVER_CERT 0 +SOURCE_TLS_CIPHERSUITES 0 +SOURCE_TLS_VERSION 0 +SOURCE_USER 0 +SOURCE_ZSTD_COMPRESSION_LEVEL 0 SPATIAL 1 SPECIFIC 1 SQL 1 @@ -625,6 +674,7 @@ SWITCHES 0 SYSTEM 1 TABLE 1 TABLES 0 +TABLESAMPLE 0 TABLESPACE 0 TABLE_CHECKSUM 0 TABLE_NAME 0 @@ -665,10 +715,12 @@ UNION 1 UNIQUE 1 UNKNOWN 0 UNLOCK 1 +UNREGISTER 0 UNSIGNED 1 UNTIL 0 UPDATE 1 UPGRADE 0 +URL 0 USAGE 1 USE 1 USER 0 diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java index 0235393a2c9..1f4e33585f3 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessMySQLDatabaseMetadata.java @@ -67,18 +67,19 @@ public class VitessMySQLDatabaseMetadata extends VitessDatabaseMetaData implemen "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINEAR", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", - "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB", - "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", - "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "ON", "OPTIMIZE", - "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", "OUTFILE", "PRECISION", "PRIMARY", - "PROCEDURE", "PURGE", "RANGE", "READ", "READS", "READ_ONLY", "READ_WRITE", "REAL", - "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESTRICT", - "RETURN", "REVOKE", "RIGHT", "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", - "SENSITIVE", "SEPARATOR", "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", - "SQLEXCEPTION", "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", - "SQL_SMALL_RESULT", "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", - "TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", - "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE", "UTC_TIME", + "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MANUAL", "MATCH", + "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", + "MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", + "NUMERIC", "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", + "OUTFILE", "PARALLEL", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "QUALIFY", "RANGE", + "READ", "READS", "READ_ONLY", "READ_WRITE", "REAL", "REFERENCES", "REGEXP", "RELEASE", + "RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", + "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR", + "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", + "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", + "STARTING", "STRAIGHT_JOIN", "TABLE", "TABLESAMPLE", "TERMINATED", "THEN", "TINYBLOB", + "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", "UNIQUE", + "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "X509", "XOR", "YEAR_MONTH", "ZEROFILL"}; String[] sql92Keywords = new String[]{"ABSOLUTE", "EXEC", "OVERLAPS", "ACTION", "EXECUTE", From 71ccd6d7bd05c6095ace606934dea746c04ac429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Thu, 16 Jan 2025 16:46:15 +0100 Subject: [PATCH 40/66] sizegen: do not ignore type aliases (#17556) Signed-off-by: Vicent Marti --- go/mysql/collations/colldata/cached_size.go | 8 ++++++++ go/sqltypes/cached_size.go | 8 ++++++++ go/tools/sizegen/sizegen.go | 8 ++++++-- go/vt/proto/query/cached_size.go | 20 ++++++++++++++++++++ go/vt/proto/topodata/cached_size.go | 8 ++++++++ go/vt/proto/vttime/cached_size.go | 6 ++++++ 6 files changed, 56 insertions(+), 2 deletions(-) diff --git a/go/mysql/collations/colldata/cached_size.go b/go/mysql/collations/colldata/cached_size.go index b348baaaed8..190e1731651 100644 --- a/go/mysql/collations/colldata/cached_size.go +++ b/go/mysql/collations/colldata/cached_size.go @@ -19,6 +19,10 @@ package colldata import hack "vitess.io/vitess/go/hack" +type cachedObject interface { + CachedSize(alloc bool) int64 +} + func (cached *eightbitWildcard) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -59,6 +63,10 @@ func (cached *unicodeWildcard) CachedSize(alloc bool) int64 { if alloc { size += int64(48) } + // field charset vitess.io/vitess/go/mysql/collations/charset.Charset + if cc, ok := cached.charset.(cachedObject); ok { + size += cc.CachedSize(true) + } // field pattern []rune { size += hack.RuntimeAllocSize(int64(cap(cached.pattern)) * int64(4)) diff --git a/go/sqltypes/cached_size.go b/go/sqltypes/cached_size.go index 632c8249455..53bc407278d 100644 --- a/go/sqltypes/cached_size.go +++ b/go/sqltypes/cached_size.go @@ -37,6 +37,14 @@ func (cached *Result) CachedSize(alloc bool) int64 { // field Rows []vitess.io/vitess/go/sqltypes.Row { size += hack.RuntimeAllocSize(int64(cap(cached.Rows)) * int64(24)) + for _, elem := range cached.Rows { + { + size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(32)) + for _, elem := range elem { + size += elem.CachedSize(false) + } + } + } } // field SessionStateChanges string size += hack.RuntimeAllocSize(int64(len(cached.SessionStateChanges))) diff --git a/go/tools/sizegen/sizegen.go b/go/tools/sizegen/sizegen.go index 7ecd50e3d8c..17b155ad3f4 100644 --- a/go/tools/sizegen/sizegen.go +++ b/go/tools/sizegen/sizegen.go @@ -163,6 +163,8 @@ func (sizegen *sizegen) generateTyp(tt types.Type) { sizegen.generateKnownType(tt) case *types.Alias: sizegen.generateTyp(types.Unalias(tt)) + default: + panic(fmt.Sprintf("unhandled type: %v (%T)", tt, tt)) } } @@ -490,9 +492,11 @@ func (sizegen *sizegen) sizeStmtForType(fieldName *jen.Statement, field types.Ty // assume that function pointers do not allocate (although they might, if they're closures) return nil, 0 + case *types.Alias: + return sizegen.sizeStmtForType(fieldName, types.Unalias(node), alloc) + default: - log.Printf("unhandled type: %T", node) - return nil, 0 + panic(fmt.Sprintf("unhandled type: %v (%T)", node, node)) } } diff --git a/go/vt/proto/query/cached_size.go b/go/vt/proto/query/cached_size.go index 5b613317294..4436594681a 100644 --- a/go/vt/proto/query/cached_size.go +++ b/go/vt/proto/query/cached_size.go @@ -27,6 +27,10 @@ func (cached *BindVariable) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) @@ -48,6 +52,10 @@ func (cached *Field) CachedSize(alloc bool) int64 { if alloc { size += int64(160) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field Table string @@ -70,6 +78,10 @@ func (cached *QueryWarning) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Message string size += hack.RuntimeAllocSize(int64(len(cached.Message))) return size @@ -82,6 +94,10 @@ func (cached *Target) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Keyspace string size += hack.RuntimeAllocSize(int64(len(cached.Keyspace))) // field Shard string @@ -98,6 +114,10 @@ func (cached *Value) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) diff --git a/go/vt/proto/topodata/cached_size.go b/go/vt/proto/topodata/cached_size.go index 94b7fc6818c..3feead01bae 100644 --- a/go/vt/proto/topodata/cached_size.go +++ b/go/vt/proto/topodata/cached_size.go @@ -27,6 +27,10 @@ func (cached *KeyRange) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Start []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Start))) @@ -45,6 +49,10 @@ func (cached *ThrottledAppRule) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field ExpiresAt *vitess.io/vitess/go/vt/proto/vttime.Time diff --git a/go/vt/proto/vttime/cached_size.go b/go/vt/proto/vttime/cached_size.go index 62a6366ba3c..f2b69dbefae 100644 --- a/go/vt/proto/vttime/cached_size.go +++ b/go/vt/proto/vttime/cached_size.go @@ -17,6 +17,8 @@ limitations under the License. package vttime +import hack "vitess.io/vitess/go/hack" + func (cached *Time) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -25,5 +27,9 @@ func (cached *Time) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } + // field unknownFields google.golang.org/protobuf/runtime/protoimpl.UnknownFields + { + size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) + } return size } From eaaa2063ef870391bf17dbf3599978c4eba20868 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Fri, 17 Jan 2025 08:22:39 +0530 Subject: [PATCH 41/66] Add StalledDiskPrimary analysis and recovery to vtorc (#17470) Signed-off-by: Manan Gupta --- changelog/22.0/22.0.0/summary.md | 6 + go/flags/endtoend/vtcombo.txt | 3 + go/flags/endtoend/vtorc.txt | 1 + go/flags/endtoend/vttablet.txt | 3 + go/vt/vtorc/config/config.go | 16 +++ go/vt/vtorc/db/generate_base.go | 1 + go/vt/vtorc/inst/analysis.go | 2 + go/vt/vtorc/inst/analysis_dao.go | 10 +- go/vt/vtorc/inst/analysis_dao_test.go | 31 ++++- go/vt/vtorc/inst/instance.go | 1 + go/vt/vtorc/inst/instance_dao.go | 17 ++- go/vt/vtorc/inst/instance_dao_test.go | 42 +++--- go/vt/vtorc/logic/topology_recovery.go | 2 +- go/vt/vtorc/logic/topology_recovery_test.go | 15 ++ go/vt/vtorc/test/recovery_analysis.go | 2 + .../tabletmanager/disk_health_monitor.go | 131 ++++++++++++++++++ .../tabletmanager/disk_health_monitor_test.go | 103 ++++++++++++++ .../vttablet/tabletmanager/rpc_replication.go | 8 ++ go/vt/vttablet/tabletmanager/tm_init.go | 12 +- 19 files changed, 377 insertions(+), 29 deletions(-) create mode 100644 go/vt/vttablet/tabletmanager/disk_health_monitor.go create mode 100644 go/vt/vttablet/tabletmanager/disk_health_monitor_test.go diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index e63ffcc3547..2fb66ea8969 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -12,6 +12,7 @@ - **[Support for More Efficient JSON Replication](#efficient-json-replication)** - **[Support for LAST_INSERT_ID(x)](#last-insert-id)** - **[Support for Maximum Idle Connections in the Pool](#max-idle-connections)** + - **[Stalled Disk Recovery in VTOrc](#stall-disk-recovery)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -100,6 +101,11 @@ You can control idle connection retention for the query server’s query pool, s This feature ensures that, during traffic spikes, idle connections are available for faster responses, while minimizing overhead in low-traffic periods by limiting the number of idle connections retained. It helps strike a balance between performance, efficiency, and cost. +### Stalled Disk Recovery in VTOrc +VTOrc can now identify and recover from stalled disk errors. VTTablets test whether the disk is writable and they send this information in the full status output to VTOrc. If the disk is not writable on the primary tablet, VTOrc will attempt to recover the cluster by promoting a new primary. This is useful in scenarios where the disk is stalled and the primary vttablet is unable to accept writes because of it. + +To opt into this feature, `--enable-primary-disk-stalled-recovery` flag has to be specified on VTOrc, and `--disk-write-dir` flag has to be specified on the vttablets. `--disk-write-interval` and `--disk-write-timeout` flags can be used to configure the polling interval and timeout respectively. + ## Minor Changes #### VTTablet Flags diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 052c19ecaae..76c8e894347 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -102,6 +102,9 @@ Flags: --ddl_strategy string Set default strategy for DDL statements. Override with @@ddl_strategy session variable (default "direct") --default_tablet_type topodatapb.TabletType The default tablet type to set for queries, when one is not explicitly selected. (default PRIMARY) --degraded_threshold duration replication lag after which a replica is considered degraded (default 30s) + --disk-write-dir string if provided, tablet will attempt to write a file to this directory to check if the disk is stalled + --disk-write-interval duration how often to write to the disk to check whether it is stalled (default 5s) + --disk-write-timeout duration if writes exceed this duration, the disk is considered stalled (default 30s) --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-consolidator Synonym to -enable_consolidator (default true) --enable-consolidator-replicas Synonym to -enable_consolidator_replicas diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index c2799a72dc1..ca8083709e5 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -33,6 +33,7 @@ Flags: --config-type string Config file type (omit to infer config type from file extension). --consul_auth_static_file string JSON File to read the topos/tokens from. --emit_stats If set, emit stats to push-based monitoring and stats backends + --enable-primary-disk-stalled-recovery Whether VTOrc should detect a stalled disk on the primary and failover --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index e2b0c30db7f..955823f7322 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -133,6 +133,9 @@ Flags: --dba_idle_timeout duration Idle timeout for dba connections (default 1m0s) --dba_pool_size int Size of the connection pool for dba connections (default 20) --degraded_threshold duration replication lag after which a replica is considered degraded (default 30s) + --disk-write-dir string if provided, tablet will attempt to write a file to this directory to check if the disk is stalled + --disk-write-interval duration how often to write to the disk to check whether it is stalled (default 5s) + --disk-write-timeout duration if writes exceed this duration, the disk is considered stalled (default 30s) --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-consolidator Synonym to -enable_consolidator (default true) --enable-consolidator-replicas Synonym to -enable_consolidator_replicas diff --git a/go/vt/vtorc/config/config.go b/go/vt/vtorc/config/config.go index cafff5acce8..db367673aeb 100644 --- a/go/vt/vtorc/config/config.go +++ b/go/vt/vtorc/config/config.go @@ -174,6 +174,15 @@ var ( Dynamic: true, }, ) + + enablePrimaryDiskStalledRecovery = viperutil.Configure( + "enable-primary-disk-stalled-recovery", + viperutil.Options[bool]{ + FlagName: "enable-primary-disk-stalled-recovery", + Default: false, + Dynamic: true, + }, + ) ) func init() { @@ -197,6 +206,7 @@ func registerFlags(fs *pflag.FlagSet) { fs.Duration("recovery-poll-duration", recoveryPollDuration.Default(), "Timer duration on which VTOrc polls its database to run a recovery") fs.Bool("allow-emergency-reparent", ersEnabled.Default(), "Whether VTOrc should be allowed to run emergency reparent operation when it detects a dead primary") fs.Bool("change-tablets-with-errant-gtid-to-drained", convertTabletsWithErrantGTIDs.Default(), "Whether VTOrc should be changing the type of tablets with errant GTIDs to DRAINED") + fs.Bool("enable-primary-disk-stalled-recovery", enablePrimaryDiskStalledRecovery.Default(), "Whether VTOrc should detect a stalled disk on the primary and failover") viperutil.BindFlags(fs, instancePollTime, @@ -214,6 +224,7 @@ func registerFlags(fs *pflag.FlagSet) { recoveryPollDuration, ersEnabled, convertTabletsWithErrantGTIDs, + enablePrimaryDiskStalledRecovery, ) } @@ -332,6 +343,11 @@ func SetConvertTabletWithErrantGTIDs(val bool) { convertTabletsWithErrantGTIDs.Set(val) } +// GetStalledDiskPrimaryRecovery reports whether VTOrc is allowed to check for and recovery stalled disk problems. +func GetStalledDiskPrimaryRecovery() bool { + return enablePrimaryDiskStalledRecovery.Get() +} + // MarkConfigurationLoaded is called once configuration has first been loaded. // Listeners on ConfigurationLoaded will get a notification func MarkConfigurationLoaded() { diff --git a/go/vt/vtorc/db/generate_base.go b/go/vt/vtorc/db/generate_base.go index 21375fb8eb3..8baa9a12476 100644 --- a/go/vt/vtorc/db/generate_base.go +++ b/go/vt/vtorc/db/generate_base.go @@ -105,6 +105,7 @@ CREATE TABLE database_instance ( semi_sync_primary_status TINYint NOT NULL DEFAULT 0, semi_sync_replica_status TINYint NOT NULL DEFAULT 0, semi_sync_primary_clients int NOT NULL DEFAULT 0, + is_disk_stalled TINYint NOT NULL DEFAULT 0, PRIMARY KEY (alias) )`, ` diff --git a/go/vt/vtorc/inst/analysis.go b/go/vt/vtorc/inst/analysis.go index fa2e1a4ec95..6a800e5ee0b 100644 --- a/go/vt/vtorc/inst/analysis.go +++ b/go/vt/vtorc/inst/analysis.go @@ -56,6 +56,7 @@ const ( LockedSemiSyncPrimaryHypothesis AnalysisCode = "LockedSemiSyncPrimaryHypothesis" LockedSemiSyncPrimary AnalysisCode = "LockedSemiSyncPrimary" ErrantGTIDDetected AnalysisCode = "ErrantGTIDDetected" + PrimaryDiskStalled AnalysisCode = "PrimaryDiskStalled" ) type StructureAnalysisCode string @@ -129,6 +130,7 @@ type ReplicationAnalysis struct { MaxReplicaGTIDMode string MaxReplicaGTIDErrant string IsReadOnly bool + IsDiskStalled bool } func (replicationAnalysis *ReplicationAnalysis) MarshalJSON() ([]byte, error) { diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index 7837955c541..d487973b0f0 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -79,7 +79,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna vitess_keyspace.durability_policy AS durability_policy, vitess_shard.primary_timestamp AS shard_primary_term_timestamp, primary_instance.read_only AS read_only, - MIN(primary_instance.gtid_errant) AS gtid_errant, + MIN(primary_instance.gtid_errant) AS gtid_errant, MIN(primary_instance.alias) IS NULL AS is_invalid, MIN(primary_instance.binary_log_file) AS binary_log_file, MIN(primary_instance.binary_log_pos) AS binary_log_pos, @@ -233,7 +233,8 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna COUNT( DISTINCT case when replica_instance.log_bin AND replica_instance.log_replica_updates then replica_instance.major_version else NULL end - ) AS count_distinct_logging_major_versions + ) AS count_distinct_logging_major_versions, + primary_instance.is_disk_stalled != 0 AS is_disk_stalled FROM vitess_tablet JOIN vitess_keyspace ON ( @@ -354,6 +355,7 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna a.HeartbeatInterval = m.GetFloat64("heartbeat_interval") a.IsReadOnly = m.GetUint("read_only") == 1 + a.IsDiskStalled = m.GetBool("is_disk_stalled") if !a.LastCheckValid { analysisMessage := fmt.Sprintf("analysis: Alias: %+v, Keyspace: %+v, Shard: %+v, IsPrimary: %+v, LastCheckValid: %+v, LastCheckPartialSuccess: %+v, CountReplicas: %+v, CountValidReplicas: %+v, CountValidReplicatingReplicas: %+v, CountLaggingReplicas: %+v, CountDelayedReplicas: %+v", @@ -401,6 +403,10 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna } else if isInvalid { a.Analysis = InvalidReplica a.Description = "VTOrc hasn't been able to reach the replica even once since restart/shutdown" + } else if a.IsClusterPrimary && !a.LastCheckValid && a.IsDiskStalled { + a.Analysis = PrimaryDiskStalled + a.Description = "Primary has a stalled disk" + ca.hasClusterwideAction = true } else if a.IsClusterPrimary && !a.LastCheckValid && a.CountReplicas == 0 { a.Analysis = DeadPrimaryWithoutReplicas a.Description = "Primary cannot be reached by vtorc and has no replica" diff --git a/go/vt/vtorc/inst/analysis_dao_test.go b/go/vt/vtorc/inst/analysis_dao_test.go index ae4f7279403..baa1121b776 100644 --- a/go/vt/vtorc/inst/analysis_dao_test.go +++ b/go/vt/vtorc/inst/analysis_dao_test.go @@ -34,10 +34,10 @@ var ( // The initialSQL is a set of insert commands copied from a dump of an actual running VTOrc instances. The relevant insert commands are here. // This is a dump taken from a test running 4 tablets, zone1-101 is the primary, zone1-100 is a replica, zone1-112 is a rdonly and zone2-200 is a cross-cell replica. initialSQL = []string{ - `INSERT INTO database_instance VALUES('zone1-0000000112','localhost',6747,'2022-12-28 07:26:04','2022-12-28 07:26:04',213696377,'8.0.31','ROW',1,1,'vt-0000000112-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000112-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-9240-92a06c3be3c2','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10816929,0,0,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-9240-92a06c3be3c2',1,1,'',1000000000000000000,1,0,0,0);`, - `INSERT INTO database_instance VALUES('zone1-0000000100','localhost',6711,'2022-12-28 07:26:04','2022-12-28 07:26:04',1094500338,'8.0.31','ROW',1,1,'vt-0000000100-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000100-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-acf8-d6b0ef9f4eaa','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10103920,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-acf8-d6b0ef9f4eaa',1,1,'',1000000000000000000,1,0,1,0);`, - `INSERT INTO database_instance VALUES('zone1-0000000101','localhost',6714,'2022-12-28 07:26:04','2022-12-28 07:26:04',390954723,'8.0.31','ROW',1,1,'vt-0000000101-bin.000001',15583,'',0,0,0,0,0,'',0,'',0,NULL,NULL,0,'','',0,'',0,0,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a4cc4-8680-11ed-a104-47706090afbd','2022-12-28 07:26:04','',0,0,0,'Homebrew','8.0','FULL',11366095,1,1,'ON',1,'','','729a4cc4-8680-11ed-a104-47706090afbd',-1,-1,'',1000000000000000000,1,1,0,2);`, - `INSERT INTO database_instance VALUES('zone2-0000000200','localhost',6756,'2022-12-28 07:26:05','2022-12-28 07:26:05',444286571,'8.0.31','ROW',1,1,'vt-0000000200-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000200-relay-bin.000002',15815,1,0,'zone2','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a497c-8680-11ed-8ad4-3f51d747db75','2022-12-28 07:26:05','',1,0,0,'Homebrew','8.0','FULL',10443112,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a497c-8680-11ed-8ad4-3f51d747db75',1,1,'',1000000000000000000,1,0,1,0);`, + `INSERT INTO database_instance VALUES('zone1-0000000112','localhost',6747,'2022-12-28 07:26:04','2022-12-28 07:26:04',213696377,'8.0.31','ROW',1,1,'vt-0000000112-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000112-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-9240-92a06c3be3c2','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10816929,0,0,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-9240-92a06c3be3c2',1,1,'',1000000000000000000,1,0,0,0,false);`, + `INSERT INTO database_instance VALUES('zone1-0000000100','localhost',6711,'2022-12-28 07:26:04','2022-12-28 07:26:04',1094500338,'8.0.31','ROW',1,1,'vt-0000000100-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000100-relay-bin.000002',15815,1,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a5138-8680-11ed-acf8-d6b0ef9f4eaa','2022-12-28 07:26:04','',1,0,0,'Homebrew','8.0','FULL',10103920,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a5138-8680-11ed-acf8-d6b0ef9f4eaa',1,1,'',1000000000000000000,1,0,1,0,false);`, + `INSERT INTO database_instance VALUES('zone1-0000000101','localhost',6714,'2022-12-28 07:26:04','2022-12-28 07:26:04',390954723,'8.0.31','ROW',1,1,'vt-0000000101-bin.000001',15583,'',0,0,0,0,0,'',0,'',0,NULL,NULL,0,'','',0,'',0,0,0,'zone1','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a4cc4-8680-11ed-a104-47706090afbd','2022-12-28 07:26:04','',0,0,0,'Homebrew','8.0','FULL',11366095,1,1,'ON',1,'','','729a4cc4-8680-11ed-a104-47706090afbd',-1,-1,'',1000000000000000000,1,1,0,2,false);`, + `INSERT INTO database_instance VALUES('zone2-0000000200','localhost',6756,'2022-12-28 07:26:05','2022-12-28 07:26:05',444286571,'8.0.31','ROW',1,1,'vt-0000000200-bin.000001',15963,'localhost',6714,8,4.0,1,1,'vt-0000000101-bin.000001',15583,'vt-0000000101-bin.000001',15583,0,0,1,'','',1,'vt-0000000200-relay-bin.000002',15815,1,0,'zone2','',0,0,0,1,'729a4cc4-8680-11ed-a104-47706090afbd:1-54','729a497c-8680-11ed-8ad4-3f51d747db75','2022-12-28 07:26:05','',1,0,0,'Homebrew','8.0','FULL',10443112,0,1,'ON',1,'729a4cc4-8680-11ed-a104-47706090afbd','','729a4cc4-8680-11ed-a104-47706090afbd,729a497c-8680-11ed-8ad4-3f51d747db75',1,1,'',1000000000000000000,1,0,1,0,false);`, `INSERT INTO vitess_tablet VALUES('zone1-0000000100','localhost',6711,'ks','0','zone1',2,'0001-01-01 00:00:00+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3130307d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363731307d20706f72745f6d61703a7b6b65793a227674222076616c75653a363730397d206b657973706163653a226b73222073686172643a22302220747970653a5245504c494341206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a363731312064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, `INSERT INTO vitess_tablet VALUES('zone1-0000000101','localhost',6714,'ks','0','zone1',1,'2022-12-28 07:23:25.129898+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3130317d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363731337d20706f72745f6d61703a7b6b65793a227674222076616c75653a363731327d206b657973706163653a226b73222073686172643a22302220747970653a5052494d415259206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a36373134207072696d6172795f7465726d5f73746172745f74696d653a7b7365636f6e64733a31363732323132323035206e616e6f7365636f6e64733a3132393839383030307d2064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, `INSERT INTO vitess_tablet VALUES('zone1-0000000112','localhost',6747,'ks','0','zone1',3,'0001-01-01 00:00:00+00:00',X'616c6961733a7b63656c6c3a227a6f6e653122207569643a3131327d20686f73746e616d653a226c6f63616c686f73742220706f72745f6d61703a7b6b65793a2267727063222076616c75653a363734367d20706f72745f6d61703a7b6b65793a227674222076616c75653a363734357d206b657973706163653a226b73222073686172643a22302220747970653a52444f4e4c59206d7973716c5f686f73746e616d653a226c6f63616c686f737422206d7973716c5f706f72743a363734372064625f7365727665725f76657273696f6e3a22382e302e3331222064656661756c745f636f6e6e5f636f6c6c6174696f6e3a3435');`, @@ -96,6 +96,29 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { keyspaceWanted: "ks", shardWanted: "0", codeWanted: PrimaryTabletDeleted, + }, { + name: "StalledDiskPrimary", + info: []*test.InfoForRecoveryAnalysis{{ + TabletInfo: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 100}, + Hostname: "localhost", + Keyspace: "ks", + Shard: "0", + Type: topodatapb.TabletType_PRIMARY, + MysqlHostname: "localhost", + MysqlPort: 6709, + }, + DurabilityPolicy: "none", + LastCheckValid: 0, + CountReplicas: 4, + CountValidReplicas: 4, + CountValidReplicatingReplicas: 0, + IsPrimary: 1, + IsStalledDisk: 1, + }}, + keyspaceWanted: "ks", + shardWanted: "0", + codeWanted: PrimaryDiskStalled, }, { name: "DeadPrimary", info: []*test.InfoForRecoveryAnalysis{{ diff --git a/go/vt/vtorc/inst/instance.go b/go/vt/vtorc/inst/instance.go index fef1e90acce..b7b097bb14d 100644 --- a/go/vt/vtorc/inst/instance.go +++ b/go/vt/vtorc/inst/instance.go @@ -91,6 +91,7 @@ type Instance struct { IsUpToDate bool IsRecentlyChecked bool SecondsSinceLastSeen sql.NullInt64 + StalledDisk bool AllowTLS bool diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index 9198514d6ed..f92a15079dd 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -175,6 +175,7 @@ func ReadTopologyInstanceBufferable(tabletAlias string, latency *stopwatch.Named var tablet *topodatapb.Tablet var fs *replicationdatapb.FullStatus readingStartTime := time.Now() + stalledDisk := false instance := NewInstance() instanceFound := false partialSuccess := false @@ -205,6 +206,9 @@ func ReadTopologyInstanceBufferable(tabletAlias string, latency *stopwatch.Named fs, err = fullStatus(tabletAlias) if err != nil { + if config.GetStalledDiskPrimaryRecovery() && strings.Contains(err.Error(), "stalled disk") { + stalledDisk = true + } goto Cleanup } partialSuccess = true // We at least managed to read something from the server. @@ -381,9 +385,10 @@ Cleanup: // Something is wrong, could be network-wise. Record that we // tried to check the instance. last_attempted_check is also - // updated on success by writeInstance. + // updated on success by writeInstance. If the reason is a + // stalled disk, we can record that as well. latency.Start("backend") - _ = UpdateInstanceLastChecked(tabletAlias, partialSuccess) + _ = UpdateInstanceLastChecked(tabletAlias, partialSuccess, stalledDisk) latency.Stop("backend") return nil, err } @@ -874,6 +879,7 @@ func mkInsertForInstances(instances []*Instance, instanceWasActuallyFound bool, "semi_sync_primary_clients", "semi_sync_replica_status", "last_discovery_latency", + "is_disk_stalled", } values := make([]string, len(columns)) @@ -953,6 +959,7 @@ func mkInsertForInstances(instances []*Instance, instanceWasActuallyFound bool, args = append(args, instance.SemiSyncPrimaryClients) args = append(args, instance.SemiSyncReplicaStatus) args = append(args, instance.LastDiscoveryLatency.Nanoseconds()) + args = append(args, instance.StalledDisk) } sql, err := mkInsert("database_instance", columns, values, len(instances), insertIgnore) @@ -998,16 +1005,18 @@ func WriteInstance(instance *Instance, instanceWasActuallyFound bool, lastError // UpdateInstanceLastChecked updates the last_check timestamp in the vtorc backed database // for a given instance -func UpdateInstanceLastChecked(tabletAlias string, partialSuccess bool) error { +func UpdateInstanceLastChecked(tabletAlias string, partialSuccess bool, stalledDisk bool) error { writeFunc := func() error { _, err := db.ExecVTOrc(`UPDATE database_instance SET last_checked = DATETIME('now'), - last_check_partial_success = ? + last_check_partial_success = ?, + is_disk_stalled = ? WHERE alias = ? `, partialSuccess, + stalledDisk, tabletAlias, ) if err != nil { diff --git a/go/vt/vtorc/inst/instance_dao_test.go b/go/vt/vtorc/inst/instance_dao_test.go index 1a14041450c..c3b99455741 100644 --- a/go/vt/vtorc/inst/instance_dao_test.go +++ b/go/vt/vtorc/inst/instance_dao_test.go @@ -64,13 +64,13 @@ func TestMkInsertSingle(t *testing.T) { version, major_version, version_comment, binlog_server, read_only, binlog_format, binlog_row_image, log_bin, log_replica_updates, binary_log_file, binary_log_pos, source_host, source_port, replica_net_timeout, heartbeat_interval, replica_sql_running, replica_io_running, replication_sql_thread_state, replication_io_thread_state, has_replication_filters, supports_oracle_gtid, oracle_gtid, source_uuid, ancestry_uuid, executed_gtid_set, gtid_mode, gtid_purged, gtid_errant, - source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, last_seen) + source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, is_disk_stalled, last_seen) VALUES - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) ` a1 := `zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, - false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0,` + false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false,` sql1, args1, err := mkInsertForInstances(instances[:1], false, true) require.NoError(t, err) @@ -87,16 +87,16 @@ func TestMkInsertThree(t *testing.T) { version, major_version, version_comment, binlog_server, read_only, binlog_format, binlog_row_image, log_bin, log_replica_updates, binary_log_file, binary_log_pos, source_host, source_port, replica_net_timeout, heartbeat_interval, replica_sql_running, replica_io_running, replication_sql_thread_state, replication_io_thread_state, has_replication_filters, supports_oracle_gtid, oracle_gtid, source_uuid, ancestry_uuid, executed_gtid_set, gtid_mode, gtid_purged, gtid_errant, - source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, last_seen) + source_log_file, read_source_log_pos, relay_source_log_file, exec_source_log_pos, relay_log_file, relay_log_pos, last_sql_error, last_io_error, replication_lag_seconds, replica_lag_seconds, sql_delay, data_center, region, physical_environment, replication_depth, is_co_primary, has_replication_credentials, allow_tls, semi_sync_enforced, semi_sync_primary_enabled, semi_sync_primary_timeout, semi_sync_primary_wait_for_replica_count, semi_sync_replica_enabled, semi_sync_primary_status, semi_sync_primary_clients, semi_sync_replica_status, last_discovery_latency, is_disk_stalled, last_seen) VALUES - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), - (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')), + (?, ?, ?, DATETIME('now'), DATETIME('now'), 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATETIME('now')) ` a3 := ` - zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, - zone1-i720, i720, 3306, 720, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 20, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, - zone1-i730, i730, 3306, 730, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 30, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, + zone1-i710, i710, 3306, 710, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 10, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, + zone1-i720, i720, 3306, 720, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 20, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, + zone1-i730, i730, 3306, 730, , 5.6.7, 5.6, MySQL, false, false, STATEMENT, FULL, false, false, , 0, , 0, 0, 0, false, false, 0, 0, false, false, false, , , , , , , , 0, mysql.000007, 30, , 0, , , {0 false}, {0 false}, 0, , , , 0, false, false, false, false, false, 0, 0, false, false, 0, false, 0, false, ` sql3, args3, err := mkInsertForInstances(instances[:3], true, true) @@ -483,9 +483,9 @@ func TestReadOutdatedInstanceKeys(t *testing.T) { tabletAliases, err := ReadOutdatedInstanceKeys() - errInDataCollection := db.QueryVTOrcRowsMap(`select alias, -last_checked, -last_attempted_check, + errInDataCollection := db.QueryVTOrcRowsMap(`select alias, +last_checked, +last_attempted_check, ROUND((JULIANDAY(DATETIME('now')) - JULIANDAY(last_checked)) * 86400) AS difference, last_attempted_check <= last_checked as use1, last_checked < DATETIME('now', '-1500 second') as is_outdated1, @@ -507,22 +507,32 @@ func TestUpdateInstanceLastChecked(t *testing.T) { name string tabletAlias string partialSuccess bool + stalledDisk bool conditionToCheck string }{ { name: "Verify updated last checked", tabletAlias: "zone1-0000000100", partialSuccess: false, - conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false", + stalledDisk: false, + conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false and is_disk_stalled = false", }, { name: "Verify partial success", tabletAlias: "zone1-0000000100", partialSuccess: true, - conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = true", + stalledDisk: false, + conditionToCheck: "last_checked >= datetime('now', '-30 second') and last_check_partial_success = true and is_disk_stalled = false", + }, { + name: "Verify stalled disk", + tabletAlias: "zone1-0000000100", + partialSuccess: false, + stalledDisk: true, + conditionToCheck: "last_checked >= DATETIME('now', '-30 second') and last_check_partial_success = false and is_disk_stalled = true", }, { name: "Verify no error on unknown tablet", tabletAlias: "unknown tablet", partialSuccess: true, + stalledDisk: true, }, } @@ -537,7 +547,7 @@ func TestUpdateInstanceLastChecked(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := UpdateInstanceLastChecked(tt.tabletAlias, tt.partialSuccess) + err := UpdateInstanceLastChecked(tt.tabletAlias, tt.partialSuccess, tt.stalledDisk) require.NoError(t, err) if tt.conditionToCheck != "" { diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index 0d0bbff5b53..ab41d1fa988 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -285,7 +285,7 @@ func checkAndRecoverGenericProblem(ctx context.Context, analysisEntry *inst.Repl func getCheckAndRecoverFunctionCode(analysisCode inst.AnalysisCode, tabletAlias string) recoveryFunction { switch analysisCode { // primary - case inst.DeadPrimary, inst.DeadPrimaryAndSomeReplicas: + case inst.DeadPrimary, inst.DeadPrimaryAndSomeReplicas, inst.PrimaryDiskStalled: // If ERS is disabled, we have no way of repairing the cluster. if !config.ERSEnabled() { log.Infof("VTOrc not configured to run ERS, skipping recovering %v", analysisCode) diff --git a/go/vt/vtorc/logic/topology_recovery_test.go b/go/vt/vtorc/logic/topology_recovery_test.go index f7658060b95..ca164d78836 100644 --- a/go/vt/vtorc/logic/topology_recovery_test.go +++ b/go/vt/vtorc/logic/topology_recovery_test.go @@ -42,6 +42,11 @@ func TestAnalysisEntriesHaveSameRecovery(t *testing.T) { prevAnalysisCode: inst.DeadPrimary, newAnalysisCode: inst.DeadPrimaryAndSomeReplicas, shouldBeEqual: true, + }, { + // DeadPrimary and StalledDiskPrimary have the same recovery + prevAnalysisCode: inst.DeadPrimary, + newAnalysisCode: inst.PrimaryDiskStalled, + shouldBeEqual: true, }, { // DeadPrimary and PrimaryTabletDeleted are different recoveries. prevAnalysisCode: inst.DeadPrimary, @@ -215,6 +220,16 @@ func TestGetCheckAndRecoverFunctionCode(t *testing.T) { ersEnabled: false, analysisCode: inst.DeadPrimary, wantRecoveryFunction: noRecoveryFunc, + }, { + name: "StalledDiskPrimary with ERS enabled", + ersEnabled: true, + analysisCode: inst.PrimaryDiskStalled, + wantRecoveryFunction: recoverDeadPrimaryFunc, + }, { + name: "StalledDiskPrimary with ERS disabled", + ersEnabled: false, + analysisCode: inst.PrimaryDiskStalled, + wantRecoveryFunction: noRecoveryFunc, }, { name: "PrimaryTabletDeleted with ERS enabled", ersEnabled: true, diff --git a/go/vt/vtorc/test/recovery_analysis.go b/go/vt/vtorc/test/recovery_analysis.go index 218a679bdb0..bb6e4132243 100644 --- a/go/vt/vtorc/test/recovery_analysis.go +++ b/go/vt/vtorc/test/recovery_analysis.go @@ -80,6 +80,7 @@ type InfoForRecoveryAnalysis struct { MaxReplicaGTIDMode string MaxReplicaGTIDErrant string ReadOnly uint + IsStalledDisk uint } func (info *InfoForRecoveryAnalysis) ConvertToRowMap() sqlutils.RowMap { @@ -145,6 +146,7 @@ func (info *InfoForRecoveryAnalysis) ConvertToRowMap() sqlutils.RowMap { rowMap["semi_sync_replica_enabled"] = sqlutils.CellData{String: fmt.Sprintf("%v", info.SemiSyncReplicaEnabled), Valid: true} res, _ := prototext.Marshal(info.TabletInfo) rowMap["tablet_info"] = sqlutils.CellData{String: string(res), Valid: true} + rowMap["is_disk_stalled"] = sqlutils.CellData{String: fmt.Sprintf("%v", info.IsStalledDisk), Valid: true} return rowMap } diff --git a/go/vt/vttablet/tabletmanager/disk_health_monitor.go b/go/vt/vttablet/tabletmanager/disk_health_monitor.go new file mode 100644 index 00000000000..e35bc662a12 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/disk_health_monitor.go @@ -0,0 +1,131 @@ +package tabletmanager + +import ( + "context" + "os" + "path" + "strconv" + "sync" + "time" +) + +type DiskHealthMonitor interface { + // IsDiskStalled returns true if the disk is stalled or rejecting writes. + IsDiskStalled() bool +} + +func newDiskHealthMonitor(ctx context.Context) DiskHealthMonitor { + if stalledDiskWriteDir == "" { + return newNoopDiskHealthMonitor() + } + + return newPollingDiskHealthMonitor(ctx, attemptFileWrite, stalledDiskWriteInterval, stalledDiskWriteTimeout) +} + +type writeFunction func() error + +func attemptFileWrite() error { + file, err := os.Create(path.Join(stalledDiskWriteDir, ".stalled_disk_check")) + if err != nil { + return err + } + _, err = file.WriteString(strconv.FormatInt(time.Now().UnixNano(), 10)) + if err != nil { + return err + } + err = file.Sync() + if err != nil { + return err + } + return file.Close() +} + +type pollingDiskHealthMonitor struct { + stalledMutex sync.RWMutex + stalled bool + writeInProgressMutex sync.RWMutex + writeInProgress bool + writeFunc writeFunction + pollingInterval time.Duration + writeTimeout time.Duration +} + +var _ DiskHealthMonitor = &pollingDiskHealthMonitor{} + +func newPollingDiskHealthMonitor(ctx context.Context, writeFunc writeFunction, pollingInterval, writeTimeout time.Duration) *pollingDiskHealthMonitor { + fs := &pollingDiskHealthMonitor{ + stalledMutex: sync.RWMutex{}, + stalled: false, + writeInProgressMutex: sync.RWMutex{}, + writeInProgress: false, + writeFunc: writeFunc, + pollingInterval: pollingInterval, + writeTimeout: writeTimeout, + } + go fs.poll(ctx) + return fs +} + +func (fs *pollingDiskHealthMonitor) poll(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-time.After(fs.pollingInterval): + if fs.isWriteInProgress() { + continue + } + + ch := make(chan error, 1) + go func() { + fs.setIsWriteInProgress(true) + err := fs.writeFunc() + fs.setIsWriteInProgress(false) + ch <- err + }() + + select { + case <-time.After(fs.writeTimeout): + fs.setIsDiskStalled(true) + case err := <-ch: + fs.setIsDiskStalled(err != nil) + } + } + } +} + +func (fs *pollingDiskHealthMonitor) IsDiskStalled() bool { + fs.stalledMutex.RLock() + defer fs.stalledMutex.RUnlock() + return fs.stalled +} + +func (fs *pollingDiskHealthMonitor) setIsDiskStalled(isStalled bool) { + fs.stalledMutex.Lock() + defer fs.stalledMutex.Unlock() + fs.stalled = isStalled +} + +func (fs *pollingDiskHealthMonitor) isWriteInProgress() bool { + fs.writeInProgressMutex.RLock() + defer fs.writeInProgressMutex.RUnlock() + return fs.writeInProgress +} + +func (fs *pollingDiskHealthMonitor) setIsWriteInProgress(isInProgress bool) { + fs.writeInProgressMutex.Lock() + defer fs.writeInProgressMutex.Unlock() + fs.writeInProgress = isInProgress +} + +type noopDiskHealthMonitor struct{} + +var _ DiskHealthMonitor = &noopDiskHealthMonitor{} + +func newNoopDiskHealthMonitor() DiskHealthMonitor { + return &noopDiskHealthMonitor{} +} + +func (fs *noopDiskHealthMonitor) IsDiskStalled() bool { + return false +} diff --git a/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go b/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go new file mode 100644 index 00000000000..68930f3061d --- /dev/null +++ b/go/vt/vttablet/tabletmanager/disk_health_monitor_test.go @@ -0,0 +1,103 @@ +package tabletmanager + +import ( + "context" + "errors" + "sync" + "testing" + "time" +) + +func TestDiskHealthMonitor_noStall(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 5 { + t.Fatalf("expected 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); isStalled { + t.Fatalf("expected isStalled to be false") + } +} + +func TestDiskHealthMonitor_stallAndRecover(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{sequencedWriteFunctions: []writeFunction{delayedWriteFunction(10*time.Millisecond, nil), delayedWriteFunction(300*time.Millisecond, nil)}} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 2 { + t.Fatalf("expected 2 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); !isStalled { + t.Fatalf("expected isStalled to be true") + } + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls < 5 { + t.Fatalf("expected at least 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); isStalled { + t.Fatalf("expected isStalled to be false") + } +} + +func TestDiskHealthMonitor_stallDetected(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockFileWriter := &sequencedMockWriter{defaultWriteFunction: delayedWriteFunction(10*time.Millisecond, errors.New("test error"))} + diskHealthMonitor := newPollingDiskHealthMonitor(ctx, mockFileWriter.mockWriteFunction, 50*time.Millisecond, 25*time.Millisecond) + + time.Sleep(300 * time.Millisecond) + if totalCreateCalls := mockFileWriter.getTotalCreateCalls(); totalCreateCalls != 5 { + t.Fatalf("expected 5 calls to createFile, got %d", totalCreateCalls) + } + if isStalled := diskHealthMonitor.IsDiskStalled(); !isStalled { + t.Fatalf("expected isStalled to be true") + } +} + +type sequencedMockWriter struct { + defaultWriteFunction writeFunction + sequencedWriteFunctions []writeFunction + + totalCreateCalls int + totalCreateCallsMutex sync.RWMutex +} + +func (smw *sequencedMockWriter) mockWriteFunction() error { + functionIndex := smw.getTotalCreateCalls() + smw.incrementTotalCreateCalls() + + if functionIndex >= len(smw.sequencedWriteFunctions) { + if smw.defaultWriteFunction != nil { + return smw.defaultWriteFunction() + } + return delayedWriteFunction(10*time.Millisecond, nil)() + } + + return smw.sequencedWriteFunctions[functionIndex]() +} + +func (smw *sequencedMockWriter) incrementTotalCreateCalls() { + smw.totalCreateCallsMutex.Lock() + defer smw.totalCreateCallsMutex.Unlock() + smw.totalCreateCalls += 1 +} + +func (smw *sequencedMockWriter) getTotalCreateCalls() int { + smw.totalCreateCallsMutex.RLock() + defer smw.totalCreateCallsMutex.RUnlock() + return smw.totalCreateCalls +} + +func delayedWriteFunction(delay time.Duration, err error) writeFunction { + return func() error { + time.Sleep(delay) + return err + } +} diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 47794e92b9a..b27b25d87c6 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -18,6 +18,7 @@ package tabletmanager import ( "context" + "errors" "fmt" "runtime" "strings" @@ -60,6 +61,13 @@ func (tm *TabletManager) FullStatus(ctx context.Context) (*replicationdatapb.Ful if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { return nil, err } + + // Return error if the disk is stalled or rejecting writes. + // Noop by default, must be enabled with the flag "disk-write-dir". + if tm.dhMonitor.IsDiskStalled() { + return nil, errors.New("stalled disk") + } + // Server ID - "select @@global.server_id" serverID, err := tm.MysqlDaemon.GetServerID(ctx) if err != nil { diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index fbef04de357..c22ea0a6e51 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -95,8 +95,11 @@ var ( skipBuildInfoTags = "/.*/" initTags flagutil.StringMapValue - initTimeout = 1 * time.Minute - mysqlShutdownTimeout = mysqlctl.DefaultShutdownTimeout + initTimeout = 1 * time.Minute + mysqlShutdownTimeout = mysqlctl.DefaultShutdownTimeout + stalledDiskWriteDir = "" + stalledDiskWriteTimeout = 30 * time.Second + stalledDiskWriteInterval = 5 * time.Second ) func registerInitFlags(fs *pflag.FlagSet) { @@ -109,6 +112,9 @@ func registerInitFlags(fs *pflag.FlagSet) { fs.Var(&initTags, "init_tags", "(init parameter) comma separated list of key:value pairs used to tag the tablet") fs.DurationVar(&initTimeout, "init_timeout", initTimeout, "(init parameter) timeout to use for the init phase.") fs.DurationVar(&mysqlShutdownTimeout, "mysql-shutdown-timeout", mysqlShutdownTimeout, "timeout to use when MySQL is being shut down.") + fs.StringVar(&stalledDiskWriteDir, "disk-write-dir", stalledDiskWriteDir, "if provided, tablet will attempt to write a file to this directory to check if the disk is stalled") + fs.DurationVar(&stalledDiskWriteTimeout, "disk-write-timeout", stalledDiskWriteTimeout, "if writes exceed this duration, the disk is considered stalled") + fs.DurationVar(&stalledDiskWriteInterval, "disk-write-interval", stalledDiskWriteInterval, "how often to write to the disk to check whether it is stalled") } var ( @@ -164,6 +170,7 @@ type TabletManager struct { VREngine *vreplication.Engine VDiffEngine *vdiff.Engine Env *vtenv.Environment + dhMonitor DiskHealthMonitor // tmc is used to run an RPC against other vttablets. tmc tmclient.TabletManagerClient @@ -372,6 +379,7 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl tm.tmc = tmclient.NewTabletManagerClient() tm.tmState = newTMState(tm, tablet) tm.actionSema = semaphore.NewWeighted(1) + tm.dhMonitor = newDiskHealthMonitor(tm.BatchCtx) tm._waitForGrantsComplete = make(chan struct{}) tm.baseTabletType = tablet.Type From cd94eff7f259d275a3e9aa0bd488d48434f581af Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Sun, 19 Jan 2025 07:48:21 +0200 Subject: [PATCH 42/66] Online DDL forced cut-over: terminate transactions holding metadata locks on table (#17535) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/capabilities/capability.go | 41 ++++----- go/mysql/capabilities/capability_test.go | 19 +++++ go/mysql/flavor_test.go | 9 ++ .../scheduler/onlineddl_scheduler_test.go | 83 +++++++++++++++++++ go/vt/vttablet/onlineddl/executor.go | 55 ++++++------ go/vt/vttablet/onlineddl/schema.go | 9 ++ 6 files changed, 173 insertions(+), 43 deletions(-) diff --git a/go/mysql/capabilities/capability.go b/go/mysql/capabilities/capability.go index 4015059e686..eac25585089 100644 --- a/go/mysql/capabilities/capability.go +++ b/go/mysql/capabilities/capability.go @@ -31,25 +31,26 @@ var ( type FlavorCapability int const ( - NoneFlavorCapability FlavorCapability = iota // default placeholder - FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html - TransactionalGtidExecutedFlavorCapability // - InstantDDLFlavorCapability // ALGORITHM=INSTANT general support - InstantAddLastColumnFlavorCapability // - InstantAddDropVirtualColumnFlavorCapability // - InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal. - InstantChangeColumnDefaultFlavorCapability // - InstantExpandEnumCapability // - InstantChangeColumnVisibilityCapability // - MySQLUpgradeInServerFlavorCapability // - DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html - DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html - CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html - PerformanceSchemaDataLocksTableCapability // supported in MySQL 8.0.1 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html - InstantDDLXtrabackupCapability // Supported in 8.0.32 and above, solving a MySQL-vs-Xtrabackup bug starting 8.0.29 - ReplicaTerminologyCapability // Supported in 8.0.26 and above, using SHOW REPLICA STATUS and all variations. - BinaryLogStatus // Supported in 8.2.0 and above, uses SHOW BINARY LOG STATUS - RestrictFKOnNonStandardKey // Supported in 8.4.0 and above, restricts usage of non-standard indexes for foreign keys. + NoneFlavorCapability FlavorCapability = iota // default placeholder + FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html + TransactionalGtidExecutedFlavorCapability // + InstantDDLFlavorCapability // ALGORITHM=INSTANT general support + InstantAddLastColumnFlavorCapability // + InstantAddDropVirtualColumnFlavorCapability // + InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal. + InstantChangeColumnDefaultFlavorCapability // + InstantExpandEnumCapability // + InstantChangeColumnVisibilityCapability // + MySQLUpgradeInServerFlavorCapability // + DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html + DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html + CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html + PerformanceSchemaDataLocksTableCapability // supported in MySQL 8.0.1 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html + PerformanceSchemaMetadataLocksTableCapability // supported in MySQL 8.0.2 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-2.html + InstantDDLXtrabackupCapability // Supported in 8.0.32 and above, solving a MySQL-vs-Xtrabackup bug starting 8.0.29 + ReplicaTerminologyCapability // Supported in 8.0.26 and above, using SHOW REPLICA STATUS and all variations. + BinaryLogStatus // Supported in 8.2.0 and above, uses SHOW BINARY LOG STATUS + RestrictFKOnNonStandardKey // Supported in 8.4.0 and above, restricts usage of non-standard indexes for foreign keys. ) type CapableOf func(capability FlavorCapability) (bool, error) @@ -97,6 +98,8 @@ func MySQLVersionHasCapability(serverVersion string, capability FlavorCapability return atLeast(8, 0, 0) case PerformanceSchemaDataLocksTableCapability: return atLeast(8, 0, 1) + case PerformanceSchemaMetadataLocksTableCapability: + return atLeast(8, 0, 2) case MySQLUpgradeInServerFlavorCapability: return atLeast(8, 0, 16) case CheckConstraintsCapability: diff --git a/go/mysql/capabilities/capability_test.go b/go/mysql/capabilities/capability_test.go index aeb18bed22e..cf5e693840e 100644 --- a/go/mysql/capabilities/capability_test.go +++ b/go/mysql/capabilities/capability_test.go @@ -218,6 +218,25 @@ func TestMySQLVersionCapableOf(t *testing.T) { version: "8.0.20", capability: PerformanceSchemaDataLocksTableCapability, isCapable: true, + }, { + version: "5.7.38", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.1", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.2", + capability: PerformanceSchemaMetadataLocksTableCapability, + isCapable: true, }, { version: "8.0.29", diff --git a/go/mysql/flavor_test.go b/go/mysql/flavor_test.go index 3d584b8293b..219b9803933 100644 --- a/go/mysql/flavor_test.go +++ b/go/mysql/flavor_test.go @@ -102,6 +102,15 @@ func TestServerVersionCapableOf(t *testing.T) { version: "8.0.20", capability: capabilities.PerformanceSchemaDataLocksTableCapability, isCapable: true, + }, { + version: "5.7.38", + capability: capabilities.PerformanceSchemaMetadataLocksTableCapability, + isCapable: false, + }, + { + version: "8.0.20", + capability: capabilities.PerformanceSchemaMetadataLocksTableCapability, + isCapable: true, }, { // Some ridiculous version diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 5f6423b2556..8547431ddd3 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -714,6 +714,89 @@ func testScheduler(t *testing.T) { } }) }) + t.Run("force_cutover mdl", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), extendedWaitTime*5) + defer cancel() + + t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy+" --postpone-completion", "vtgate", "", "", true)) // skip wait + + t.Run("wait for t1 running", func(t *testing.T) { + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusRunning) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + }) + t.Run("wait for t1 ready to complete", func(t *testing.T) { + // Waiting for 'running', above, is not enough. We want to let vreplication a chance to start running, or else + // we attempt the cut-over too early. Specifically in this test, we're going to lock rows FOR UPDATE, which, + // if vreplication does not get the chance to start, will prevent it from doing anything at all. + // ready_to_complete is a great signal for us that vreplication is healthy and up to date. + waitForReadyToComplete(t, t1uuid, true) + }) + + conn, err := primaryTablet.VttabletProcess.TabletConn(keyspaceName, true) + require.NoError(t, err) + defer conn.Close() + + unlockTables := func() error { + _, err := conn.ExecuteFetch("unlock tables", 0, false) + return err + } + t.Run("locking table", func(t *testing.T) { + _, err := conn.ExecuteFetch("lock tables t1_test write", 0, false) + require.NoError(t, err) + }) + defer unlockTables() + t.Run("injecting heartbeats asynchronously", func(t *testing.T) { + go func() { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + throttler.CheckThrottler(clusterInstance, primaryTablet, throttlerapp.OnlineDDLName, nil) + select { + case <-ticker.C: + case <-ctx.Done(): + return + } + } + }() + }) + t.Run("check no force_cutover", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + forceCutOver := row.AsInt64("force_cutover", 0) + assert.Equal(t, int64(0), forceCutOver) // disabled + } + }) + t.Run("attempt to complete", func(t *testing.T) { + onlineddl.CheckCompleteMigration(t, &vtParams, shards, t1uuid, true) + }) + t.Run("cut-over fail due to timeout", func(t *testing.T) { + waitForMessage(t, t1uuid, "(errno 3024) (sqlstate HY000): Query execution was interrupted, maximum statement execution time exceeded") + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed, schema.OnlineDDLStatusRunning) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusRunning) + }) + t.Run("force_cutover", func(t *testing.T) { + onlineddl.CheckForceMigrationCutOver(t, &vtParams, shards, t1uuid, true) + }) + t.Run("check force_cutover", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + forceCutOver := row.AsInt64("force_cutover", 0) + assert.Equal(t, int64(1), forceCutOver) // enabled + } + }) + t.Run("expect completion", func(t *testing.T) { + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusComplete) + }) + t.Run("expect unlock failure", func(t *testing.T) { + err := unlockTables() + assert.ErrorContains(t, err, "broken pipe") + }) + }) } t.Run("ALTER both tables non-concurrent", func(t *testing.T) { t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy, "vtgate", "", "", true)) // skip wait diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index ce81a2dd516..76c7af7fc2e 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -838,34 +838,41 @@ func (e *Executor) killTableLockHoldersAndAccessors(ctx context.Context, tableNa } } capableOf := mysql.ServerVersionCapableOf(conn.ServerVersion) - capable, err := capableOf(capabilities.PerformanceSchemaDataLocksTableCapability) - if err != nil { - return err - } - if capable { - { - // Kill connections that have open transactions locking the table. These potentially (probably?) are not - // actively running a query on our table. They're doing other things while holding locks on our table. - query, err := sqlparser.ParseAndBind(sqlProcessWithLocksOnTable, sqltypes.StringBindVariable(tableName)) - if err != nil { - return err - } - rs, err := conn.Conn.ExecuteFetch(query, -1, true) + terminateTransactions := func(capability capabilities.FlavorCapability, query string, column string, description string) error { + capable, err := capableOf(capability) + if err != nil { + return err + } + if !capable { + return nil + } + query, err = sqlparser.ParseAndBind(query, sqltypes.StringBindVariable(tableName)) + if err != nil { + return err + } + rs, err := conn.Conn.ExecuteFetch(query, -1, true) + if err != nil { + return vterrors.Wrapf(err, "finding transactions locking table `%s` %s", tableName, description) + } + log.Infof("terminateTransactions: found %v transactions locking table `%s` %s", len(rs.Rows), tableName, description) + for _, row := range rs.Named().Rows { + threadId := row.AsInt64(column, 0) + log.Infof("terminateTransactions: killing connection %v with transaction locking table `%s` %s", threadId, tableName, description) + killConnection := fmt.Sprintf("KILL %d", threadId) + _, err = conn.Conn.ExecuteFetch(killConnection, 1, false) if err != nil { - return vterrors.Wrapf(err, "finding transactions locking table") - } - log.Infof("killTableLockHoldersAndAccessors: found %v locking transactions", len(rs.Rows)) - for _, row := range rs.Named().Rows { - threadId := row.AsInt64("trx_mysql_thread_id", 0) - log.Infof("killTableLockHoldersAndAccessors: killing connection %v with transaction on table", threadId) - killConnection := fmt.Sprintf("KILL %d", threadId) - _, err = conn.Conn.ExecuteFetch(killConnection, 1, false) - if err != nil { - log.Errorf("Unable to kill the connection %d: %v", threadId, err) - } + log.Errorf("terminateTransactions: unable to kill the connection %d locking table `%s` %s: %v", threadId, tableName, description, err) } } + return nil + } + if err := terminateTransactions(capabilities.PerformanceSchemaDataLocksTableCapability, sqlProcessWithLocksOnTable, "trx_mysql_thread_id", "data"); err != nil { + return err } + if err := terminateTransactions(capabilities.PerformanceSchemaMetadataLocksTableCapability, sqlProcessWithMetadataLocksOnTable, "processlist_id", "metadata"); err != nil { + return err + } + return nil } diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 6ba0217519c..6c0bff1086f 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -567,6 +567,15 @@ const ( where data_locks.OBJECT_SCHEMA=database() AND data_locks.OBJECT_NAME=%a ` + sqlProcessWithMetadataLocksOnTable = ` + SELECT + DISTINCT threads.processlist_id + from + performance_schema.metadata_locks + join performance_schema.threads on (metadata_locks.OWNER_THREAD_ID=threads.THREAD_ID) + where + metadata_locks.OBJECT_SCHEMA=database() AND metadata_locks.OBJECT_NAME=%a + ` ) var ( From ff7c5adae385ceb2804bcdd087f4dddac48556e1 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Sun, 19 Jan 2025 09:22:30 -0500 Subject: [PATCH 43/66] VDiff: Remove extra % sign in vdiff text report template (#17568) --- .../command/vreplication/vdiff/vdiff.go | 2 +- .../command/vreplication/vdiff/vdiff_test.go | 69 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go index 38b0521f142..a5d07f0502a 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go @@ -436,7 +436,7 @@ State: {{.State}} RowsCompared: {{.RowsCompared}} HasMismatch: {{.HasMismatch}} StartedAt: {{.StartedAt}} -{{if (eq .State "started")}}Progress: {{printf "%.2f" .Progress.Percentage}}%%{{if .Progress.ETA}}, ETA: {{.Progress.ETA}}{{end}}{{end}} +{{if (eq .State "started")}}Progress: {{printf "%.2f" .Progress.Percentage}}%{{if .Progress.ETA}}, ETA: {{.Progress.ETA}}{{end}}{{end}} {{if .CompletedAt}}CompletedAt: {{.CompletedAt}}{{end}} {{range $table := .TableSummaryMap}} Table {{$table.TableName}}: diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go index e27c57f47be..cf713d79579 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go @@ -680,6 +680,75 @@ func TestVDiffSharded(t *testing.T) { } } +func TestVDiffTextTemplate(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + env := newTestVDiffEnv(t, ctx, []string{"0"}, []string{"0"}, "", nil) + defer env.close() + + now := time.Now() + UUID := uuid.New().String() + req := &tabletmanagerdatapb.VDiffRequest{ + Keyspace: env.targetKeyspace, + Workflow: env.workflow, + Action: string(vdiff.ShowAction), + ActionArg: UUID, + } + starttime := now.UTC().Format(vdiff.TimestampFormat) + + testCases := []struct { + id string + res *sqltypes.Result + report string + }{{ + id: "1", + res: sqltypes.MakeTestResult(fields, + "started||t1|"+UUID+"|started|300|"+starttime+"|30||0|"+ + `{"TableName": "t1", "MatchingRows": 30, "ProcessedRows": 30, "MismatchedRows": 0, "ExtraRowsSource": 0, `+ + `"ExtraRowsTarget": 0}`), + report: fmt.Sprintf(` +VDiff Summary for targetks.vdiffTest (%s) +State: started +RowsCompared: 30 +HasMismatch: false +StartedAt: %s +Progress: 10.00%%, ETA: %s + +Table t1: + State: started + ProcessedRows: 30 + MatchingRows: 30 + +Use "--format=json" for more detailed output. + +`, UUID, starttime, starttime), + }} + + for _, tc := range testCases { + t.Run(tc.id, func(t *testing.T) { + res := &tabletmanagerdatapb.VDiffResponse{ + Id: 1, + Output: sqltypes.ResultToProto3(tc.res), + } + env.tmc.setVDResults(env.tablets[200].tablet, req, res) + req := &vtctldatapb.VDiffShowRequest{ + TargetKeyspace: env.targetKeyspace, + Workflow: env.workflow, + Arg: UUID, + } + + resp, err := env.ws.VDiffShow(context.Background(), req) + require.NoError(t, err) + vds, err := displayShowSingleSummary(env.out, "text", env.targetKeyspace, env.workflow, UUID, resp, true) + require.NoError(t, err) + require.Equal(t, vdiff.StartedState, vds) + + require.Equal(t, tc.report, env.getOutput()) + env.resetOutput() + }) + } +} + func TestGetStructNames(t *testing.T) { type s struct { A string From 10ff5e372de283dbded889152abefccbb2f2c1f0 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:30:51 +0100 Subject: [PATCH 44/66] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) Signed-off-by: Rohit Nayak --- go/vt/discovery/tablet_picker.go | 12 ++++++++++-- go/vt/discovery/tablet_picker_test.go | 23 +++++++++++++++++++++++ go/vt/topo/tablet.go | 3 +++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/go/vt/discovery/tablet_picker.go b/go/vt/discovery/tablet_picker.go index c48905be948..cfe1ba2e964 100644 --- a/go/vt/discovery/tablet_picker.go +++ b/go/vt/discovery/tablet_picker.go @@ -387,8 +387,13 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn log.Errorf("Error getting shard %s/%s: %v", tp.keyspace, tp.shard, err) return nil } - if _, ignore := tp.ignoreTablets[si.PrimaryAlias.String()]; !ignore { - aliases = append(aliases, si.PrimaryAlias) + + // It is possible that there is a cluster event (ERS/PRS, for example) due to which + // there is no primary elected for the shard at the moment. + if si.PrimaryAlias != nil { + if _, ignore := tp.ignoreTablets[si.PrimaryAlias.String()]; !ignore { + aliases = append(aliases, si.PrimaryAlias) + } } } else { actualCells := make([]string, 0) @@ -425,6 +430,9 @@ func (tp *TabletPicker) GetMatchingTablets(ctx context.Context) []*topo.TabletIn continue } for _, node := range sri.Nodes { + if node.TabletAlias == nil { + continue + } if _, ignore := tp.ignoreTablets[node.TabletAlias.String()]; !ignore { aliases = append(aliases, node.TabletAlias) } diff --git a/go/vt/discovery/tablet_picker_test.go b/go/vt/discovery/tablet_picker_test.go index 76a8828afec..27c4d8bf7b1 100644 --- a/go/vt/discovery/tablet_picker_test.go +++ b/go/vt/discovery/tablet_picker_test.go @@ -62,6 +62,29 @@ func TestPickPrimary(t *testing.T) { assert.True(t, proto.Equal(want, tablet), "Pick: %v, want %v", tablet, want) } +// TestPickNoPrimary confirms that if the picker was setup only for primary tablets but +// there is no primary setup for the shard we correctly return an error. +func TestPickNoPrimary(t *testing.T) { + defer utils.EnsureNoLeaks(t) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + te := newPickerTestEnv(t, ctx, []string{"cell", "otherCell"}) + want := addTablet(ctx, te, 100, topodatapb.TabletType_PRIMARY, "cell", true, true) + defer deleteTablet(t, te, want) + _, err := te.topoServ.UpdateShardFields(ctx, te.keyspace, te.shard, func(si *topo.ShardInfo) error { + si.PrimaryAlias = nil // force a missing primary + return nil + }) + require.NoError(t, err) + + tp, err := NewTabletPicker(ctx, te.topoServ, []string{"otherCell"}, "cell", te.keyspace, te.shard, "primary", TabletPickerOptions{}) + require.NoError(t, err) + + _, err = tp.PickForStreaming(ctx) + require.Errorf(t, err, "No healthy serving tablet") +} + func TestPickLocalPreferences(t *testing.T) { defer utils.EnsureNoLeaks(t) type tablet struct { diff --git a/go/vt/topo/tablet.go b/go/vt/topo/tablet.go index 10ba787a3c1..f2c9ab81d67 100644 --- a/go/vt/topo/tablet.go +++ b/go/vt/topo/tablet.go @@ -492,6 +492,9 @@ func (ts *Server) GetTabletMap(ctx context.Context, tabletAliases []*topodatapb. ) for _, tabletAlias := range tabletAliases { + if tabletAlias == nil { + return nil, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "nil tablet alias in list") + } wg.Add(1) go func(tabletAlias *topodatapb.TabletAlias) { defer wg.Done() From 4687195766bbd225c42447efd05672c488b189fd Mon Sep 17 00:00:00 2001 From: vitess-bot <139342327+vitess-bot@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:57:15 -0600 Subject: [PATCH 45/66] [main] Upgrade the Golang version to `go1.23.5` (#17563) Signed-off-by: GitHub Signed-off-by: Florent Poinsard Co-authored-by: frouioui Co-authored-by: Florent Poinsard --- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .github/workflows/upgrade_downgrade_test_onlineddl_flow.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries_2.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- .github/workflows/upgrade_downgrade_test_semi_sync.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- go.mod | 2 +- test.go | 2 +- test/templates/dockerfile.tpl | 2 +- 19 files changed, 23 insertions(+), 19 deletions(-) diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 7e50c186a41..9fc4c00e18e 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -74,7 +74,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 206a09e97bb..7ca2c3ebbea 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index 028150e54fd..03dd28c2e2a 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -86,7 +86,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index aeb96066908..e155be9f389 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml index df09ceb720a..2d58d4c8fae 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_2.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 87a155df5e9..8c82838594d 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index fc010850117..b3e2cf6451e 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index 33afe4fdf90..fe0702b2fff 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -78,7 +78,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index a40a55f0d0c..cb950d43e4e 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -74,7 +74,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.23.4 + go-version: 1.23.5 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index 13f7fde28e0..7eb3c9c1d8d 100644 --- a/Makefile +++ b/Makefile @@ -286,7 +286,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql80 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=39 +BOOTSTRAP_VERSION=40 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 58abbf41d1b..12431842b6e 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.23.4 || echo "Go version reported: `go version`. Version 1.23.4+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.23.5 || echo "Go version reported: `go version`. Version 1.23.5+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index b52783d0c30..47b7d3a7c88 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -153,4 +153,8 @@ List of changes between bootstrap image versions. ## [39] - 2024-12-04 ### Changes -- Update build to golang 1.23.4 \ No newline at end of file +- Update build to golang 1.23.4 + +## [40] - 2025-01-17 +### Changes +- Update build to golang 1.23.5 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 3ace19543f1..f449f94ab16 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.23.4-bullseye +FROM --platform=linux/amd64 golang:1.23.5-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile b/docker/lite/Dockerfile index fff1414fab6..231dbb0c8aa 100644 --- a/docker/lite/Dockerfile +++ b/docker/lite/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index a839fb35514..106d4a0da5f 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 74b9564ef48..37ec0b9ac7d 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER diff --git a/go.mod b/go.mod index d2cd40bc773..81f6fcb141f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module vitess.io/vitess -go 1.23.4 +go 1.23.5 require ( cloud.google.com/go/storage v1.46.0 diff --git a/test.go b/test.go index 95d62af892f..4922f4f88f1 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql80", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "39", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "40", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index af4376d3ca9..84f084e41e1 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=39 +ARG bootstrap_version=40 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" From 9b57dafc88b5166f80d931415e09ae063568b69f Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Tue, 21 Jan 2025 10:58:56 +0100 Subject: [PATCH 46/66] Update bundled MySQL version to 8.0.40 (#17552) Signed-off-by: Dirkjan Bussink Signed-off-by: Florent Poinsard Signed-off-by: Harshit Gangal Co-authored-by: Florent Poinsard Co-authored-by: Harshit Gangal --- Makefile | 2 +- changelog/22.0/22.0.0/summary.md | 26 + docker/binaries/vtadmin/Dockerfile | 2 +- docker/bootstrap/CHANGELOG.md | 6 +- docker/bootstrap/Dockerfile.common | 7 +- docker/bootstrap/Dockerfile.mysql80 | 4 +- docker/bootstrap/Dockerfile.percona80 | 4 +- docker/lite/Dockerfile | 4 +- docker/lite/Dockerfile.percona80 | 4 +- docker/utils/install_dependencies.sh | 96 +--- docker/vttestserver/Dockerfile.mysql80 | 6 +- examples/operator/101_initial_cluster.yaml | 4 +- examples/operator/201_customer_tablets.yaml | 2 +- examples/operator/302_new_shards.yaml | 2 +- examples/operator/306_down_shard_0.yaml | 2 +- examples/operator/401_scheduled_backups.yaml | 2 +- go/flags/endtoend/mysqlctl.txt | 2 +- go/flags/endtoend/mysqlctld.txt | 2 +- go/flags/endtoend/vtbackup.txt | 2 +- go/flags/endtoend/vtbench.txt | 2 +- go/flags/endtoend/vtclient.txt | 2 +- go/flags/endtoend/vtcombo.txt | 2 +- go/flags/endtoend/vtctld.txt | 2 +- go/flags/endtoend/vtctldclient.txt | 2 +- go/flags/endtoend/vtexplain.txt | 2 +- go/flags/endtoend/vtgate.txt | 2 +- go/flags/endtoend/vtgateclienttest.txt | 2 +- go/flags/endtoend/vttablet.txt | 2 +- go/flags/endtoend/vttestserver.txt | 2 +- .../collations/integration/collations_test.go | 2 +- go/mysql/config/config.go | 2 +- go/vt/servenv/buildinfo_test.go | 2 +- go/vt/vtgate/semantics/info_schema.go | 2 +- java/jdbc/pom.xml | 19 - .../io/vitess/jdbc/FieldWithMetadataTest.java | 96 +--- .../io/vitess/jdbc/VitessConnectionTest.java | 16 +- .../jdbc/VitessDatabaseMetadataTest.java | 455 +----------------- .../jdbc/VitessParameterMetaDataTest.java | 29 +- .../jdbc/VitessPreparedStatementTest.java | 217 ++++----- .../io/vitess/jdbc/VitessResultSetTest.java | 231 +-------- .../io/vitess/jdbc/VitessStatementTest.java | 329 ++++++------- test.go | 2 +- test/templates/dockerfile.tpl | 2 +- 43 files changed, 379 insertions(+), 1224 deletions(-) diff --git a/Makefile b/Makefile index 7eb3c9c1d8d..378b8708be6 100644 --- a/Makefile +++ b/Makefile @@ -286,7 +286,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql80 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=40 +BOOTSTRAP_VERSION=41 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index 2fb66ea8969..f96679d4aa8 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -13,6 +13,8 @@ - **[Support for LAST_INSERT_ID(x)](#last-insert-id)** - **[Support for Maximum Idle Connections in the Pool](#max-idle-connections)** - **[Stalled Disk Recovery in VTOrc](#stall-disk-recovery)** + - **[Update default MySQL version to 8.0.40](#mysql-8-0-40)** + - **[Update lite images to Debian Bookworm](#debian-bookworm)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -106,6 +108,30 @@ VTOrc can now identify and recover from stalled disk errors. VTTablets test whet To opt into this feature, `--enable-primary-disk-stalled-recovery` flag has to be specified on VTOrc, and `--disk-write-dir` flag has to be specified on the vttablets. `--disk-write-interval` and `--disk-write-timeout` flags can be used to configure the polling interval and timeout respectively. +### Update default MySQL version to 8.0.40 + +The default major MySQL version used by our `vitess/lite:latest` image is going from `8.0.30` to `8.0.40`. +This change was brought by [Pull Request #17552](https://github.com/vitessio/vitess/pull/17552). + +VTGate also advertises MySQL version `8.0.40` by default instead of `8.0.30` if no explicit version is set. The users can set the `mysql_server_version` flag to advertise the correct version. + +#### ⚠️Upgrading to this release with vitess-operator + +If you are using the `vitess-operator`, considering that we are bumping the patch version of MySQL 80 from `8.0.30` to `8.0.40`, you will have to manually upgrade: + +1. Add `innodb_fast_shutdown=0` to your extra cnf in your YAML file. +2. Apply this file. +3. Wait for all the pods to be healthy. +4. Then change your YAML file to use the new Docker Images (`vitess/lite:v22.0.0`). +5. Remove `innodb_fast_shutdown=0` from your extra cnf in your YAML file. +6. Apply this file. + +This is the last time this will be needed in the `8.0.x` series, as starting with MySQL `8.0.35` it is possible to upgrade and downgrade between `8.0.x` versions without needing to run `innodb_fast_shutdown=0`. + +### Update lite images to Debian Bookworm + +The base system now uses Debian Bookworm instead of Debian Bullseye for the `vitess/lite` images. This change was brought by [Pull Request #17552]. + ## Minor Changes #### VTTablet Flags diff --git a/docker/binaries/vtadmin/Dockerfile b/docker/binaries/vtadmin/Dockerfile index fe69237ea13..b700f8ab74b 100644 --- a/docker/binaries/vtadmin/Dockerfile +++ b/docker/binaries/vtadmin/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. ARG VT_BASE_VER=latest -ARG DEBIAN_VER=bullseye-slim +ARG DEBIAN_VER=bookworm-slim FROM vitess/lite:${VT_BASE_VER} AS lite diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 47b7d3a7c88..f2e66566a3c 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -157,4 +157,8 @@ List of changes between bootstrap image versions. ## [40] - 2025-01-17 ### Changes -- Update build to golang 1.23.5 \ No newline at end of file +- Update build to golang 1.23.5 + +## [41] - 2025-01-15 +### Changes +- Update base image to bookworm diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index f449f94ab16..e0866fe4bda 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.23.5-bullseye +FROM --platform=linux/amd64 golang:1.23.5-bookworm # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ @@ -8,12 +8,13 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins chromium \ curl \ default-jdk \ - etcd \ + etcd-client \ + etcd-server \ g++ \ git \ + gnupg \ make \ maven \ - software-properties-common \ unzip \ zip \ xvfb \ diff --git a/docker/bootstrap/Dockerfile.mysql80 b/docker/bootstrap/Dockerfile.mysql80 index b4fec6b7d11..e8ca365a704 100644 --- a/docker/bootstrap/Dockerfile.mysql80 +++ b/docker/bootstrap/Dockerfile.mysql80 @@ -8,9 +8,9 @@ USER root # Install MySQL 8.0 RUN for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com 8C718D3B5072E1F5 && break; done && \ for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com A8D3785C && break; done && \ - add-apt-repository 'deb http://repo.mysql.com/apt/debian/ bullseye mysql-8.0' && \ + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0' > /etc/apt/sources.list.d/mysql.list && \ for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/bootstrap/Dockerfile.percona80 b/docker/bootstrap/Dockerfile.percona80 index 147b988b002..53b16a8eb4b 100644 --- a/docker/bootstrap/Dockerfile.percona80 +++ b/docker/bootstrap/Dockerfile.percona80 @@ -7,7 +7,7 @@ USER root # Install Percona 8.0 RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done \ - && echo 'deb http://repo.percona.com/ps-80/apt bullseye main' > /etc/apt/sources.list.d/percona.list && \ + && echo 'deb http://repo.percona.com/ps-80/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ { \ echo debconf debconf/frontend select Noninteractive; \ echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ @@ -23,7 +23,7 @@ RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.c rsync \ libev4 \ # && rm -f /etc/apt/sources.list.d/percona.list \ - && echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list \ + && echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list \ # { \ # echo debconf debconf/frontend select Noninteractive; \ # echo percona-server-server-8.0 percona-server-server/root_password password 'unused'; \ diff --git a/docker/lite/Dockerfile b/docker/lite/Dockerfile index 231dbb0c8aa..c75a0a5ad4c 100644 --- a/docker/lite/Dockerfile +++ b/docker/lite/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.5-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -31,7 +31,7 @@ COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess RUN make install PREFIX=/vt/install # Start over and build the final image. -FROM --platform=linux/amd64 debian:bullseye-slim +FROM --platform=linux/amd64 debian:bookworm-slim # Install locale required for mysqlsh RUN apt-get update && apt-get install -y locales \ diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index 106d4a0da5f..16e1da78627 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.5-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -31,7 +31,7 @@ COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess RUN make install PREFIX=/vt/install # Start over and build the final image. -FROM --platform=linux/amd64 debian:bullseye-slim +FROM --platform=linux/amd64 debian:bookworm-slim # Install dependencies COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh diff --git a/docker/utils/install_dependencies.sh b/docker/utils/install_dependencies.sh index 91e6e2b8c76..64810a78d77 100755 --- a/docker/utils/install_dependencies.sh +++ b/docker/utils/install_dependencies.sh @@ -71,66 +71,33 @@ apt-get install -y --no-install-recommends "${BASE_PACKAGES[@]}" # Packages specific to certain flavors. case "${FLAVOR}" in -mysql57) - if [ -z "$VERSION" ]; then - VERSION=5.7.31 - fi - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/libmysqlclient20_${VERSION}-1debian10_amd64.deb /tmp/libmysqlclient20_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-community-client_${VERSION}-1debian10_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-client_${VERSION}-1debian10_amd64.deb /tmp/mysql-client_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-community-server_${VERSION}-1debian10_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian10_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-5.7/m/mysql-community/mysql-server_${VERSION}-1debian10_amd64.deb /tmp/mysql-server_${VERSION}-1debian10_amd64.deb - PACKAGES=( - /tmp/libmysqlclient20_${VERSION}-1debian10_amd64.deb - /tmp/mysql-community-client_${VERSION}-1debian10_amd64.deb - /tmp/mysql-client_${VERSION}-1debian10_amd64.deb - /tmp/mysql-community-server_${VERSION}-1debian10_amd64.deb - /tmp/mysql-server_${VERSION}-1debian10_amd64.deb - mysql-shell - percona-xtrabackup-24 - ) - ;; mysql80) if [ -z "$VERSION" ]; then - VERSION=8.0.30 + VERSION=8.0.40 fi - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-common_${VERSION}-1debian11_amd64.deb /tmp/mysql-common_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/libmysqlclient21_${VERSION}-1debian11_amd64.deb /tmp/libmysqlclient21_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-core_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-client_${VERSION}-1debian11_amd64.deb /tmp/mysql-client_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server-core_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian11_amd64.deb - do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-server_${VERSION}-1debian11_amd64.deb /tmp/mysql-server_${VERSION}-1debian11_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-common_${VERSION}-1debian12_amd64.deb /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/libmysqlclient21_${VERSION}-1debian12_amd64.deb /tmp/libmysqlclient21_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-community-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.0/m/mysql-community/mysql-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-server_${VERSION}-1debian12_amd64.deb PACKAGES=( - /tmp/mysql-common_${VERSION}-1debian11_amd64.deb - /tmp/libmysqlclient21_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client-core_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client-plugins_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-client_${VERSION}-1debian11_amd64.deb - /tmp/mysql-client_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-server-core_${VERSION}-1debian11_amd64.deb - /tmp/mysql-community-server_${VERSION}-1debian11_amd64.deb - /tmp/mysql-server_${VERSION}-1debian11_amd64.deb + /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + /tmp/libmysqlclient21_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + /tmp/mysql-server_${VERSION}-1debian12_amd64.deb mysql-shell percona-xtrabackup-80 ) ;; -percona) - PACKAGES=( - libcurl3 - percona-server-server-5.6 - percona-xtrabackup - ) - ;; -percona57) - PACKAGES=( - libperconaserverclient20 - percona-server-server-5.7 - percona-xtrabackup-24 - ) - ;; percona80) PACKAGES=( libperconaserverclient21 @@ -155,39 +122,24 @@ add_apt_key 9334A25F8507EFA5 # Add extra apt repositories for MySQL. case "${FLAVOR}" in -mysql57) - echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list - ;; mysql80) - echo 'deb http://repo.mysql.com/apt/debian/ bullseye mysql-8.0' > /etc/apt/sources.list.d/mysql.list + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0' > /etc/apt/sources.list.d/mysql.list ;; esac # Add extra apt repositories for Percona Server and/or Percona XtraBackup. case "${FLAVOR}" in -mysql57) - echo 'deb http://repo.percona.com/apt buster main' > /etc/apt/sources.list.d/percona.list - ;; -mysql80|percona57) - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list +mysql80) + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list ;; percona80) - echo 'deb http://repo.percona.com/apt bullseye main' > /etc/apt/sources.list.d/percona.list - echo 'deb http://repo.percona.com/ps-80/apt bullseye main' > /etc/apt/sources.list.d/percona80.list + echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list + echo 'deb http://repo.percona.com/ps-80/apt bookworm main' > /etc/apt/sources.list.d/percona80.list ;; esac # Pre-fill values for installation prompts that are normally interactive. case "${FLAVOR}" in -percona57) - debconf-set-selections < min_sequence_id, for each query, a number is generated in [min_sequence_id, max_sequence_id) and attached to the end of the bind variables. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --parallel int DMLs only: Number of threads executing the same query in parallel. Useful for simple load testing. (default 1) --pprof strings enable profiling --pprof-http enable pprof http endpoints diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 76c8e894347..25deea04548 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -245,7 +245,7 @@ Flags: --mysql_server_ssl_key string Path to ssl key for mysql server plugin SSL --mysql_server_ssl_server_ca string path to server CA in PEM format, which will be combine with server cert, return full certificate chain to clients --mysql_server_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_server_write_timeout duration connection write timeout --mysql_slow_connect_warn_threshold duration Warn if it takes more than the given threshold for a mysql connection to establish --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index c84c5fadf5f..764c07a9d69 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -98,7 +98,7 @@ Flags: --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --opentsdb_uri string URI of opentsdb /api/put method diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 5ff2a7b21da..bfa50a4d98c 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -134,7 +134,7 @@ Flags: --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for the connection (required) diff --git a/go/flags/endtoend/vtexplain.txt b/go/flags/endtoend/vtexplain.txt index fdd289e63c7..90013fe1b98 100644 --- a/go/flags/endtoend/vtexplain.txt +++ b/go/flags/endtoend/vtexplain.txt @@ -59,7 +59,7 @@ Flags: --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --normalize Whether to enable vtgate normalization --output-mode string Output in human-friendly text or json (default "text") --planner-version string Sets the default planner to use. Valid values are: Gen4, Gen4Greedy, Gen4Left2Right diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index fde17f89c49..bfecdd07288 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -157,7 +157,7 @@ Flags: --mysql_server_ssl_key string Path to ssl key for mysql server plugin SSL --mysql_server_ssl_server_ca string path to server CA in PEM format, which will be combine with server cert, return full certificate chain to clients --mysql_server_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysql_server_write_timeout duration connection write timeout --mysql_slow_connect_warn_threshold duration Warn if it takes more than the given threshold for a mysql connection to establish --mysql_tcp_version string Select tcp, tcp4, or tcp6 to control the socket type. (default "tcp") diff --git a/go/flags/endtoend/vtgateclienttest.txt b/go/flags/endtoend/vtgateclienttest.txt index 8a2f18b6b5a..d5b45e57b1e 100644 --- a/go/flags/endtoend/vtgateclienttest.txt +++ b/go/flags/endtoend/vtgateclienttest.txt @@ -53,7 +53,7 @@ Flags: --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files --max-stack-size int configure the maximum stack size in bytes (default 67108864) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) --onterm_timeout duration wait no more than this for OnTermSync handlers before stopping (default 10s) --pid_file string If set, the process will write its pid to the named file, and delete it on graceful shutdown. diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 955823f7322..1532bf870e0 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -247,7 +247,7 @@ Flags: --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration timeout to use when MySQL is being shut down. (default 5m0s) - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --onclose_timeout duration wait no more than this for OnClose handlers before stopping (default 10s) diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index 042ffd37643..385b7194652 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -96,7 +96,7 @@ Flags: --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql_bind_host string which host to bind vtgate mysql listener to (default "localhost") --mysql_only If this flag is set only mysql is initialized. The rest of the vitess components are not started. Also, the output specifies the mysql unix socket instead of the vtgate port. - --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init --mysqlctl_socket string socket file to use for remote mysqlctl actions (empty for local actions) --no_scatter when set to true, the planner will fail instead of producing a plan that includes scatter queries diff --git a/go/mysql/collations/integration/collations_test.go b/go/mysql/collations/integration/collations_test.go index 519f4560faf..c599eceaa2e 100644 --- a/go/mysql/collations/integration/collations_test.go +++ b/go/mysql/collations/integration/collations_test.go @@ -45,7 +45,7 @@ var collationEnv *collations.Environment func init() { // We require MySQL 8.0 collations for the comparisons in the tests - collationEnv = collations.NewEnvironment("8.0.30") + collationEnv = collations.NewEnvironment("8.0.40") } func getSQLQueries(t *testing.T, testfile string) []string { diff --git a/go/mysql/config/config.go b/go/mysql/config/config.go index 6070d0d6248..4f9a8b3a734 100644 --- a/go/mysql/config/config.go +++ b/go/mysql/config/config.go @@ -1,5 +1,5 @@ package config const DefaultSQLMode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" -const DefaultMySQLVersion = "8.0.30" +const DefaultMySQLVersion = "8.0.40" const LegacyMySQLVersion = "5.7.31" diff --git a/go/vt/servenv/buildinfo_test.go b/go/vt/servenv/buildinfo_test.go index bc972df03ea..a4a63cdb560 100644 --- a/go/vt/servenv/buildinfo_test.go +++ b/go/vt/servenv/buildinfo_test.go @@ -45,7 +45,7 @@ func TestVersionString(t *testing.T) { assert.Equal(t, "Version: v1.2.3-SNAPSHOT (Jenkins build 422) (Git revision d54b87ca0be09b678bb4490060e8f23f890ddb92 branch 'gitBranch') built on time is now by user@host using 1.20.2 amiga/amd64", v.String()) - assert.Equal(t, "8.0.30-Vitess", v.MySQLVersion()) + assert.Equal(t, "8.0.40-Vitess", v.MySQLVersion()) } func TestBuildVersionStats(t *testing.T) { diff --git a/go/vt/vtgate/semantics/info_schema.go b/go/vt/vtgate/semantics/info_schema.go index 127f4a00960..b33a20620e4 100644 --- a/go/vt/vtgate/semantics/info_schema.go +++ b/go/vt/vtgate/semantics/info_schema.go @@ -699,7 +699,7 @@ func getInfoSchema57() map[string][]vindexes.Column { // getInfoSchema80 returns a map of all information_schema tables and their columns with types // To recreate this information from MySQL, you can run the test in info_schema_gen_test.go func getInfoSchema80() map[string][]vindexes.Column { - parser, err := sqlparser.New(sqlparser.Options{MySQLServerVersion: "8.0.30"}) + parser, err := sqlparser.New(sqlparser.Options{MySQLServerVersion: "8.0.40"}) if err != nil { panic(err) } diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index dd554e64501..a52048576a1 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -57,25 +57,6 @@ 3.12.4 test - - - org.powermock - powermock-api-mockito2 - 2.0.9 - test - - - org.powermock - powermock-core - 2.0.9 - test - - - org.powermock - powermock-module-junit4 - 2.0.9 - test - diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java index 318bf44d328..d02dd416d05 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java @@ -28,15 +28,7 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@PrepareForTest(FieldWithMetadata.class) -@RunWith(PowerMockRunner.class) + public class FieldWithMetadataTest extends BaseTest { @Test @@ -492,92 +484,6 @@ public void testToString() throws SQLException { Assert.assertEquals(result, field.toString()); } - public void testCollations() throws Exception { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - String first = fieldWithMetadata.getCollation(); - String second = fieldWithMetadata.getCollation(); - - Assert.assertEquals("utf8_general_ci", first); - Assert.assertEquals("cached response is same as first", first, second); - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - try { - raw = raw.toBuilder() - // value chosen because it's obviously out of bounds for the underlying array - .setCharset(Integer.MAX_VALUE).build(); - - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - fieldWithMetadata.getCollation(); - Assert.fail("Should have received an array index out of bounds because " - + "charset/collationIndex of Int.MAX is well above size of charset array"); - } catch (SQLException e) { - if (e.getCause() instanceof ArrayIndexOutOfBoundsException) { - Assert.assertEquals("CollationIndex '" + Integer.MAX_VALUE + "' out of bounds for " - + "collationName lookup, should be within 0 and " - + CharsetMapping.COLLATION_INDEX_TO_COLLATION_NAME.length, e.getMessage()); - } else { - // just rethrow so we fail that way - throw e; - } - } - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - //Mockito.verify(fieldWithMetadata, Mockito.times(1)).getCollationIndex(); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("null response when not including all fields", null, - fieldWithMetadata.getCollation()); - - // We should not call this at all, because we're short circuiting due to included fields - //Mockito.verify(fieldWithMetadata, Mockito.never()).getCollationIndex(); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - - @Test - public void testMaxBytesPerChar() throws Exception { - VitessConnection conn = PowerMockito.spy(getVitessConnection()); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - - int first = fieldWithMetadata.getMaxBytesPerCharacter(); - int second = fieldWithMetadata.getMaxBytesPerCharacter(); - - Assert.assertEquals("cached response is same as first", first, second); - // We called getMaxBytesPerCharacter 2 times above, but should only have made 1 call to - // fieldWithMetadata.getMaxBytesPerChar: - // first - call conn - // second - return cached - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(1)) - .getMaxBytesPerChar(33, "UTF-8"); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("0 return value when not including all fields", 0, - fieldWithMetadata.getMaxBytesPerCharacter()); - - // We should not call this function because we short circuited due to not including all fields. - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(0)) - .getMaxBytesPerChar(33, "UTF-8"); - // Should not be called at all, because it's new for just this test - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - @Test public void testGetEncodingForIndex() throws SQLException { Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java index 415790ed3f4..e10c97c8636 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java @@ -40,15 +40,11 @@ import java.util.Properties; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) public class VitessConnectionTest extends BaseTest { @Test @@ -118,13 +114,13 @@ public void testDefaultSetAutoCommitForClose() throws SQLException { @Test public void testCommit() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); + VTSession mockSession = Mockito.mock(VTSession.class); VitessConnection vitessConnection = getVitessConnection(); Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); privateVTSessionField.setAccessible(true); privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(false); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(false); + Mockito.when(mockSession.isInTransaction()).thenReturn(false); + Mockito.when(mockSession.isAutoCommit()).thenReturn(false); vitessConnection.commit(); } @@ -159,13 +155,13 @@ public void testClosed() throws SQLException { @Test(expected = SQLException.class) public void testClosedForException() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); + VTSession mockSession = Mockito.mock(VTSession.class); VitessConnection vitessConnection = getVitessConnection(); Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); privateVTSessionField.setAccessible(true); privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(true); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(true); + Mockito.when(mockSession.isInTransaction()).thenReturn(true); + Mockito.when(mockSession.isAutoCommit()).thenReturn(true); vitessConnection.close(); } diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java index 92d5cfede9b..e1e50e8a6e6 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java @@ -19,37 +19,26 @@ import com.google.common.base.Charsets; import com.google.common.io.CharStreams; import com.google.protobuf.ByteString; - import io.vitess.client.cursor.Cursor; import io.vitess.client.cursor.SimpleCursor; import io.vitess.proto.Query; import io.vitess.util.Constants; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Types; +import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.Scanner; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - /** * Created by ashudeep.sharma on 08/03/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VitessMySQLDatabaseMetadata.class, VitessConnection.class}) public class VitessDatabaseMetadataTest extends BaseTest { private ResultSet resultSet; @@ -860,19 +849,19 @@ public void autoCommitFailureClosesAllResultSetsTest() throws SQLException { @Test public void getUrlTest() throws SQLException { String connectionUrl = "jdbc:vitess://://"; - VitessJDBCUrl mockUrl = PowerMockito.mock(VitessJDBCUrl.class); - PowerMockito.when(mockUrl.getUrl()).thenReturn(connectionUrl); + VitessJDBCUrl mockUrl = Mockito.mock(VitessJDBCUrl.class); + Mockito.when(mockUrl.getUrl()).thenReturn(connectionUrl); - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.getUrl()).thenReturn(mockUrl); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.getUrl()).thenReturn(mockUrl); Assert.assertEquals(connectionUrl, mockConn.getUrl().getUrl()); } @Test public void isReadOnlyTest() throws SQLException { - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.isReadOnly()).thenReturn(false); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isReadOnly()).thenReturn(false); Assert.assertEquals(false, mockConn.isReadOnly()); } @@ -1022,74 +1011,6 @@ public void supportsStatementPooling() throws SQLException { Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.supportsStatementPooling()); } - @Test - public void getCatalogsTest() throws SQLException, Exception { - String sql = "SHOW DATABASES"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR).build()).addRows( - Query.Row.newBuilder().addLengths("vitessDB".length()) - .setValues(ByteString.copyFromUtf8("vitessDB"))).addRows( - Query.Row.newBuilder().addLengths("sampleDB".length()) - .setValues(ByteString.copyFromUtf8("sampleDB"))).addRows( - Query.Row.newBuilder().addLengths("testDB".length()) - .setValues(ByteString.copyFromUtf8("testDB"))).addRows( - Query.Row.newBuilder().addLengths("dummyDB".length()) - .setValues(ByteString.copyFromUtf8("dummyDB"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - ResultSet resultSet = vitessDatabaseMetaData.getCatalogs(); - ArrayList resultSetList = new ArrayList(); - while (resultSet.next()) { - resultSetList.add(resultSet.getString(1)); - } - Assert.assertEquals("dummyDB", resultSetList.get(0)); - Assert.assertEquals("sampleDB", resultSetList.get(1)); - Assert.assertEquals("testDB", resultSetList.get(2)); - Assert.assertEquals("vitessDB", resultSetList.get(3)); - } - - @Test - public void getTablesTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(mockedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getTablesProperResultTypeTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - actualResultSet.next(); - Assert.assertEquals(String.class, actualResultSet.getObject("TABLE_CAT").getClass()); - } - private Cursor getTablesCursor() throws Exception { return new SimpleCursor(Query.QueryResult.newBuilder() .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) @@ -1131,231 +1052,6 @@ private Cursor getTablesCursor() throws Exception { .build()); } - @Test - public void getColumnsTest() throws SQLException, Exception { - - String sql = "SHOW FULL COLUMNS FROM `sampleTable1` FROM `TestDB1` LIKE '%'"; - Cursor mockedTablecursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_TYPE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("SELF_REFERENCING_COL_NAME") - .setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REF_GENERATION").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("sampleTable1".length()).addLengths("TABLE".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB1sampleTable1TABLE"))).build()); - - Cursor actualCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Field").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Key").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Default").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Extra").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Privileges").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)).addRows( - Query.Row.newBuilder().addLengths("shipmentid".length()).addLengths("bigint".length()) - .addLengths("NULL".length()).addLengths("NO".length()).addLengths("PRI".length()) - .addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString - .copyFromUtf8("shipmentidbigintNULLNOPRINULLselect,insert,update,references"))) - .addRows( - Query.Row.newBuilder().addLengths("trackingid".length()).addLengths("varchar".length()) - .addLengths("utf8_general_ci".length()).addLengths("YES".length()) - .addLengths("".length()).addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8( - "trackingidvarcharutf8_general_ciYESNULLselect,insert,update,references"))) - .build()); - Cursor expectedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_SIZE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("BUFFER_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("DECIMAL_DIGITS").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NUM_PREC_RADIX").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NULLABLE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_DEF").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SQL_DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("SQL_DATETIME_SUB").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("CHAR_OCTET_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ISNULLABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_CATALOG").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_SCHEMA").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_TABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SOURCE_DATA_TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("IS_AUTOINCREMENT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("IS_GENERATEDCOLUMN").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("shipmentid".length()) - .addLengths("-5".length()).addLengths("BIGINT".length()).addLengths("19".length()) - .addLengths("65535".length()).addLengths("0".length()).addLengths("10".length()) - .addLengths("0".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("0".length()) - .addLengths("1".length()).addLengths("NO".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1shipmentid-5BIGINT19655350100CommentNULL0001NONONO"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("trackingid".length()) - .addLengths("12".length()).addLengths("VARCHAR".length()).addLengths("255".length()) - .addLengths("65535".length()).addLengths(-1).addLengths("10".length()) - .addLengths("1".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("255".length()) - .addLengths("2".length()).addLengths("YES".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1trackingid12VARCHAR25565535101CommentNULL002552YESNONO"))) - .build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(actualCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getColumns("TestDB1", null, null, null); - PowerMockito.when(vitessDatabaseMetaData.getTables("TestDB1", null, "%", new String[0])) - .thenReturn(new VitessResultSet(mockedTablecursor)); - ResultSet actualResultSet = vitessDatabaseMetaData.getColumns("TestDB1", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(expectedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getPrimaryKeysTest() throws SQLException, Exception { - - String sql = "SHOW KEYS FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("KEY_SEQ").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("PK_NAME").setType(Query.Type.CHAR)).addRows( - Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("shipmentid".length()) - .addLengths("1".length()).addLengths("PRIMARY".length()) - .setValues(ByteString.copyFromUtf8("vtshipmentshipmentid1PRIMARY"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getPrimaryKeys("vt", null, "shipment"); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet expectedResultSet = vitessDatabaseMetaData.getPrimaryKeys("vt", null, "shipment"); - ResultSet actualResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getIndexInfoTest() throws SQLException, Exception { - - String sql = "SHOW INDEX FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.BIT)) - .addFields(Query.Field.newBuilder().setName("INDEX_QUALIFIER").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("INDEX_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("ASC_OR_DESC").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("CARDINALITY").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("PAGES").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("FILTER_CONDITION").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("false".length()).addLengths("".length()) - .addLengths("PRIMARY".length()).addLengths("3".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths("0".length()).addLengths(-1) - .setValues(ByteString.copyFromUtf8("vtshipmentfalsePRIMARY31shipmentidA4348800"))) - .build()); - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getIndexInfo("vt", null, "shipment", true, false); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet actualResultSet = vitessDatabaseMetaData - .getIndexInfo("vt", null, "shipment", true, false); - ResultSet expectedResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - private void assertResultSetEquals(ResultSet actualResultSet, ResultSet expectedResultSet) throws SQLException { ResultSetMetaData actualResultSetMetadata = actualResultSet.getMetaData(); @@ -1440,137 +1136,6 @@ public void getUserNameTest() { } } - @Test - public void testCaseSensitivityIdentifierFuncsMySql() throws Exception { - assertCaseSensitivityForDatabaseType(false); - } - - @Test - public void testCaseSensitivityIdentifierFuncsMariaDb() throws Exception { - assertCaseSensitivityForDatabaseType(true); - } - - private void assertCaseSensitivityForDatabaseType(boolean useMariaDb) throws Exception { - VitessConnection connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", - null); - mockStatementForLowercaseTablesValue("0", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("1", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("2", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("something random", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - } - - private void mockStatementForLowercaseTablesValue(String lcTablesValue, boolean useMariaDb) - throws Exception { - String sql = "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\', " - + "\'lower_case_table_names\')"; - String versionName = "innodb_version"; - String versionValue = "5.7.16-10"; - if (useMariaDb) { - versionValue = versionValue + "-mariadb"; - } - String txIsoName = "tx_isolation"; - String txIsoValue = "REPEATABLE-READ"; - String lcTablesName = "lower_case_table_names"; - - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("Variable_name").setType(Query.Type.VARCHAR).build()) - .addFields(Query.Field.newBuilder().setName("Value").setType(Query.Type.VARCHAR).build()) - .addRows(Query.Row.newBuilder().addLengths(versionName.length()) - .addLengths(versionValue.length()) - .setValues(ByteString.copyFromUtf8(versionName + versionValue))).addRows( - Query.Row.newBuilder().addLengths(txIsoName.length()).addLengths(txIsoValue.length()) - .setValues(ByteString.copyFromUtf8(txIsoName + txIsoValue))).addRows( - Query.Row.newBuilder().addLengths(lcTablesName.length()) - .addLengths(lcTablesValue.length()) - .setValues(ByteString.copyFromUtf8(lcTablesName + lcTablesValue))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - } - - /** - * Tests that we're properly stitching together the results of SHOW CREATE TABLE. See {@link - * #extractForeignKeyForTableTest()} for more thorough testing of the actual parsing - */ - @Test - public void getImportedKeysTest() throws Exception { - try (InputStream resourceAsStream = this.getClass() - .getResourceAsStream("/getImportedKeysTestCase.sql")) { - String table = "testA"; - String showCreate = CharStreams - .toString(new InputStreamReader(resourceAsStream, Charsets.UTF_8)); - - Query.QueryResult queryResult = Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Create Table").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths(table.length()).addLengths(showCreate.length()) - .setValues(ByteString.copyFromUtf8(table + showCreate))).build(); - - String sql = "SHOW CREATE TABLE `testA`"; - VitessConnection vitessConnection = new VitessConnection( - "jdbc:vitess://username@ip1:port1/keyspace", null); - VitessStatement vitessStatement = PowerMockito.spy(new VitessStatement(vitessConnection)); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.doReturn(new VitessResultSet(new SimpleCursor(queryResult), vitessStatement)) - .when(vitessStatement).executeQuery(sql); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - vitessConnection); - ResultSet importedKeys = vitessDatabaseMetaData.getImportedKeys("test", "test", "testA"); - importedKeys.next(); - Assert.assertEquals("test", importedKeys.getString("PKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("PKTABLE_SCHEM")); - Assert.assertEquals("fTable", importedKeys.getString("PKTABLE_NAME")); - Assert.assertEquals("id", importedKeys.getString("PKCOLUMN_NAME")); - Assert.assertEquals("test", importedKeys.getString("FKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("FKTABLE_SCHEM")); - Assert.assertEquals("testA", importedKeys.getString("FKTABLE_NAME")); - Assert.assertEquals("fIdOne", importedKeys.getString("FKCOLUMN_NAME")); - Assert.assertEquals(1, importedKeys.getInt("KEY_SEQ")); - Assert.assertEquals(3, importedKeys.getInt("UPDATE_RULE")); - Assert.assertEquals(3, importedKeys.getInt("DELETE_RULE")); - Assert.assertEquals("fk_testA", importedKeys.getString("FK_NAME")); - Assert.assertEquals(null, importedKeys.getString("PK_NAME")); - Assert.assertEquals(7, importedKeys.getInt("DEFERRABILITY")); - } - } - /** * Tests parsing all the various outputs of SHOW CREATE TABLE for the foreign key constraints. */ diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java index 8916063ffaf..890212d5071 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java @@ -16,20 +16,13 @@ package io.vitess.jdbc; +import org.junit.Assert; +import org.junit.Test; + import java.sql.ParameterMetaData; import java.sql.SQLException; import java.sql.Types; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessParameterMetaData.class) public class VitessParameterMetaDataTest { @Test @@ -70,22 +63,6 @@ public void testOutOfBoundsValidation() { } } - @Test - public void testOutOfBoundCoverage() throws Exception { - int param = 2; - VitessParameterMetaData metaData = PowerMockito.spy(new VitessParameterMetaData(5)); - - metaData.getParameterType(param); - metaData.getPrecision(param); - metaData.getScale(param); - metaData.getParameterClassName(param); - metaData.getParameterTypeName(param); - metaData.isSigned(param); - - PowerMockito.verifyPrivate(metaData, VerificationModeFactory.times(6)) - .invoke("checkBounds", param); - } - @Test(expected = SQLException.class) public void testNullableNotAvailable() throws SQLException { VitessParameterMetaData metaData = new VitessParameterMetaData(5); diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java index c5a9b4cbd33..2ebadf371ec 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java @@ -18,12 +18,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; import com.google.common.collect.ImmutableMap; @@ -59,19 +54,13 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 09/02/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) public class VitessPreparedStatementTest { private String sqlSelect = "select 1 from test_table"; @@ -81,7 +70,7 @@ public class VitessPreparedStatementTest { @Test public void testStatementExecute() { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement preparedStatement; try { preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); @@ -110,17 +99,17 @@ public void testStatementExecute() { @Test public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))). + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))). thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); VitessPreparedStatement preparedStatement; try { @@ -156,7 +145,7 @@ public void testExecuteQuery() throws SQLException { try { //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); preparedStatement.executeQuery(); fail("Should have thrown exception for cursor null"); } catch (SQLException ex) { @@ -170,19 +159,19 @@ public void testExecuteQuery() throws SQLException { @Test public void testExecuteQueryWithStream() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); VitessPreparedStatement preparedStatement; try { @@ -218,7 +207,7 @@ public void testExecuteQueryWithStream() throws SQLException { try { //when returned cursor is null - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(null); preparedStatement.executeQuery(); @@ -235,17 +224,17 @@ public void testExecuteQueryWithStream() throws SQLException { @Test public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List fieldList = Mockito.mock(ArrayList.class); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessPreparedStatement preparedStatement; try { @@ -257,14 +246,14 @@ public void testExecuteUpdate() throws SQLException { assertEquals(0, updateCount); //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); updateCount = preparedStatement.executeUpdate(); assertEquals(0, updateCount); //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); + Mockito.when(mockCursor.getFields()).thenReturn(fieldList); + Mockito.when(fieldList.isEmpty()).thenReturn(false); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for field not null"); @@ -273,7 +262,7 @@ public void testExecuteUpdate() throws SQLException { } //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for cursor null"); @@ -282,7 +271,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { preparedStatement.executeUpdate(); fail("Should have thrown exception for read only"); @@ -291,7 +280,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { preparedStatement.executeBatch(); fail("Should have thrown exception for read only"); @@ -306,31 +295,31 @@ public void testExecuteUpdate() throws SQLException { @Test public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List mockFieldList = Mockito.spy(new ArrayList<>()); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); try { int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - PowerMockito.doReturn(fieldSize).when(mockFieldList).size(); - PowerMockito.doReturn(false).when(mockFieldList).isEmpty(); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.doReturn(fieldSize).when(mockFieldList).size(); + Mockito.doReturn(false).when(mockFieldList).isEmpty(); boolean hasResultSet = preparedStatement.execute(); Assert.assertTrue(hasResultSet); Assert.assertNotNull(preparedStatement.getResultSet()); @@ -341,9 +330,9 @@ public void testExecute() throws SQLException { Assert.assertNotNull(preparedStatement.getResultSet()); int mockUpdateCount = 10; - when(mockCursor.getFields()) + Mockito.when(mockCursor.getFields()) .thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); hasResultSet = preparedStatement.execute(); Assert.assertFalse(hasResultSet); @@ -351,7 +340,7 @@ public void testExecute() throws SQLException { assertEquals(mockUpdateCount, preparedStatement.getUpdateCount()); //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); preparedStatement.execute(); @@ -375,19 +364,19 @@ public void testExecuteFetchSizeAsStreaming() throws SQLException { private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); @@ -408,32 +397,32 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun @Test public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFuture = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); try { - when(mockCursor.getRowsAffected()).thenReturn(10L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(10L); int updateCount = preparedStatement.executeUpdate(); assertEquals(10L, updateCount); assertEquals(10L, preparedStatement.getUpdateCount()); // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); updateCount = preparedStatement.executeUpdate(); assertEquals(Integer.MAX_VALUE, updateCount); assertEquals(Integer.MAX_VALUE, preparedStatement.getUpdateCount()); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); preparedStatement.executeQuery(); assertEquals(-1, preparedStatement.getUpdateCount()); @@ -444,7 +433,7 @@ public void testGetUpdateCount() throws SQLException { @Test public void testSetParameters() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTreatUtilDateAsTimestamp()).thenReturn(true); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); Boolean boolValue = true; @@ -565,7 +554,7 @@ public void testSetParameters() throws Exception { @Test public void testTreatUtilDateAsTimestamp() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); java.util.Date utilDateValue = new java.util.Date(System.currentTimeMillis()); @@ -593,24 +582,24 @@ public void testTreatUtilDateAsTimestamp() throws Exception { @Test public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); try { long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122}; int expectedAffectedRows = 2; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); //Executing Insert Statement VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlInsert, @@ -632,7 +621,7 @@ public void testAutoGeneratedKeys() throws SQLException { @Test public void testAddBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); try { statement.addBatch(this.sqlInsert); @@ -656,7 +645,7 @@ public void testAddBatch() throws SQLException { @Test public void testClearBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); statement.setString(1, "string1"); statement.addBatch(); @@ -674,25 +663,25 @@ public void testClearBatch() throws SQLException { @Test public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); int[] updateCounts = statement.executeBatch(); assertEquals(0, updateCounts.length); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockVtGateConn.executeBatch(nullable(Context.class), Matchers.anyList(), Matchers.anyList(), + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockVtGateConn.executeBatch(nullable(Context.class), Matchers.anyList(), Matchers.anyList(), nullable(VTSession.class))).thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); + CursorWithError mockCursorWithError1 = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError1.getError()).thenReturn(null); + Mockito.when(mockCursorWithError1.getCursor()).thenReturn(Mockito.mock(Cursor.class)); mockCursorWithErrorList.add(mockCursorWithError1); statement.setString(1, "string1"); @@ -700,10 +689,10 @@ public void testExecuteBatch() throws SQLException { updateCounts = statement.executeBatch(); assertEquals(1, updateCounts.length); - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); + CursorWithError mockCursorWithError2 = Mockito.mock(CursorWithError.class); Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() .setMessage("preparedStatement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); + Mockito.when(mockCursorWithError2.getError()).thenReturn(rpcError); mockCursorWithErrorList.add(mockCursorWithError2); statement.setString(1, "string1"); statement.addBatch(); @@ -721,7 +710,7 @@ public void testExecuteBatch() throws SQLException { @Test public void testStatementCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Map testCases = ImmutableMap.builder() .put("select * from foo where a = ?", 1).put("select * from foo where a = ? and b = ?", 2) .put("select * from foo where a = ? and b = \"?\"", 1) diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java index a2be875e0d0..bd753d2fcb5 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java @@ -40,18 +40,13 @@ import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Matchers; +import org.mockito.Mockito; import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessResultSet.class) public class VitessResultSetTest extends BaseTest { public Cursor getCursorWithRows() { @@ -635,230 +630,6 @@ public void testEnhancedFieldsFromCursor() throws Exception { assertEquals(cursor.getFields().size(), vitessResultSet.getFields().size()); } - @Test - public void testGetStringUsesEncoding() throws Exception { - VitessConnection conn = getVitessConnection(); - VitessResultSet resultOne = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultOne.next(); - // test all ways to get to convertBytesToString - - // Verify that we're going through convertBytesToString for column types that return bytes - // (string-like), - // but not for those that return a real object - //resultOne.getString("col21"); // is a string, should go through convert bytes - //resultOne.getString("col13"); // is a datetime, should not - //PowerMockito.verifyPrivate(resultOne, VerificationModeFactory.times(1)) - // .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - VitessResultSet resultTwo = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultTwo.next(); - - // neither of these should go through convertBytesToString, because we didn't include all fields - resultTwo.getString("col21"); - resultTwo.getString("col13"); - PowerMockito.verifyPrivate(resultTwo, VerificationModeFactory.times(0)) - .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - } - - @Test - public void testGetObjectForBitValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - value.write(new byte[]{1}); - value.write(new byte[]{0}); - value.write(new byte[]{1, 2, 3, 4}); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col3").setColumnLength(4).setType(Query.Type.BIT)) - .addRows(Query.Row.newBuilder().addLengths(1).addLengths(1).addLengths(4) - .setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(true, vitessResultSet.getObject(1)); - assertEquals(false, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(3)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(new byte[]{1}, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(new byte[]{0}, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForVarBinLikeValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - - byte[] binary = new byte[]{1, 2, 3, 4}; - byte[] varbinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; - byte[] blob = new byte[MysqlDefs.LENGTH_BLOB]; - for (int i = 0; i < blob.length; i++) { - blob[i] = 1; - } - byte[] fakeGeometry = new byte[]{2, 3, 4}; - - value.write(binary); - value.write(varbinary); - value.write(blob); - value.write(fakeGeometry); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(4) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(13) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.VARBINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col3") // should go to LONGVARBINARY due to below settings - .setColumnLength(MysqlDefs.LENGTH_BLOB) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.BLOB)).addFields( - Query.Field.newBuilder().setName("col4").setType(Query.Type.GEOMETRY) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addRows( - Query.Row.newBuilder().addLengths(4).addLengths(13).addLengths(MysqlDefs.LENGTH_BLOB) - .addLengths(3).setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // All of these types should pass straight through, returning the direct bytes - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // We should still call the function 4 times - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(4)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // Same as above since this doesn't really do much but pass right through for the varbinary type - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // Never call because not including all - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForStringLikeValues() throws Exception { - ByteString.Output value = ByteString.newOutput(); - - String trimmedCharStr = "wasting space"; - String varcharStr = "i have a variable length!"; - String masqueradingBlobStr = "look at me, im a blob"; - String textStr = "an enthralling string of TEXT in some foreign language"; - String jsonStr = "{\"status\": \"ok\"}"; - - int paddedCharColLength = 20; - byte[] trimmedChar = StringUtils.getBytes(trimmedCharStr, "UTF-16"); - byte[] varchar = StringUtils.getBytes(varcharStr, "UTF-8"); - byte[] masqueradingBlob = StringUtils.getBytes(masqueradingBlobStr, "US-ASCII"); - byte[] text = StringUtils.getBytes(textStr, "ISO8859_8"); - byte[] opaqueBinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; - byte[] json = StringUtils.getBytes(jsonStr, "UTF-8"); - - value.write(trimmedChar); - value.write(varchar); - value.write(opaqueBinary); - value.write(masqueradingBlob); - value.write(text); - value.write(json); - - Query.QueryResult result = Query.QueryResult.newBuilder() - // This tests CHAR - .addFields(Query.Field.newBuilder().setName("col1").setColumnLength(paddedCharColLength) - .setCharset(/* utf-16 collation index from CharsetMapping */ 54) - .setType(Query.Type.CHAR)) - // This tests VARCHAR - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(varchar.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.VARCHAR)) - // This tests VARCHAR that is an opaque binary - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(opaqueBinary.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.VARCHAR)) - // This tests LONGVARCHAR - .addFields(Query.Field.newBuilder().setName("col3").setColumnLength(masqueradingBlob.length) - .setCharset(/* us-ascii collation index from CharsetMapping */11) - .setType(Query.Type.BLOB)) - // This tests TEXT, which falls through the default case of the switch - .addFields(Query.Field.newBuilder().setName("col4").setColumnLength(text.length) - .setCharset(/* corresponds to greek, from CharsetMapping */25).setType(Query.Type.TEXT)) - .addFields(Query.Field.newBuilder().setName("col5").setColumnLength(json.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.JSON)) - .addRows(Query.Row.newBuilder().addLengths(trimmedChar.length).addLengths(varchar.length) - .addLengths(opaqueBinary.length).addLengths(masqueradingBlob.length) - .addLengths(text.length).addLengths(json.length).setValues(value.toByteString())) - .build(); - - VitessConnection conn = getVitessConnection(); - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(trimmedCharStr, vitessResultSet.getObject(1)); - assertEquals(varcharStr, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - assertEquals(masqueradingBlobStr, vitessResultSet.getObject(4)); - assertEquals(textStr, vitessResultSet.getObject(5)); - assertEquals(jsonStr, vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(6)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(trimmedChar, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varchar, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(masqueradingBlob, (byte[]) vitessResultSet.getObject(4)); - Assert.assertArrayEquals(text, (byte[]) vitessResultSet.getObject(5)); - Assert.assertArrayEquals(json, (byte[]) vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - @Test public void testGetClob() throws SQLException { VitessResultSet vitessResultSet = new VitessResultSet(new String[]{"clob"}, diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java index 3f4bb39a44c..b641cafdefb 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java @@ -22,15 +22,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyList; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.doReturn; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; import io.vitess.client.Context; import io.vitess.client.SQLFuture; @@ -52,18 +45,12 @@ import java.util.Map; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; /** * Created by harshit.gangal on 19/01/16. */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) public class VitessStatementTest { private String sqlSelect = "select 1 from test_table"; @@ -76,7 +63,7 @@ public class VitessStatementTest { @Test public void testGetConnection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(mockConn, statement.getConnection()); @@ -84,24 +71,24 @@ public void testGetConnection() throws SQLException { @Test public void testGetResultSet() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(null, statement.getResultSet()); } @Test public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //Empty Sql Statement @@ -116,13 +103,13 @@ public void testExecuteQuery() throws SQLException { assertEquals(-1, statement.getUpdateCount()); //autocommit is false and not in transaction - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); + Mockito.when(mockConn.getAutoCommit()).thenReturn(false); + Mockito.when(mockConn.isInTransaction()).thenReturn(false); rs = statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.executeQuery(sqlSelect); fail("Should have thrown exception for cursor null"); @@ -133,18 +120,18 @@ public void testExecuteQuery() throws SQLException { @Test public void testExecuteQueryWithStreamExecuteType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //Empty Sql Statement @@ -164,13 +151,13 @@ public void testExecuteQueryWithStreamExecuteType() throws SQLException { assertEquals(-1, statement.getUpdateCount()); //select on primary when tx is null and autocommit is false - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); + Mockito.when(mockConn.getAutoCommit()).thenReturn(false); + Mockito.when(mockConn.isInTransaction()).thenReturn(false); rs = statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); //when returned cursor is null - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(null); try { @@ -191,19 +178,19 @@ public void testExecuteFetchSizeAsStreaming() throws SQLException { private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn + Mockito.when(mockVtGateConn .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockCursor); @@ -224,17 +211,17 @@ private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRun @Test public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List fieldList = Mockito.mock(ArrayList.class); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); //executing dml on primary @@ -242,13 +229,13 @@ public void testExecuteUpdate() throws SQLException { assertEquals(0, updateCount); //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); updateCount = statement.executeUpdate(sqlUpdate); assertEquals(0, updateCount); //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); + Mockito.when(mockCursor.getFields()).thenReturn(fieldList); + Mockito.when(fieldList.isEmpty()).thenReturn(false); try { statement.executeUpdate(sqlSelect); fail("Should have thrown exception for field not null"); @@ -257,7 +244,7 @@ public void testExecuteUpdate() throws SQLException { } //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.executeUpdate(sqlUpdate); fail("Should have thrown exception for cursor null"); @@ -266,7 +253,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { statement.execute("UPDATE SET foo = 1 ON mytable WHERE id = 1"); fail("Should have thrown exception for read only"); @@ -275,7 +262,7 @@ public void testExecuteUpdate() throws SQLException { } //read only - when(mockConn.isReadOnly()).thenReturn(true); + Mockito.when(mockConn.isReadOnly()).thenReturn(true); try { statement.executeBatch(); fail("Should have thrown exception for read only"); @@ -286,27 +273,27 @@ public void testExecuteUpdate() throws SQLException { @Test public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + List mockFieldList = Mockito.spy(new ArrayList<>()); + + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getAutoCommit()).thenReturn(true); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); VitessStatement statement = new VitessStatement(mockConn); int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - doReturn(fieldSize).when(mockFieldList).size(); - doReturn(false).when(mockFieldList).isEmpty(); + Mockito.when(mockCursor.getFields()).thenReturn(mockFieldList); + Mockito.doReturn(fieldSize).when(mockFieldList).size(); + Mockito.doReturn(false).when(mockFieldList).isEmpty(); boolean hasResultSet = statement.execute(sqlSelect); assertTrue(hasResultSet); @@ -317,15 +304,15 @@ public void testExecute() throws SQLException { assertNotNull(statement.getResultSet()); int mockUpdateCount = 10; - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); hasResultSet = statement.execute(sqlUpdate); assertFalse(hasResultSet); assertNull(statement.getResultSet()); assertEquals(mockUpdateCount, statement.getUpdateCount()); //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(null); try { statement.execute(sqlUpdate); fail("Should have thrown exception for cursor null"); @@ -336,47 +323,47 @@ public void testExecute() throws SQLException { @Test public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFuture = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); - when(mockCursor.getRowsAffected()).thenReturn(10L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(10L); int updateCount = statement.executeUpdate(sqlUpdate); assertEquals(10L, updateCount); assertEquals(10L, statement.getUpdateCount()); // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); + Mockito.when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); updateCount = statement.executeUpdate(sqlUpdate); assertEquals(Integer.MAX_VALUE, updateCount); assertEquals(Integer.MAX_VALUE, statement.getUpdateCount()); - when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); statement.executeQuery(sqlSelect); assertEquals(-1, statement.getUpdateCount()); } @Test public void testClose() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); + Mockito.when(mockConn.isSimpleExecute()).thenReturn(true); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); VitessStatement statement = new VitessStatement(mockConn); ResultSet rs = statement.executeQuery(sqlSelect); @@ -391,7 +378,7 @@ public void testClose() throws Exception { @Test public void testGetMaxFieldSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(65535, statement.getMaxFieldSize()); @@ -399,7 +386,7 @@ public void testGetMaxFieldSize() throws SQLException { @Test public void testGetMaxRows() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); @@ -417,7 +404,7 @@ public void testGetMaxRows() throws SQLException { @Test public void testGetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); VitessStatement statement = new VitessStatement(mockConn); @@ -426,7 +413,7 @@ public void testGetQueryTimeout() throws SQLException { @Test public void testGetQueryTimeoutZeroDefault() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn(0L); VitessStatement statement = new VitessStatement(mockConn); @@ -435,7 +422,7 @@ public void testGetQueryTimeoutZeroDefault() throws SQLException { @Test public void testSetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); VitessStatement statement = new VitessStatement(mockConn); @@ -457,7 +444,7 @@ public void testSetQueryTimeout() throws SQLException { @Test public void testGetWarnings() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertNull(statement.getWarnings()); @@ -465,7 +452,7 @@ public void testGetWarnings() throws SQLException { @Test public void testGetFetchDirection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection()); @@ -473,7 +460,7 @@ public void testGetFetchDirection() throws SQLException { @Test public void testGetFetchSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(0, statement.getFetchSize()); @@ -481,7 +468,7 @@ public void testGetFetchSize() throws SQLException { @Test public void testGetResultSetConcurrency() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.CONCUR_READ_ONLY, statement.getResultSetConcurrency()); @@ -489,7 +476,7 @@ public void testGetResultSetConcurrency() throws SQLException { @Test public void testGetResultSetType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertEquals(ResultSet.TYPE_FORWARD_ONLY, statement.getResultSetType()); @@ -497,7 +484,7 @@ public void testGetResultSetType() throws SQLException { @Test public void testIsClosed() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); assertFalse(statement.isClosed()); @@ -507,23 +494,23 @@ public void testIsClosed() throws SQLException { @Test public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); VitessStatement statement = new VitessStatement(mockConn); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; int expectedAffectedRows = 5; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); //Executing Insert Statement int updateCount = statement.executeUpdate(sqlInsert, Statement.RETURN_GENERATED_KEYS); @@ -550,7 +537,7 @@ public void testAutoGeneratedKeys() throws SQLException { //Fetching Generated Keys on update query expectedFirstGeneratedId = 0; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); updateCount = statement.executeUpdate(sqlUpdate, Statement.RETURN_GENERATED_KEYS); assertEquals(expectedAffectedRows, updateCount); @@ -560,7 +547,7 @@ public void testAutoGeneratedKeys() throws SQLException { @Test public void testAddBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); statement.addBatch(sqlInsert); Field privateStringField = VitessStatement.class.getDeclaredField("batchedArgs"); @@ -570,7 +557,7 @@ public void testAddBatch() throws Exception { @Test public void testClearBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); statement.addBatch(sqlInsert); statement.clearBatch(); @@ -581,36 +568,36 @@ public void testClearBatch() throws Exception { @Test public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); int[] updateCounts = statement.executeBatch(); assertEquals(0, updateCounts.length); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when( + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); + CursorWithError mockCursorWithError1 = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError1.getError()).thenReturn(null); + Mockito.when(mockCursorWithError1.getCursor()).thenReturn(Mockito.mock(Cursor.class)); mockCursorWithErrorList.add(mockCursorWithError1); statement.addBatch(sqlUpdate); updateCounts = statement.executeBatch(); assertEquals(1, updateCounts.length); - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); + CursorWithError mockCursorWithError2 = Mockito.mock(CursorWithError.class); Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() .setMessage("statement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); + Mockito.when(mockCursorWithError2.getError()).thenReturn(rpcError); mockCursorWithErrorList.add(mockCursorWithError2); statement.addBatch(sqlUpdate); statement.addBatch(sqlUpdate); @@ -627,33 +614,33 @@ public void testExecuteBatch() throws SQLException { @Test public void testBatchGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when( + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); + CursorWithError mockCursorWithError = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError.getError()).thenReturn(null); + Mockito.when(mockCursorWithError.getCursor()).thenReturn(mockCursor); mockCursorWithErrorList.add(mockCursorWithError); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); statement.addBatch(sqlInsert); statement.executeBatch(); @@ -668,33 +655,33 @@ public void testBatchGeneratedKeys() throws SQLException { @Test public void testBatchUpsertGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); + VitessConnection mockConn = Mockito.mock(VitessConnection.class); VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); + Cursor mockCursor = Mockito.mock(Cursor.class); + SQLFuture mockSqlFutureCursor = Mockito.mock(SQLFuture.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); + VTGateConnection mockVtGateConn = Mockito.mock(VTGateConnection.class); + Mockito.when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); + Mockito.when(mockConn.getAutoCommit()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); + Mockito.when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when( + Mockito.when( mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) .thenReturn(mockSqlFutureCursor); List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); + Mockito.when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); + CursorWithError mockCursorWithError = Mockito.mock(CursorWithError.class); + Mockito.when(mockCursorWithError.getError()).thenReturn(null); + Mockito.when(mockCursorWithError.getCursor()).thenReturn(mockCursor); mockCursorWithErrorList.add(mockCursorWithError); long expectedFirstGeneratedId = 121; long[] expectedGeneratedIds = {121, 122}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); + Mockito.when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); statement.addBatch(sqlUpsert); statement.executeBatch(); @@ -709,8 +696,8 @@ public void testBatchUpsertGeneratedKeys() throws SQLException { } VitessStatement noUpdate = new VitessStatement(mockConn); - when(mockCursor.getInsertId()).thenReturn(0L); - when(mockCursor.getRowsAffected()).thenReturn(1L); + Mockito.when(mockCursor.getInsertId()).thenReturn(0L); + Mockito.when(mockCursor.getRowsAffected()).thenReturn(1L); noUpdate.addBatch(sqlUpsert); noUpdate.executeBatch(); diff --git a/test.go b/test.go index 4922f4f88f1..ebe0d2ded2d 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql80", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "40", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "41", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index 84f084e41e1..733377418f8 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=40 +ARG bootstrap_version=41 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" From 78f633cd58716cc991bf537d0836646fc739a0d8 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 21 Jan 2025 17:46:23 +0530 Subject: [PATCH 47/66] Views: VTGate changes for seamless integration (#17439) Signed-off-by: Harshit Gangal --- go/flags/endtoend/vtcombo.txt | 2 +- go/flags/endtoend/vtgate.txt | 2 +- go/test/vschemawrapper/vschema_wrapper.go | 11 ++++ go/vt/vtgate/executor_test.go | 24 ++++---- go/vt/vtgate/executorcontext/vcursor_impl.go | 29 ++++++++-- go/vt/vtgate/planbuilder/ddl.go | 58 +++++++++++++++++-- .../plancontext/planning_context_test.go | 5 ++ .../vtgate/planbuilder/plancontext/vschema.go | 2 + go/vt/vtgate/vindexes/vschema.go | 3 +- go/vt/vtgate/vschema_manager.go | 23 ++++++-- go/vt/vtgate/vtgate.go | 2 +- 11 files changed, 131 insertions(+), 30 deletions(-) diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 25deea04548..b9da44a5e79 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -111,7 +111,7 @@ Flags: --enable-partial-keyspace-migration (Experimental) Follow shard routing rules: enable only while migrating a keyspace shard by shard. See documentation on Partial MoveTables for more. (default false) --enable-per-workload-table-metrics If true, query counts and query error metrics include a label that identifies the workload --enable-tx-throttler Synonym to -enable_tx_throttler - --enable-views Enable views support in vtgate. + --enable-views Enable views support in vtgate. (default true) --enable_buffer Enable buffering (stalling) of primary traffic during failovers. --enable_buffer_dry_run Detect and log failover events, but do not actually buffer requests. --enable_consolidator This option enables the query consolidator. (default true) diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index bfecdd07288..5d3f35ef7e1 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -57,7 +57,7 @@ Flags: --emit_stats If set, emit stats to push-based monitoring and stats backends --enable-balancer Enable the tablet balancer to evenly spread query load for a given tablet type --enable-partial-keyspace-migration (Experimental) Follow shard routing rules: enable only while migrating a keyspace shard by shard. See documentation on Partial MoveTables for more. (default false) - --enable-views Enable views support in vtgate. + --enable-views Enable views support in vtgate. (default true) --enable_buffer Enable buffering (stalling) of primary traffic during failovers. --enable_buffer_dry_run Detect and log failover events, but do not actually buffer requests. --enable_direct_ddl Allow users to submit direct DDL statements (default true) diff --git a/go/test/vschemawrapper/vschema_wrapper.go b/go/test/vschemawrapper/vschema_wrapper.go index f4f2e6ce25a..5b1c6b033e6 100644 --- a/go/test/vschemawrapper/vschema_wrapper.go +++ b/go/test/vschemawrapper/vschema_wrapper.go @@ -273,6 +273,17 @@ func (vw *VSchemaWrapper) FindView(tab sqlparser.TableName) sqlparser.TableState return vw.V.FindView(destKeyspace, tab.Name.String()) } +func (vw *VSchemaWrapper) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + destKeyspace, _, _, err := topoproto.ParseDestination(name.Qualifier.String(), topodatapb.TabletType_PRIMARY) + if err != nil { + return nil, err + } + if ks, ok := vw.V.Keyspaces[destKeyspace]; ok { + return ks.Keyspace, nil + } + return nil, nil +} + func (vw *VSchemaWrapper) FindTableOrVindex(tab sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) { return vw.Vcursor.FindTableOrVindex(tab) } diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 8b06870e7e1..859e6a05973 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -1277,17 +1277,19 @@ func TestExecutorDDL(t *testing.T) { } for _, stmt := range stmts2 { - sbc1.ExecCount.Store(0) - sbc2.ExecCount.Store(0) - sbclookup.ExecCount.Store(0) - _, err := executor.Execute(ctx, nil, "TestExecute", econtext.NewSafeSession(&vtgatepb.Session{TargetString: ""}), stmt.input, nil) - if stmt.hasErr { - require.EqualError(t, err, econtext.ErrNoKeyspace.Error(), "expect query to fail") - testQueryLog(t, executor, logChan, "TestExecute", "", stmt.input, 0) - } else { - require.NoError(t, err) - testQueryLog(t, executor, logChan, "TestExecute", "DDL", stmt.input, 8) - } + t.Run(stmt.input, func(t *testing.T) { + sbc1.ExecCount.Store(0) + sbc2.ExecCount.Store(0) + sbclookup.ExecCount.Store(0) + _, err := executor.Execute(ctx, nil, "TestExecute", econtext.NewSafeSession(&vtgatepb.Session{TargetString: ""}), stmt.input, nil) + if stmt.hasErr { + assert.EqualError(t, err, econtext.ErrNoKeyspace.Error(), "expect query to fail") + testQueryLog(t, executor, logChan, "TestExecute", "", stmt.input, 0) + } else { + assert.NoError(t, err) + testQueryLog(t, executor, logChan, "TestExecute", "DDL", stmt.input, 8) + } + }) } } diff --git a/go/vt/vtgate/executorcontext/vcursor_impl.go b/go/vt/vtgate/executorcontext/vcursor_impl.go index 39a91416321..79a46c86496 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl.go @@ -392,7 +392,7 @@ func (vc *VCursorImpl) StartPrimitiveTrace() func() engine.Stats { // FindTable finds the specified table. If the keyspace what specified in the input, it gets used as qualifier. // Otherwise, the keyspace from the request is used, if one was provided. func (vc *VCursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) { - destKeyspace, destTabletType, dest, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, dest, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, "", destTabletType, nil, err } @@ -407,7 +407,7 @@ func (vc *VCursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, str } func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.TableStatement { - ks, _, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) + ks, _, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil } @@ -418,7 +418,7 @@ func (vc *VCursorImpl) FindView(name sqlparser.TableName) sqlparser.TableStateme } func (vc *VCursorImpl) FindRoutedTable(name sqlparser.TableName) (*vindexes.Table, error) { - destKeyspace, destTabletType, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, err } @@ -442,7 +442,7 @@ func (vc *VCursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return vc.getDualTable() } - destKeyspace, destTabletType, dest, err := ParseDestinationTarget(name.Qualifier.String(), vc.tabletType, vc.vschema) + destKeyspace, destTabletType, dest, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, nil, "", destTabletType, nil, err } @@ -456,7 +456,24 @@ func (vc *VCursorImpl) FindTableOrVindex(name sqlparser.TableName) (*vindexes.Ta return table, vindex, destKeyspace, destTabletType, dest, nil } -func (vc *VCursorImpl) ParseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) { +// FindViewTarget finds the specified view's target keyspace. +func (vc *VCursorImpl) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + destKeyspace, _, _, err := vc.parseDestinationTarget(name.Qualifier.String()) + if err != nil { + return nil, err + } + if destKeyspace != "" { + return vc.FindKeyspace(destKeyspace) + } + + tbl, err := vc.vschema.FindRoutedTable("", name.Name.String(), vc.tabletType) + if err != nil || tbl == nil { + return nil, err + } + return tbl.Keyspace, nil +} + +func (vc *VCursorImpl) parseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) { return ParseDestinationTarget(targetString, vc.tabletType, vc.vschema) } @@ -1319,7 +1336,7 @@ func (vc *VCursorImpl) GetAggregateUDFs() []string { // FindMirrorRule finds the mirror rule for the requested table name and // VSchema tablet type. func (vc *VCursorImpl) FindMirrorRule(name sqlparser.TableName) (*vindexes.MirrorRule, error) { - destKeyspace, destTabletType, _, err := vc.ParseDestinationTarget(name.Qualifier.String()) + destKeyspace, destTabletType, _, err := vc.parseDestinationTarget(name.Qualifier.String()) if err != nil { return nil, err } diff --git a/go/vt/vtgate/planbuilder/ddl.go b/go/vt/vtgate/planbuilder/ddl.go index 332f2aaa6c3..2ca924c31ab 100644 --- a/go/vt/vtgate/planbuilder/ddl.go +++ b/go/vt/vtgate/planbuilder/ddl.go @@ -199,6 +199,10 @@ func buildCreateViewCommon( ddlSelect sqlparser.TableStatement, ddl sqlparser.DDLStatement, ) (key.Destination, *vindexes.Keyspace, error) { + if vschema.IsViewsEnabled() { + return createViewEnabled(vschema, reservedVars, ddlSelect, ddl) + } + // For Create View, we require that the keyspace exist and the select query can be satisfied within the keyspace itself // We should remove the keyspace name from the table name, as the database name in MySQL might be different than the keyspace name destination, keyspace, err := findTableDestinationAndKeyspace(vschema, ddl) @@ -228,9 +232,6 @@ func buildCreateViewCommon( sqlparser.RemoveKeyspace(ddl) - if vschema.IsViewsEnabled() { - return destination, keyspace, nil - } isRoutePlan, opCode := tryToGetRoutePlan(selectPlan.primitive) if !isRoutePlan { return nil, nil, vterrors.VT12001(ViewComplex) @@ -241,6 +242,55 @@ func buildCreateViewCommon( return destination, keyspace, nil } +func createViewEnabled(vschema plancontext.VSchema, reservedVars *sqlparser.ReservedVars, ddlSelect sqlparser.TableStatement, ddl sqlparser.DDLStatement) (key.Destination, *vindexes.Keyspace, error) { + // For Create View, we require that the keyspace exist and the select query can be satisfied within the keyspace itself + // We should remove the keyspace name from the table name, as the database name in MySQL might be different than the keyspace name + destination, keyspace, err := findTableDestinationAndKeyspace(vschema, ddl) + if err != nil { + return nil, nil, err + } + + // views definition with `select *` should not be expanded as schema tracker might not be up-to-date + // We copy the expressions and restore them after the planning context is created + var expressions []sqlparser.SelectExprs + _ = sqlparser.VisitAllSelects(ddlSelect, func(p *sqlparser.Select, idx int) error { + expressions = append(expressions, sqlparser.Clone(p.SelectExprs)) + return nil + }) + + pCtx, err := plancontext.CreatePlanningContext(ddlSelect, reservedVars, vschema, Gen4) + if err != nil { + return nil, nil, err + } + + var tblKs string + for _, tbl := range pCtx.SemTable.Tables { + vTbl := tbl.GetVindexTable() + if vTbl == nil { + continue + } + if tblKs == "" { + tblKs = vTbl.Keyspace.Name + } + if tblKs != vTbl.Keyspace.Name { + return nil, nil, vterrors.VT12001(ViewComplex) + } + } + + if tblKs != keyspace.Name { + return nil, nil, vterrors.VT12001(ViewDifferentKeyspace) + } + + _ = sqlparser.VisitAllSelects(ddlSelect, func(p *sqlparser.Select, idx int) error { + p.SelectExprs = expressions[idx] + return nil + }) + + sqlparser.RemoveKeyspace(ddl) + + return destination, keyspace, nil +} + func buildDropView(vschema plancontext.VSchema, ddlStatement sqlparser.DDLStatement) (key.Destination, *vindexes.Keyspace, error) { if !vschema.IsViewsEnabled() { return buildDropTable(vschema, ddlStatement) @@ -248,7 +298,7 @@ func buildDropView(vschema plancontext.VSchema, ddlStatement sqlparser.DDLStatem var ks *vindexes.Keyspace viewMap := make(map[string]any) for _, tbl := range ddlStatement.GetFromTables() { - _, ksForView, _, err := vschema.TargetDestination(tbl.Qualifier.String()) + ksForView, err := vschema.FindViewTarget(tbl) if err != nil { return nil, nil, err } diff --git a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go index 87b18ee436a..2844f7e87dc 100644 --- a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go +++ b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go @@ -186,6 +186,11 @@ func createPlanContext(st *semantics.SemTable) *PlanningContext { type vschema struct{} +func (v *vschema) FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) { + // TODO implement me + panic("implement me") +} + func (v *vschema) FindTable(tablename sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) { // TODO implement me panic("implement me") diff --git a/go/vt/vtgate/planbuilder/plancontext/vschema.go b/go/vt/vtgate/planbuilder/plancontext/vschema.go index 7a2273afe46..c810324f369 100644 --- a/go/vt/vtgate/planbuilder/plancontext/vschema.go +++ b/go/vt/vtgate/planbuilder/plancontext/vschema.go @@ -26,6 +26,8 @@ type PlannerVersion = querypb.ExecuteOptions_PlannerVersion type VSchema interface { FindTable(tablename sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) FindView(name sqlparser.TableName) sqlparser.TableStatement + // FindViewTarget finds the target keyspace for the view table provided. + FindViewTarget(name sqlparser.TableName) (*vindexes.Keyspace, error) FindTableOrVindex(tablename sqlparser.TableName) (*vindexes.Table, vindexes.Vindex, string, topodatapb.TabletType, key.Destination, error) // SelectedKeyspace returns the current keyspace if set, otherwise returns an error diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 36fcb2045fa..05081a3c9ba 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -57,6 +57,7 @@ const ( TypeTable = "" TypeSequence = "sequence" TypeReference = "reference" + TypeView = "view" ) // VSchema represents the denormalized version of SrvVSchema, @@ -439,7 +440,7 @@ func (vschema *VSchema) AddView(ksname, viewName, query string, parser *sqlparse } ks.Views[viewName] = selectStmt t := &Table{ - Type: "View", + Type: TypeView, Name: sqlparser.NewIdentifierCS(viewName), Keyspace: ks.Keyspace, ColumnListAuthoritative: true, diff --git a/go/vt/vtgate/vschema_manager.go b/go/vt/vtgate/vschema_manager.go index 529f9a5a29d..49674951ed7 100644 --- a/go/vt/vtgate/vschema_manager.go +++ b/go/vt/vtgate/vschema_manager.go @@ -204,21 +204,34 @@ func (vm *VSchemaManager) buildAndEnhanceVSchema(v *vschemapb.SrvVSchema) *vinde func (vm *VSchemaManager) updateFromSchema(vschema *vindexes.VSchema) { for ksName, ks := range vschema.Keyspaces { - vm.updateTableInfo(vschema, ks, ksName) vm.updateViewInfo(ks, ksName) + vm.updateTableInfo(vschema, ks, ksName) vm.updateUDFsInfo(ks, ksName) } } func (vm *VSchemaManager) updateViewInfo(ks *vindexes.KeyspaceSchema, ksName string) { views := vm.schema.Views(ksName) - if views != nil { - ks.Views = make(map[string]sqlparser.TableStatement, len(views)) - for name, def := range views { - ks.Views[name] = sqlparser.Clone(def) + if views == nil { + return + } + ks.Views = make(map[string]sqlparser.TableStatement, len(views)) + for name, def := range views { + ks.Views[name] = sqlparser.Clone(def) + vTbl, ok := ks.Tables[name] + if ok { + vTbl.Type = vindexes.TypeView + } else { + // Adding view to the VSchema as a table. + ks.Tables[name] = &vindexes.Table{ + Type: vindexes.TypeView, + Name: sqlparser.NewIdentifierCS(name), + Keyspace: ks.Keyspace, + } } } } + func (vm *VSchemaManager) updateTableInfo(vschema *vindexes.VSchema, ks *vindexes.KeyspaceSchema, ksName string) { m := vm.schema.Tables(ksName) // Before we add the foreign key definitions in the tables, we need to make sure that all the tables diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index a1dcd3219f6..4a880202b05 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -143,7 +143,7 @@ var ( // schema tracking flags enableSchemaChangeSignal = true - enableViews bool + enableViews = true enableUdfs bool // vtgate views flags From 4370a480dd1755bf04acb3e16945850fafd052c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9opold=20Jacquot?= Date: Tue, 21 Jan 2025 16:03:56 +0100 Subject: [PATCH 48/66] feat: add mysql 8.4 docker images (#17529) Signed-off-by: Leopold Jacquot --- .github/workflows/docker_build_images.yml | 4 +- Makefile | 4 +- docker/bootstrap/CHANGELOG.md | 1 + docker/bootstrap/Dockerfile.mysql84 | 23 +++++++++ docker/bootstrap/README.md | 1 + docker/lite/Dockerfile.mysql84 | 63 +++++++++++++++++++++++ docker/utils/install_dependencies.sh | 33 ++++++++++++ docker/vttestserver/Dockerfile.mysql84 | 59 +++++++++++++++++++++ go/tools/go-upgrade/go-upgrade.go | 2 + test.go | 2 +- 10 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 docker/bootstrap/Dockerfile.mysql84 create mode 100644 docker/lite/Dockerfile.mysql84 create mode 100644 docker/vttestserver/Dockerfile.mysql84 diff --git a/.github/workflows/docker_build_images.yml b/.github/workflows/docker_build_images.yml index fea9f83b5d3..a9d4ed2ceeb 100644 --- a/.github/workflows/docker_build_images.yml +++ b/.github/workflows/docker_build_images.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: true matrix: - branch: [ mysql80 ] + branch: [ mysql80, mysql84 ] steps: - name: Check out code @@ -78,7 +78,7 @@ jobs: strategy: fail-fast: true matrix: - branch: [ latest, percona80 ] + branch: [ latest, mysql84, percona80 ] steps: - name: Check out code diff --git a/Makefile b/Makefile index 378b8708be6..aeb1955bf18 100644 --- a/Makefile +++ b/Makefile @@ -284,7 +284,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # Please read docker/README.md to understand the different available images. # This rule builds the bootstrap images for all flavors. -DOCKER_IMAGES_FOR_TEST = mysql80 percona80 +DOCKER_IMAGES_FOR_TEST = mysql80 mysql84 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) BOOTSTRAP_VERSION=41 ensure_bootstrap_version: @@ -322,7 +322,7 @@ define build_docker_image fi endef -DOCKER_LITE_SUFFIX = percona80 +DOCKER_LITE_SUFFIX = mysql84 percona80 DOCKER_LITE_TARGETS = $(addprefix docker_lite_,$(DOCKER_LITE_SUFFIX)) $(DOCKER_LITE_TARGETS): docker_lite_%: ${call build_docker_image,docker/lite/Dockerfile.$*,vitess/lite:$*} diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index f2e66566a3c..9728dffbab8 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -162,3 +162,4 @@ List of changes between bootstrap image versions. ## [41] - 2025-01-15 ### Changes - Update base image to bookworm +- Add MySQL84 image \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.mysql84 b/docker/bootstrap/Dockerfile.mysql84 new file mode 100644 index 00000000000..2f90d588701 --- /dev/null +++ b/docker/bootstrap/Dockerfile.mysql84 @@ -0,0 +1,23 @@ +ARG bootstrap_version +ARG image="vitess/bootstrap:${bootstrap_version}-common" + +FROM --platform=linux/amd64 "${image}" + +USER root + +# Install MySQL 8.4 +RUN for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com 8C718D3B5072E1F5 && break; done && \ + for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com A8D3785C && break; done && \ + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.4-lts' > /etc/apt/sources.list.d/mysql.list && \ + for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ + echo 'deb http://repo.percona.com/pxb-84-lts/apt bookworm main' > /etc/apt/sources.list.d/percona.list && \ + { \ + echo debconf debconf/frontend select Noninteractive; \ + echo percona-server-server-8.4 percona-server-server/root_password password 'unused'; \ + echo percona-server-server-8.4 percona-server-server/root_password_again password 'unused'; \ + } | debconf-set-selections && \ + apt-get update -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server libmysqlclient-dev libdbd-mysql-perl rsync libev4 libcurl4-openssl-dev percona-xtrabackup-84 && \ + rm -rf /var/lib/apt/lists/* + +USER vitess diff --git a/docker/bootstrap/README.md b/docker/bootstrap/README.md index b273305d6b9..7e0f9667e3f 100644 --- a/docker/bootstrap/README.md +++ b/docker/bootstrap/README.md @@ -7,6 +7,7 @@ The `vitess/bootstrap` image comes in different flavors: * `vitess/bootstrap:common` - dependencies that are common to all flavors * `vitess/bootstrap:mysql80` - bootstrap image for MySQL 8.0 +* `vitess/bootstrap:mysql84` - bootstrap image for MySQL 8.4 * `vitess/bootstrap:percona80` - bootstrap image for Percona Server 8.0 **NOTE: Unlike the base image that builds Vitess itself, this bootstrap image diff --git a/docker/lite/Dockerfile.mysql84 b/docker/lite/Dockerfile.mysql84 new file mode 100644 index 00000000000..e2836ca3047 --- /dev/null +++ b/docker/lite/Dockerfile.mysql84 @@ -0,0 +1,63 @@ +# Copyright 2025 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder + +# Allows docker builds to set the BUILD_NUMBER +ARG BUILD_NUMBER + +WORKDIR /vt/src/vitess.io/vitess + +# Create vitess user +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot /home/vitess +RUN chown -R vitess:vitess /vt /home/vitess +USER vitess + +# Re-copy sources from working tree. +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +RUN make install PREFIX=/vt/install + +# Start over and build the final image. +FROM --platform=linux/amd64 debian:bookworm-slim + +# Install locale required for mysqlsh +RUN apt-get update && apt-get install -y locales \ + && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ + && locale-gen en_US.UTF-8 + +# Install dependencies +COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh +RUN /vt/dist/install_dependencies.sh mysql84 + +# Set up Vitess user and directory tree. +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot /home/vitess && chown -R vitess:vitess /vt /home/vitess + +# Set up Vitess environment (just enough to run pre-built Go binaries) +ENV VTROOT /vt +ENV VTDATAROOT /vt/vtdataroot +ENV PATH $VTROOT/bin:$PATH + +# Copy artifacts from builder layer. +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY --from=builder --chown=vitess:vitess /vt/install /vt +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/web/vtadmin /vt/web/vtadmin +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/config/init_db.sql /vt/config/ +COPY --from=builder --chown=vitess:vitess /vt/src/vitess.io/vitess/config/mycnf /vt/config/ + +# Create mount point for actual data (e.g. MySQL data dir) +VOLUME /vt/vtdataroot +USER vitess diff --git a/docker/utils/install_dependencies.sh b/docker/utils/install_dependencies.sh index 64810a78d77..59e16b6303a 100755 --- a/docker/utils/install_dependencies.sh +++ b/docker/utils/install_dependencies.sh @@ -98,6 +98,33 @@ mysql80) percona-xtrabackup-80 ) ;; +mysql84) + if [ -z "$VERSION" ]; then + VERSION=8.4.3 + fi + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-common_${VERSION}-1debian12_amd64.deb /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/libmysqlclient24_${VERSION}-1debian12_amd64.deb /tmp/libmysqlclient24_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-client_${VERSION}-1debian12_amd64.deb /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-server-core_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-community-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + do_fetch https://repo.mysql.com/apt/debian/pool/mysql-8.4-lts/m/mysql-community/mysql-server_${VERSION}-1debian12_amd64.deb /tmp/mysql-server_${VERSION}-1debian12_amd64.deb + PACKAGES=( + /tmp/mysql-common_${VERSION}-1debian12_amd64.deb + /tmp/libmysqlclient24_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client-plugins_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-client_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server-core_${VERSION}-1debian12_amd64.deb + /tmp/mysql-community-server_${VERSION}-1debian12_amd64.deb + /tmp/mysql-server_${VERSION}-1debian12_amd64.deb + mysql-shell + percona-xtrabackup-84 + ) + ;; percona80) PACKAGES=( libperconaserverclient21 @@ -125,6 +152,9 @@ case "${FLAVOR}" in mysql80) echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.0' > /etc/apt/sources.list.d/mysql.list ;; +mysql84) + echo 'deb http://repo.mysql.com/apt/debian/ bookworm mysql-8.4-lts' > /etc/apt/sources.list.d/mysql.list + ;; esac # Add extra apt repositories for Percona Server and/or Percona XtraBackup. @@ -132,6 +162,9 @@ case "${FLAVOR}" in mysql80) echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list ;; +mysql84) + echo 'deb http://repo.percona.com/pxb-84-lts/apt bookworm main' > /etc/apt/sources.list.d/percona.list + ;; percona80) echo 'deb http://repo.percona.com/apt bookworm main' > /etc/apt/sources.list.d/percona.list echo 'deb http://repo.percona.com/ps-80/apt bookworm main' > /etc/apt/sources.list.d/percona80.list diff --git a/docker/vttestserver/Dockerfile.mysql84 b/docker/vttestserver/Dockerfile.mysql84 new file mode 100644 index 00000000000..73844b346d8 --- /dev/null +++ b/docker/vttestserver/Dockerfile.mysql84 @@ -0,0 +1,59 @@ +# Copyright 2021 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder + +# Allows docker builds to set the BUILD_NUMBER +ARG BUILD_NUMBER + +WORKDIR /vt/src/vitess.io/vitess + +# Create vitess user +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot /home/vitess +RUN chown -R vitess:vitess /vt /home/vitess +USER vitess + +# Re-copy sources from working tree. +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +RUN make install-testing PREFIX=/vt/install + +# Start over and build the final image. +FROM --platform=linux/amd64 debian:bullseye-slim + +# Install dependencies +COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh +RUN /vt/dist/install_dependencies.sh mysql84 + +# Set up Vitess user and directory tree. +RUN groupadd -r vitess && useradd -r -g vitess vitess +RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt + +# Set up Vitess environment (just enough to run pre-built Go binaries) +ENV VTROOT /vt +ENV VTDATAROOT /vt/vtdataroot +ENV PATH $VTROOT/bin:$PATH + +# Copy artifacts from builder layer. +COPY --from=builder --chown=vitess:vitess /vt/install /vt + +# Create mount point for actual data (e.g. MySQL data dir) +VOLUME /vt/vtdataroot +USER vitess + +COPY docker/vttestserver/setup_vschema_folder.sh /vt/setup_vschema_folder.sh +COPY docker/vttestserver/run.sh /vt/run.sh + +CMD /vt/run.sh "8.4.3-Vitess" diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go index 3ca5f4aeb8b..7b36fd14c02 100644 --- a/go/tools/go-upgrade/go-upgrade.go +++ b/go/tools/go-upgrade/go-upgrade.go @@ -343,8 +343,10 @@ func replaceGoVersionInCodebase(old, new *version.Version) error { "./build.env", "./docker/bootstrap/Dockerfile.common", "./docker/lite/Dockerfile", + "./docker/lite/Dockerfile.mysql84", "./docker/lite/Dockerfile.percona80", "./docker/vttestserver/Dockerfile.mysql80", + "./docker/vttestserver/Dockerfile.mysql84", } filesToChange, err := getListOfFilesInPaths(explore) if err != nil { diff --git a/test.go b/test.go index ebe0d2ded2d..247541009a6 100755 --- a/test.go +++ b/test.go @@ -112,7 +112,7 @@ const ( configFileName = "test/config.json" // List of flavors for which a bootstrap Docker image is available. - flavors = "mysql80,percona80" + flavors = "mysql80,mysql84,percona80" ) // Config is the overall object serialized in test/config.json. From 02c499384a44c36bc2b71918a79001e8da971fd4 Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Tue, 21 Jan 2025 16:45:40 +0100 Subject: [PATCH 49/66] Clean up duplicate datetime parsing code (#17582) Signed-off-by: Dirkjan Bussink --- go/sqltypes/value.go | 95 ----------------------- go/sqltypes/value_test.go | 140 ---------------------------------- go/vt/vitessdriver/convert.go | 58 +++++++++++++- 3 files changed, 56 insertions(+), 237 deletions(-) diff --git a/go/sqltypes/value.go b/go/sqltypes/value.go index 7fb6fa80396..438b51a13ba 100644 --- a/go/sqltypes/value.go +++ b/go/sqltypes/value.go @@ -26,7 +26,6 @@ import ( "math/big" "strconv" "strings" - "time" "google.golang.org/protobuf/encoding/protowire" @@ -436,100 +435,6 @@ func (v Value) String() string { return fmt.Sprintf("%v(%s)", Type(v.typ), v.val) } -// ToTime returns the value as a time.Time in UTC. -// NULL values are returned as zero time. -func (v Value) ToTime() (time.Time, error) { - return v.ToTimeInLocation(time.UTC) -} - -// ToTimeInLocation returns the value as a time.Time in the provided location. -// NULL values are returned as zero time. -func (v Value) ToTimeInLocation(loc *time.Location) (time.Time, error) { - if v.Type() == Null { - return time.Time{}, nil - } - switch v.Type() { - case Datetime, Timestamp: - return datetimeToNative(v, loc) - case Date: - return dateToNative(v, loc) - default: - return time.Time{}, ErrIncompatibleTypeCast - } -} - -// ErrInvalidTime is returned when we fail to parse a datetime -// string from MySQL. This should never happen unless things are -// seriously messed up. -var ErrInvalidTime = errors.New("invalid MySQL time string") - -var isoTimeFormat = "2006-01-02 15:04:05.999999" -var isoNullTime = "0000-00-00 00:00:00.000000" -var isoTimeLength = len(isoTimeFormat) - -// parseISOTime pases a time string in MySQL's textual datetime format. -// This is very similar to ISO8601, with some differences: -// -// - There is no T separator between the date and time sections; -// a space is used instead. -// - There is never a timezone section in the string, as these datetimes -// are not timezone-aware. There isn't a Z value for UTC times for -// the same reason. -// -// Note that this function can handle both DATE (which should _always_ have -// a length of 10) and DATETIME strings (which have a variable length, 18+ -// depending on the number of decimal sub-second places). -// -// Also note that this function handles the case where MySQL returns a NULL -// time (with a string where all sections are zeroes) by returning a zeroed -// out time.Time object. NULL time strings are not considered a parsing error. -// -// See: isoTimeFormat -func parseISOTime(tstr string, loc *time.Location, minLen, maxLen int) (t time.Time, err error) { - tlen := len(tstr) - if tlen < minLen || tlen > maxLen { - err = ErrInvalidTime - return - } - - if tstr == isoNullTime[:tlen] { - // This is what MySQL would send when the date is NULL, - // so return an empty time.Time instead. - // This is not a parsing error - return - } - - if loc == nil { - loc = time.UTC - } - - // Since the time format returned from MySQL never has a Timezone - // section, ParseInLocation will initialize the time.Time struct - // with the default `loc` we're passing here. - return time.ParseInLocation(isoTimeFormat[:tlen], tstr, loc) -} - -// datetimeToNative converts a Datetime Value into a time.Time -func datetimeToNative(v Value, loc *time.Location) (time.Time, error) { - // Valid format string offsets for a DATETIME - // |DATETIME |19+ - // |------------------|------| - // "2006-01-02 15:04:05.999999" - return parseISOTime(v.ToString(), loc, 19, isoTimeLength) -} - -// dateToNative converts a Date Value into a time.Time. -// Note that there's no specific type in the Go stdlib to represent -// dates without time components, so the returned Time will have -// their hours/mins/seconds zeroed out. -func dateToNative(v Value, loc *time.Location) (time.Time, error) { - // Valid format string offsets for a DATE - // |DATE |10 - // |---------| - // "2006-01-02 00:00:00.000000" - return parseISOTime(v.ToString(), loc, 10, 10) -} - // EncodeSQL encodes the value into an SQL statement. Can be binary. func (v Value) EncodeSQL(b BinWriter) { switch { diff --git a/go/sqltypes/value_test.go b/go/sqltypes/value_test.go index 99f8566472e..f6360c8b5c4 100644 --- a/go/sqltypes/value_test.go +++ b/go/sqltypes/value_test.go @@ -18,7 +18,6 @@ package sqltypes import ( "math" - "reflect" "strings" "testing" "time" @@ -623,145 +622,6 @@ func DateValue(str string) Value { return TestValue(Date, str) } -func TestDatetimeToNative(t *testing.T) { - tcases := []struct { - val Value - loc *time.Location - out time.Time - err bool - }{{ - val: DatetimeValue("1899-08-24 17:20:00"), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: time.Local, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, time.Local), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: randomLocation, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, randomLocation), - }, { - val: DatetimeValue("1952-03-11 01:02:03"), - loc: time.UTC, - out: time.Date(1952, 3, 11, 1, 2, 3, 0, time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.000000"), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.000001"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(1*time.Microsecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.123456"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(123456*time.Microsecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.222"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(222*time.Millisecond), time.UTC), - }, { - val: DatetimeValue("1899-08-24 17:20:00.1234567"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00.1"), - out: time.Date(1899, 8, 24, 17, 20, 0, int(100*time.Millisecond), time.UTC), - }, { - val: DatetimeValue("0000-00-00 00:00:00"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.0"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.000"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.000000"), - out: time.Time{}, - }, { - val: DatetimeValue("0000-00-00 00:00:00.0000000"), - err: true, - }, { - val: DatetimeValue("1899-08-24T17:20:00.000000"), - err: true, - }, { - val: DatetimeValue("1899-02-31 17:20:00.000000"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00."), - out: time.Date(1899, 8, 24, 17, 20, 0, 0, time.UTC), - }, { - val: DatetimeValue("0000-00-00 00:00:00.000001"), - err: true, - }, { - val: DatetimeValue("1899-08-24 17:20:00 +02:00"), - err: true, - }, { - val: DatetimeValue("1899-08-24"), - err: true, - }, { - val: DatetimeValue("This is not a valid timestamp"), - err: true, - }} - - for _, tcase := range tcases { - got, err := datetimeToNative(tcase.val, tcase.loc) - if tcase.err && err == nil { - t.Errorf("datetimeToNative(%v, %#v) succeeded; expected error", tcase.val, tcase.loc) - } - if !tcase.err && err != nil { - t.Errorf("datetimeToNative(%v, %#v) failed: %v", tcase.val, tcase.loc, err) - } - if !reflect.DeepEqual(got, tcase.out) { - t.Errorf("datetimeToNative(%v, %#v): %v, want %v", tcase.val, tcase.loc, got, tcase.out) - } - } -} - -func TestDateToNative(t *testing.T) { - tcases := []struct { - val Value - loc *time.Location - out time.Time - err bool - }{{ - val: DateValue("1899-08-24"), - out: time.Date(1899, 8, 24, 0, 0, 0, 0, time.UTC), - }, { - val: DateValue("1952-03-11"), - loc: time.Local, - out: time.Date(1952, 3, 11, 0, 0, 0, 0, time.Local), - }, { - val: DateValue("1952-03-11"), - loc: randomLocation, - out: time.Date(1952, 3, 11, 0, 0, 0, 0, randomLocation), - }, { - val: DateValue("0000-00-00"), - out: time.Time{}, - }, { - val: DateValue("1899-02-31"), - err: true, - }, { - val: DateValue("1899-08-24 17:20:00"), - err: true, - }, { - val: DateValue("0000-00-00 00:00:00"), - err: true, - }, { - val: DateValue("This is not a valid timestamp"), - err: true, - }} - - for _, tcase := range tcases { - got, err := dateToNative(tcase.val, tcase.loc) - if tcase.err && err == nil { - t.Errorf("dateToNative(%v, %#v) succeeded; expected error", tcase.val, tcase.loc) - } - if !tcase.err && err != nil { - t.Errorf("dateToNative(%v, %#v) failed: %v", tcase.val, tcase.loc, err) - } - if !reflect.DeepEqual(got, tcase.out) { - t.Errorf("dateToNative(%v, %#v): %v, want %v", tcase.val, tcase.loc, got, tcase.out) - } - } -} - func TestEncodeSQLStringBuilder(t *testing.T) { testcases := []struct { in Value diff --git a/go/vt/vitessdriver/convert.go b/go/vt/vitessdriver/convert.go index aa8bcedc7ee..c5141d1c890 100644 --- a/go/vt/vitessdriver/convert.go +++ b/go/vt/vitessdriver/convert.go @@ -18,9 +18,11 @@ package vitessdriver import ( "database/sql/driver" + "errors" "fmt" "time" + "vitess.io/vitess/go/mysql/datetime" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" @@ -43,8 +45,10 @@ func (cv *converter) ToNative(v sqltypes.Value) (any, error) { return v.ToUint64() case v.IsFloat(): return v.ToFloat64() - case v.Type() == sqltypes.Datetime, v.Type() == sqltypes.Timestamp, v.Type() == sqltypes.Date: - return v.ToTimeInLocation(cv.location) + case v.Type() == sqltypes.Datetime, v.Type() == sqltypes.Timestamp: + return cv.datetimeToTime(v) + case v.Type() == sqltypes.Date: + return cv.dateToTime(v) case v.IsQuoted() || v.Type() == sqltypes.Bit || v.Type() == sqltypes.Decimal: out, err = v.ToBytes() case v.Type() == sqltypes.Expression: @@ -53,6 +57,56 @@ func (cv *converter) ToNative(v sqltypes.Value) (any, error) { return out, err } +// ErrInvalidTime is returned when we fail to parse a datetime +// string from MySQL. This should never happen unless things are +// seriously messed up. +var ErrInvalidTime = errors.New("invalid MySQL time string") + +func (cv *converter) datetimeToTime(v sqltypes.Value) (time.Time, error) { + if v.IsNull() { + return time.Time{}, nil + } + // Valid format string offsets for a DATETIME + // |DATETIME |19+ + // |------------------|------| + // "2006-01-02 15:04:05.999999" + dt, _, ok := datetime.ParseDateTime(v.ToString(), -1) + if !ok { + return time.Time{}, ErrInvalidTime + } + if dt.IsZero() { + return time.Time{}, nil + } + loc := cv.location + if loc == nil { + loc = time.UTC + } + return time.Date(dt.Date.Year(), time.Month(dt.Date.Month()), dt.Date.Day(), + dt.Time.Hour(), dt.Time.Minute(), dt.Time.Second(), dt.Time.Nanosecond(), loc), nil +} + +func (cv *converter) dateToTime(v sqltypes.Value) (time.Time, error) { + if v.IsNull() { + return time.Time{}, nil + } + // Valid format string offsets for a DATE + // |DATE |10 + // |---------| + // "2006-01-02 00:00:00.000000" + d, ok := datetime.ParseDate(v.ToString()) + if !ok { + return time.Time{}, ErrInvalidTime + } + if d.IsZero() { + return time.Time{}, nil + } + loc := cv.location + if loc == nil { + loc = time.UTC + } + return time.Date(d.Year(), time.Month(d.Month()), d.Day(), 0, 0, 0, 0, loc), nil +} + func (cv *converter) BuildBindVariable(v any) (*querypb.BindVariable, error) { if t, ok := v.(time.Time); ok { return sqltypes.ValueBindVariable(NewDatetime(t, cv.location)), nil From 5a46da32287e00a0cfc043cba4c94096c9c95172 Mon Sep 17 00:00:00 2001 From: vitess-bot <139342327+vitess-bot@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:58:33 -0600 Subject: [PATCH 50/66] [main] Copy `v19.0.9` release notes (#17595) Signed-off-by: Rohit Nayak Co-authored-by: Rohit Nayak --- changelog/19.0/19.0.9/changelog.md | 49 ++++++++++++++++++++++++++ changelog/19.0/19.0.9/release_notes.md | 7 ++++ changelog/19.0/README.md | 4 +++ 3 files changed, 60 insertions(+) create mode 100644 changelog/19.0/19.0.9/changelog.md create mode 100644 changelog/19.0/19.0.9/release_notes.md diff --git a/changelog/19.0/19.0.9/changelog.md b/changelog/19.0/19.0.9/changelog.md new file mode 100644 index 00000000000..5b56b4b2afb --- /dev/null +++ b/changelog/19.0/19.0.9/changelog.md @@ -0,0 +1,49 @@ +# Changelog of Vitess v19.0.9 + +### Bug fixes +#### Query Serving + * [release-19.0] Fix Data race in semi-join (#17417) [#17445](https://github.com/vitessio/vitess/pull/17445) + * [release-19.0] Always return a valid timezone in cursor (#17546) [#17549](https://github.com/vitessio/vitess/pull/17549) +#### VReplication + * [release-19.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17347](https://github.com/vitessio/vitess/pull/17347) + * [release-19.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17364](https://github.com/vitessio/vitess/pull/17364) + * [release-19.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17436](https://github.com/vitessio/vitess/pull/17436) + * [Direct PR] Fix merge issue in backport [#17509](https://github.com/vitessio/vitess/pull/17509) + * [release-19.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17574](https://github.com/vitessio/vitess/pull/17574) +#### VTorc + * [release-19.0] Use uint64 for binary log file position (#17472) [#17505](https://github.com/vitessio/vitess/pull/17505) +#### vttestserver + * [release-19.0] parse transaction timeout as duration (#16338) [#17406](https://github.com/vitessio/vitess/pull/17406) +### CI/Build +#### General + * [release-19.0] Bump go version to 1.22.10 [#17338](https://github.com/vitessio/vitess/pull/17338) + * [release-19.0] Upgrade the Golang version to `go1.22.11` [#17564](https://github.com/vitessio/vitess/pull/17564) +### Dependencies +#### Build/CI + * [release-19.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17381](https://github.com/vitessio/vitess/pull/17381) +#### General + * [release-19.0] Bump golang.org/x/net from 0.25.0 to 0.33.0 (#17416) [#17420](https://github.com/vitessio/vitess/pull/17420) + * [release-19.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17532](https://github.com/vitessio/vitess/pull/17532) +#### VTAdmin + * [release-19.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17377](https://github.com/vitessio/vitess/pull/17377) +### Enhancement +#### Documentation + * [release-19.0] [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) (#17444) [#17450](https://github.com/vitessio/vitess/pull/17450) +#### VTorc + * [release-19.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17351](https://github.com/vitessio/vitess/pull/17351) +### Internal Cleanup +#### Build/CI + * [release-19.0] Security improvements to GitHub Actions (#17520) [#17528](https://github.com/vitessio/vitess/pull/17528) +### Regression +#### Query Serving + * Backport v19: Fixing Column aliases in outer join queries (#15384) [#17418](https://github.com/vitessio/vitess/pull/17418) +### Release +#### General + * [release-19.0] Bump to `v19.0.9-SNAPSHOT` after the `v19.0.8` release [#17321](https://github.com/vitessio/vitess/pull/17321) + * [release-19.0] Code Freeze for `v19.0.9` [#17587](https://github.com/vitessio/vitess/pull/17587) +### Testing +#### General + * [release-19.0] Remove broken panic handler (#17354) [#17358](https://github.com/vitessio/vitess/pull/17358) +#### VReplication + * [release-19.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17511](https://github.com/vitessio/vitess/pull/17511) + diff --git a/changelog/19.0/19.0.9/release_notes.md b/changelog/19.0/19.0.9/release_notes.md new file mode 100644 index 00000000000..a729b9f1ee9 --- /dev/null +++ b/changelog/19.0/19.0.9/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v19.0.9 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/19.0/19.0.9/changelog.md). + +The release includes 23 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @frouioui, @harshit-gangal, @mattlord, @rohit-nayak-ps, @vitess-bot + diff --git a/changelog/19.0/README.md b/changelog/19.0/README.md index 5893d3b1f4c..4d40372096f 100644 --- a/changelog/19.0/README.md +++ b/changelog/19.0/README.md @@ -1,4 +1,8 @@ ## v19.0 +* **[19.0.9](19.0.9)** + * [Changelog](19.0.9/changelog.md) + * [Release Notes](19.0.9/release_notes.md) + * **[19.0.8](19.0.8)** * [Changelog](19.0.8/changelog.md) * [Release Notes](19.0.8/release_notes.md) From a86d3d9dc7bdd919221fe2684c7b9def72cac1a4 Mon Sep 17 00:00:00 2001 From: vitess-bot <139342327+vitess-bot@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:58:50 -0600 Subject: [PATCH 51/66] [main] Copy `v20.0.5` release notes (#17597) Signed-off-by: Rohit Nayak Co-authored-by: Rohit Nayak --- changelog/20.0/20.0.5/changelog.md | 46 ++++++++++++++++++++++++++ changelog/20.0/20.0.5/release_notes.md | 7 ++++ changelog/20.0/README.md | 4 +++ 3 files changed, 57 insertions(+) create mode 100644 changelog/20.0/20.0.5/changelog.md create mode 100644 changelog/20.0/20.0.5/release_notes.md diff --git a/changelog/20.0/20.0.5/changelog.md b/changelog/20.0/20.0.5/changelog.md new file mode 100644 index 00000000000..ce8895f5d51 --- /dev/null +++ b/changelog/20.0/20.0.5/changelog.md @@ -0,0 +1,46 @@ +# Changelog of Vitess v20.0.5 + +### Bug fixes +#### Query Serving + * [release-20.0] Fix Data race in semi-join (#17417) [#17446](https://github.com/vitessio/vitess/pull/17446) + * [release-20.0] Reference Table DML Join Fix (#17414) [#17473](https://github.com/vitessio/vitess/pull/17473) + * [release-20.0] Fix crash in the evalengine (#17487) [#17489](https://github.com/vitessio/vitess/pull/17489) + * [release-20.0] Always return a valid timezone in cursor (#17546) [#17550](https://github.com/vitessio/vitess/pull/17550) +#### VReplication + * [release-20.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17348](https://github.com/vitessio/vitess/pull/17348) + * [release-20.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17365](https://github.com/vitessio/vitess/pull/17365) + * [release-20.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17437](https://github.com/vitessio/vitess/pull/17437) + * [release-20.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17575](https://github.com/vitessio/vitess/pull/17575) +#### VTorc + * [release-20.0] Use uint64 for binary log file position (#17472) [#17506](https://github.com/vitessio/vitess/pull/17506) +#### vttestserver + * [release-20.0] parse transaction timeout as duration (#16338) [#17405](https://github.com/vitessio/vitess/pull/17405) +### CI/Build +#### General + * [release-20.0] Bump go version to 1.22.10 [#17337](https://github.com/vitessio/vitess/pull/17337) + * [release-20.0] Upgrade the Golang version to `go1.22.11` [#17562](https://github.com/vitessio/vitess/pull/17562) +### Dependencies +#### Build/CI + * [release-20.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17382](https://github.com/vitessio/vitess/pull/17382) +#### General + * [release-20.0] Bump golang.org/x/net from 0.25.0 to 0.33.0 (#17416) [#17421](https://github.com/vitessio/vitess/pull/17421) + * [release-20.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17533](https://github.com/vitessio/vitess/pull/17533) +#### VTAdmin + * [release-20.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17378](https://github.com/vitessio/vitess/pull/17378) +### Enhancement +#### Documentation + * [release-20.0] [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) (#17444) [#17451](https://github.com/vitessio/vitess/pull/17451) +#### VTorc + * [release-20.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17352](https://github.com/vitessio/vitess/pull/17352) +### Internal Cleanup +#### Build/CI + * [release-20.0] Security improvements to GitHub Actions (#17520) [#17530](https://github.com/vitessio/vitess/pull/17530) +### Release +#### General + * [release-20.0] Bump to `v20.0.5-SNAPSHOT` after the `v20.0.4` release [#17323](https://github.com/vitessio/vitess/pull/17323) +### Testing +#### General + * [release-20.0] Remove broken panic handler (#17354) [#17359](https://github.com/vitessio/vitess/pull/17359) +#### VReplication + * [release-20.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17512](https://github.com/vitessio/vitess/pull/17512) + diff --git a/changelog/20.0/20.0.5/release_notes.md b/changelog/20.0/20.0.5/release_notes.md new file mode 100644 index 00000000000..ae00e9a6255 --- /dev/null +++ b/changelog/20.0/20.0.5/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v20.0.5 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/20.0/20.0.5/changelog.md). + +The release includes 22 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @frouioui, @mattlord, @vitess-bot + diff --git a/changelog/20.0/README.md b/changelog/20.0/README.md index 2fe6e3d9d61..59d34ed7173 100644 --- a/changelog/20.0/README.md +++ b/changelog/20.0/README.md @@ -1,4 +1,8 @@ ## v20.0 +* **[20.0.5](20.0.5)** + * [Changelog](20.0.5/changelog.md) + * [Release Notes](20.0.5/release_notes.md) + * **[20.0.4](20.0.4)** * [Changelog](20.0.4/changelog.md) * [Release Notes](20.0.4/release_notes.md) From a809fae6ee10701fc137c65667c15f31421016f3 Mon Sep 17 00:00:00 2001 From: vitess-bot <139342327+vitess-bot@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:59:00 -0600 Subject: [PATCH 52/66] [main] Copy `v21.0.2` release notes (#17599) Signed-off-by: Rohit Nayak Co-authored-by: Rohit Nayak --- changelog/21.0/21.0.2/changelog.md | 64 ++++++++++++++++++++++++++ changelog/21.0/21.0.2/release_notes.md | 7 +++ changelog/21.0/README.md | 4 ++ 3 files changed, 75 insertions(+) create mode 100644 changelog/21.0/21.0.2/changelog.md create mode 100644 changelog/21.0/21.0.2/release_notes.md diff --git a/changelog/21.0/21.0.2/changelog.md b/changelog/21.0/21.0.2/changelog.md new file mode 100644 index 00000000000..4b4c45f6117 --- /dev/null +++ b/changelog/21.0/21.0.2/changelog.md @@ -0,0 +1,64 @@ +# Changelog of Vitess v21.0.2 + +### Bug fixes +#### Evalengine + * [release-21.0] Fix week number for date_format evalengine function (#17432) [#17452](https://github.com/vitessio/vitess/pull/17452) +#### Java + * [release-21.0] Use proper `groupId` for mysql connector in java (#17540) [#17541](https://github.com/vitessio/vitess/pull/17541) +#### Query Serving + * [release-21.0] Fix Data race in semi-join (#17417) [#17447](https://github.com/vitessio/vitess/pull/17447) + * [release-21.0] vexplain to protect the log fields from concurrent writes (#17460) [#17463](https://github.com/vitessio/vitess/pull/17463) + * [release-21.0] Reference Table DML Join Fix (#17414) [#17474](https://github.com/vitessio/vitess/pull/17474) + * [release-21.0] Fix crash in the evalengine (#17487) [#17490](https://github.com/vitessio/vitess/pull/17490) + * [release-21.0] Always return a valid timezone in cursor (#17546) [#17551](https://github.com/vitessio/vitess/pull/17551) + * [release-21.0] sizegen: do not ignore type aliases (#17556) [#17557](https://github.com/vitessio/vitess/pull/17557) +#### VReplication + * [release-21.0] LookupVindex: fix CLI to allow creating non-unique lookups with single column (#17301) [#17349](https://github.com/vitessio/vitess/pull/17349) + * [release-21.0] SwitchTraffic: use separate context while canceling a migration (#17340) [#17366](https://github.com/vitessio/vitess/pull/17366) + * [release-21.0] LookupVindex bug fix: Fix typos from PR 17301 (#17423) [#17438](https://github.com/vitessio/vitess/pull/17438) + * [release-21.0] Tablet picker: Handle the case where a primary tablet is not setup for a shard (#17573) [#17576](https://github.com/vitessio/vitess/pull/17576) +#### VTorc + * [release-21.0] Use uint64 for binary log file position (#17472) [#17507](https://github.com/vitessio/vitess/pull/17507) +#### schema management + * [release-21.0] schemadiff: skip keys with expressions in Online DDL analysis (#17475) [#17480](https://github.com/vitessio/vitess/pull/17480) +### CI/Build +#### Build/CI + * [release-21.0] use newer versions of actions in scorecard workflow (#17373) [#17374](https://github.com/vitessio/vitess/pull/17374) + * [release-21.0] split upgrade downgrade queries test to 2 CI workflows (#17464) [#17494](https://github.com/vitessio/vitess/pull/17494) +#### General + * [release-21.0] Bump go version to 1.23.4 [#17336](https://github.com/vitessio/vitess/pull/17336) + * [release-21.0] Upgrade the Golang version to `go1.23.5` [#17561](https://github.com/vitessio/vitess/pull/17561) +### Dependencies +#### Build/CI + * [release-21.0] Bump golang.org/x/crypto from 0.29.0 to 0.31.0 (#17376) [#17383](https://github.com/vitessio/vitess/pull/17383) +#### General + * [release-21.0] Bump golang.org/x/net from 0.29.0 to 0.33.0 (#17416) [#17422](https://github.com/vitessio/vitess/pull/17422) + * [release-21.0] CVE Fix: Update glog to v1.2.4 (#17524) [#17534](https://github.com/vitessio/vitess/pull/17534) +#### Java + * [release-21.0] [Java]: Bump mysql-connector-java version from 8.0.33 to mysql-connector-j 8.4.0 (#17522) [#17527](https://github.com/vitessio/vitess/pull/17527) +#### VTAdmin + * [release-21.0] Bump nanoid from 3.3.7 to 3.3.8 in /web/vtadmin (#17375) [#17379](https://github.com/vitessio/vitess/pull/17379) +### Enhancement +#### Documentation + * [Direct PR] [V21 backport] CobraDocs: Remove commit hash from docs. Fix issue with workdir replacement (#17392) [#17444](https://github.com/vitessio/vitess/pull/17444) +#### VTorc + * [release-21.0] `vtorc`: require topo for `Healthy: true` in `/debug/health` (#17129) [#17353](https://github.com/vitessio/vitess/pull/17353) +### Internal Cleanup +#### Build/CI + * [release-21.0] Security improvements to GitHub Actions (#17520) [#17531](https://github.com/vitessio/vitess/pull/17531) +### Regression +#### Java + * [release-21.0] [Java] Fix dependency issues in Java package (#17481) [#17484](https://github.com/vitessio/vitess/pull/17484) +### Release +#### General + * [release-21.0] Bump to `v21.0.2-SNAPSHOT` after the `v21.0.1` release [#17325](https://github.com/vitessio/vitess/pull/17325) +### Testing +#### General + * [release-21.0] Remove broken panic handler (#17354) [#17360](https://github.com/vitessio/vitess/pull/17360) +#### Query Serving + * [release-21.0] Ensure PRS runs for all the shards in `TestSemiSyncRequiredWithTwoPC` (#17384) [#17385](https://github.com/vitessio/vitess/pull/17385) +#### VReplication + * [release-21.0] Flaky test fix: TestMoveTablesSharded and TestMoveTablesUnsharded (#17343) [#17363](https://github.com/vitessio/vitess/pull/17363) + * [release-21.0] Flaky TestMoveTables(Un)sharded: Handle race condition (#17440) [#17455](https://github.com/vitessio/vitess/pull/17455) + * [release-21.0] Flaky TestTickSkip: Remove inherently flaky test (#17504) [#17513](https://github.com/vitessio/vitess/pull/17513) + diff --git a/changelog/21.0/21.0.2/release_notes.md b/changelog/21.0/21.0.2/release_notes.md new file mode 100644 index 00000000000..10c663ebff2 --- /dev/null +++ b/changelog/21.0/21.0.2/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v21.0.2 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/21.0/21.0.2/changelog.md). + +The release includes 33 merged Pull Requests. + +Thanks to all our contributors: @app/vitess-bot, @dbussink, @frouioui, @rohit-nayak-ps, @vitess-bot + diff --git a/changelog/21.0/README.md b/changelog/21.0/README.md index f3a98feb55a..680a294e34b 100644 --- a/changelog/21.0/README.md +++ b/changelog/21.0/README.md @@ -1,4 +1,8 @@ ## v21.0 +* **[21.0.2](21.0.2)** + * [Changelog](21.0.2/changelog.md) + * [Release Notes](21.0.2/release_notes.md) + * **[21.0.1](21.0.1)** * [Changelog](21.0.1/changelog.md) * [Release Notes](21.0.1/release_notes.md) From d6cd88c1dfb2d6b83324d13fc6a12bc0d1662fe0 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Tue, 21 Jan 2025 16:27:58 +0000 Subject: [PATCH 53/66] Fix typos in MySQL 8.4 Dockerfile (#17601) Signed-off-by: Graham Campbell --- docker/vttestserver/Dockerfile.mysql84 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/vttestserver/Dockerfile.mysql84 b/docker/vttestserver/Dockerfile.mysql84 index 73844b346d8..ad944f500a0 100644 --- a/docker/vttestserver/Dockerfile.mysql84 +++ b/docker/vttestserver/Dockerfile.mysql84 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.23.4-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.5-bookworm AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -31,7 +31,7 @@ COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess RUN make install-testing PREFIX=/vt/install # Start over and build the final image. -FROM --platform=linux/amd64 debian:bullseye-slim +FROM --platform=linux/amd64 debian:bookworm-slim # Install dependencies COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh From bf2423fa6f4db8f0502c3957e2825c01e096f180 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Tue, 21 Jan 2025 16:12:18 -0600 Subject: [PATCH 54/66] Fail VTBackup early when replication or MySQL is failing (#17356) Signed-off-by: Florent Poinsard --- go/cmd/vtbackup/cli/vtbackup.go | 27 +++++- .../backup/vtbackup/backup_only_test.go | 87 ++++++++++++++++--- 2 files changed, 102 insertions(+), 12 deletions(-) diff --git a/go/cmd/vtbackup/cli/vtbackup.go b/go/cmd/vtbackup/cli/vtbackup.go index 1b61c886ae7..5306cc21f11 100644 --- a/go/cmd/vtbackup/cli/vtbackup.go +++ b/go/cmd/vtbackup/cli/vtbackup.go @@ -19,6 +19,7 @@ package cli import ( "context" "crypto/rand" + "errors" "fmt" "math" "math/big" @@ -65,6 +66,8 @@ const ( phaseNameTakeNewBackup = "TakeNewBackup" phaseStatusCatchupReplicationStalled = "Stalled" phaseStatusCatchupReplicationStopped = "Stopped" + + timeoutWaitingForReplicationStatus = 60 * time.Second ) var ( @@ -335,6 +338,18 @@ func takeBackup(ctx, backgroundCtx context.Context, topoServer *topo.Server, bac if err != nil { return fmt.Errorf("failed to initialize mysql config: %v", err) } + ctx, cancelCtx := context.WithCancel(ctx) + backgroundCtx, cancelBackgroundCtx := context.WithCancel(backgroundCtx) + defer func() { + cancelCtx() + cancelBackgroundCtx() + }() + mysqld.OnTerm(func() { + log.Warning("Cancelling vtbackup as MySQL has terminated") + cancelCtx() + cancelBackgroundCtx() + }) + initCtx, initCancel := context.WithTimeout(ctx, mysqlTimeout) defer initCancel() initMysqldAt := time.Now() @@ -520,7 +535,13 @@ func takeBackup(ctx, backgroundCtx context.Context, topoServer *topo.Server, bac waitStartTime = time.Now() ) + + lastErr := vterrors.NewLastError("replication catch up", timeoutWaitingForReplicationStatus) for { + if !lastErr.ShouldRetry() { + return fmt.Errorf("timeout waiting for replication status after %.0f seconds", timeoutWaitingForReplicationStatus.Seconds()) + } + select { case <-ctx.Done(): return fmt.Errorf("error in replication catch up: %v", ctx.Err()) @@ -530,6 +551,7 @@ func takeBackup(ctx, backgroundCtx context.Context, topoServer *topo.Server, bac lastStatus = status status, statusErr = mysqld.ReplicationStatus(ctx) if statusErr != nil { + lastErr.Record(statusErr) log.Warningf("Error getting replication status: %v", statusErr) continue } @@ -548,7 +570,10 @@ func takeBackup(ctx, backgroundCtx context.Context, topoServer *topo.Server, bac } } if !status.Healthy() { - log.Warning("Replication has stopped before backup could be taken. Trying to restart replication.") + errStr := "Replication has stopped before backup could be taken. Trying to restart replication." + log.Warning(errStr) + lastErr.Record(errors.New(strings.ToLower(errStr))) + phaseStatus.Set([]string{phaseNameCatchupReplication, phaseStatusCatchupReplicationStopped}, 1) if err := startReplication(ctx, mysqld, topoServer); err != nil { log.Warningf("Failed to restart replication: %v", err) diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index c7a09c70d13..85a9ae7be16 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -47,6 +47,55 @@ var ( ) Engine=InnoDB;` ) +func TestFailingReplication(t *testing.T) { + prepareCluster(t) + + // Run the entire backup test + firstBackupTest(t, false) + + // Insert one more row, the primary will be ahead of the last backup + _, err := primary.VttabletProcess.QueryTablet("insert into vt_insert_test (msg) values ('test_failure')", keyspaceName, true) + require.NoError(t, err) + + // Disable replication from the primary by removing the grants to 'vt_repl'. + _, err = primary.VttabletProcess.QueryTablet("REVOKE REPLICATION SLAVE ON *.* FROM 'vt_repl'@'%';", keyspaceName, true) + require.NoError(t, err) + _, err = primary.VttabletProcess.QueryTablet("FLUSH PRIVILEGES;", keyspaceName, true) + require.NoError(t, err) + + // Take a backup with vtbackup: the process should fail entirely as it cannot replicate from the primary. + _, err = startVtBackup(t, false, false, false) + require.Error(t, err) + + // keep in mind how many backups we have right now + backups, err := listBackups(shardKsName) + require.NoError(t, err) + + // In 30 seconds, grant the replication permission again to 'vt_repl'. + // This will mean that vtbackup should fail to replicate for ~30 seconds, until we grant the permission again. + go func() { + <-time.After(30 * time.Second) + _, err = primary.VttabletProcess.QueryTablet("GRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%';", keyspaceName, true) + require.NoError(t, err) + _, err = primary.VttabletProcess.QueryTablet("FLUSH PRIVILEGES;", keyspaceName, true) + require.NoError(t, err) + }() + + startTime := time.Now() + // this will initially be stuck trying to replicate from the primary, and once we re-grant the permission in + // the goroutine above, the process will work and complete successfully. + _ = vtBackup(t, false, false, false) + + require.GreaterOrEqual(t, time.Since(startTime).Seconds(), float64(30)) + + verifyBackupCount(t, shardKsName, len(backups)+1) + + removeBackups(t) + verifyBackupCount(t, shardKsName, 0) + + tearDown(t, true) +} + func TestTabletInitialBackup(t *testing.T) { // Test Initial Backup Flow // TestTabletInitialBackup will: @@ -59,6 +108,15 @@ func TestTabletInitialBackup(t *testing.T) { // - Bring up a second replica, and restore from the second backup // - list the backups, remove them + prepareCluster(t) + + // Run the entire backup test + firstBackupTest(t, true) + + tearDown(t, true) +} + +func prepareCluster(t *testing.T) { waitForReplicationToCatchup([]cluster.Vttablet{*replica1, *replica2}) dataPointReader := vtBackup(t, true, false, false) @@ -84,11 +142,6 @@ func TestTabletInitialBackup(t *testing.T) { "TabletExternallyReparented", primary.Alias) require.NoError(t, err) restore(t, replica1, "replica", "SERVING") - - // Run the entire backup test - firstBackupTest(t, "replica") - - tearDown(t, true) } func TestTabletBackupOnly(t *testing.T) { @@ -107,12 +160,12 @@ func TestTabletBackupOnly(t *testing.T) { replica1.VttabletProcess.ServingStatus = "NOT_SERVING" initTablets(t, true, true) - firstBackupTest(t, "replica") + firstBackupTest(t, true) tearDown(t, false) } -func firstBackupTest(t *testing.T, tabletType string) { +func firstBackupTest(t *testing.T, removeBackup bool) { // Test First Backup flow. // // firstBackupTest will: @@ -168,11 +221,13 @@ func firstBackupTest(t *testing.T, tabletType string) { // check the new replica has the data cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) - removeBackups(t) - verifyBackupCount(t, shardKsName, 0) + if removeBackup { + removeBackups(t) + verifyBackupCount(t, shardKsName, 0) + } } -func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) *opentsdb.DataPointReader { +func startVtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) (*os.File, error) { mysqlSocket, err := os.CreateTemp("", "vtbackup_test_mysql.sock") require.NoError(t, err) defer os.Remove(mysqlSocket.Name()) @@ -207,9 +262,19 @@ func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedo log.Infof("starting backup tablet %s", time.Now()) err = localCluster.StartVtbackup(newInitDBFile, initialBackup, keyspaceName, shardName, cell, extraArgs...) - require.NoError(t, err) + if err != nil { + return nil, err + } f, err := os.OpenFile(statsPath, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + return f, nil +} + +func vtBackup(t *testing.T, initialBackup bool, restartBeforeBackup, disableRedoLog bool) *opentsdb.DataPointReader { + f, err := startVtBackup(t, initialBackup, restartBeforeBackup, disableRedoLog) require.NoError(t, err) return opentsdb.NewDataPointReader(f) } From b406e96a5ba5a80c69165d6128b8dd06ad49629b Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Tue, 21 Jan 2025 21:11:02 -0500 Subject: [PATCH 55/66] Add vtctldclient missing cmds and remove remaining vtctl[client] usage in e2e tests (#17442) Signed-off-by: Matt Lord --- go/cmd/vtctldclient/command/framework_test.go | 267 + go/cmd/vtctldclient/command/keyspaces.go | 49 +- go/cmd/vtctldclient/command/permissions.go | 114 + .../vtctldclient/command/permissions_test.go | 608 ++ go/cmd/vtctldclient/command/root.go | 13 +- go/cmd/vtctldclient/command/root_test.go | 4 +- go/cmd/vtctldclient/command/schema.go | 172 +- go/cmd/vtctldclient/command/tablets.go | 32 - go/cmd/vtctldclient/command/topology.go | 70 +- go/cmd/vtctldclient/main.go | 4 + go/cmd/vtctldclient/plugin_grpctmclient.go | 28 + go/flags/endtoend/vtctldclient.txt | 94 +- .../backup/vtbackup/backup_only_test.go | 12 +- go/test/endtoend/backup/vtbackup/main_test.go | 2 +- .../backup/vtctlbackup/backup_utils.go | 2 +- go/test/endtoend/cellalias/cell_alias_test.go | 4 +- go/test/endtoend/cluster/cluster_process.go | 58 +- go/test/endtoend/cluster/cluster_util.go | 16 - go/test/endtoend/cluster/vt_process.go | 62 + go/test/endtoend/cluster/vtbackup_process.go | 43 +- go/test/endtoend/cluster/vtctl_process.go | 149 - .../endtoend/cluster/vtctlclient_process.go | 266 - go/test/endtoend/cluster/vtctld_process.go | 18 +- .../endtoend/cluster/vtctldclient_process.go | 90 +- go/test/endtoend/cluster/vtgate_process.go | 16 +- go/test/endtoend/cluster/vtorc_process.go | 3 +- go/test/endtoend/cluster/vttablet_process.go | 16 +- go/test/endtoend/docker/vttestserver_test.go | 4 +- .../encrypted_replication_test.go | 2 +- .../encrypted_transport_test.go | 29 +- go/test/endtoend/keyspace/keyspace_test.go | 8 +- go/test/endtoend/messaging/message_test.go | 2 +- go/test/endtoend/mysqlctl/mysqlctl_test.go | 2 +- go/test/endtoend/mysqlctld/mysqlctld_test.go | 2 +- go/test/endtoend/recovery/recovery_util.go | 8 +- .../recovery/unshardedrecovery/recovery.go | 2 +- .../reparent/emergencyreparent/ers_test.go | 6 +- go/test/endtoend/reparent/utils/utils.go | 12 +- .../endtoend/sharded/sharded_keyspace_test.go | 10 +- .../tabletmanager/custom_rule_topo_test.go | 4 +- .../throttler_topo/throttler_test.go | 2 +- go/test/endtoend/topoconncache/main_test.go | 4 +- .../topoconncache/topo_conn_cache_test.go | 4 +- go/test/endtoend/topotest/consul/main_test.go | 4 +- go/test/endtoend/topotest/etcd2/main_test.go | 8 +- go/test/endtoend/topotest/zk2/main_test.go | 4 +- go/test/endtoend/vault/vault_test.go | 2 +- go/test/endtoend/vreplication/cluster_test.go | 49 +- go/test/endtoend/vreplication/migrate_test.go | 25 +- .../endtoend/vreplication/sidecardb_test.go | 2 +- .../vreplication_vtctldclient_cli_test.go | 2 +- go/test/endtoend/vreplication/vstream_test.go | 2 + .../vtgate/queries/reference/main_test.go | 31 +- go/test/endtoend/vtgate/schema/schema_test.go | 4 +- .../vtorc/readtopologyinstance/main_test.go | 6 +- go/test/endtoend/vtorc/utils/utils.go | 8 +- go/vt/proto/vtctldata/vtctldata.pb.go | 6402 +++++++++-------- go/vt/proto/vtctldata/vtctldata_vtproto.pb.go | 1954 +++-- go/vt/proto/vtctlservice/vtctlservice.pb.go | 2189 +++--- .../vtctlservice/vtctlservice_grpc.pb.go | 76 + go/vt/vtctl/grpcvtctldclient/client_gen.go | 18 + go/vt/vtctl/grpcvtctldserver/server.go | 130 +- go/vt/vtctl/localvtctldclient/client_gen.go | 10 + go/vt/vtctl/vtctl.go | 2 +- go/vt/vtctl/workflow/server.go | 2 +- go/vt/vttablet/grpctmclient/client.go | 4 +- proto/vtctldata.proto | 27 + proto/vtctlservice.proto | 4 + .../routes/keyspaces/KeyspaceActions.tsx | 4 +- web/vtadmin/src/proto/vtadmin.d.ts | 430 ++ web/vtadmin/src/proto/vtadmin.js | 1044 ++- 71 files changed, 9264 insertions(+), 5492 deletions(-) create mode 100644 go/cmd/vtctldclient/command/framework_test.go create mode 100644 go/cmd/vtctldclient/command/permissions.go create mode 100644 go/cmd/vtctldclient/command/permissions_test.go create mode 100644 go/cmd/vtctldclient/plugin_grpctmclient.go create mode 100644 go/test/endtoend/cluster/vt_process.go delete mode 100644 go/test/endtoend/cluster/vtctl_process.go delete mode 100644 go/test/endtoend/cluster/vtctlclient_process.go diff --git a/go/cmd/vtctldclient/command/framework_test.go b/go/cmd/vtctldclient/command/framework_test.go new file mode 100644 index 00000000000..3e4a6753411 --- /dev/null +++ b/go/cmd/vtctldclient/command/framework_test.go @@ -0,0 +1,267 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package command + +import ( + "context" + "net" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + + "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/vt/binlog/binlogplayer" + "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/mysqlctl" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vttablet/grpctmserver" + "vitess.io/vitess/go/vt/vttablet/tabletconntest" + "vitess.io/vitess/go/vt/vttablet/tabletmanager" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" + "vitess.io/vitess/go/vt/vttablet/tabletservermock" + "vitess.io/vitess/go/vt/vttablet/tmclient" + + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + + // Import the gRPC client implementation for tablet manager. + _ "vitess.io/vitess/go/vt/vttablet/grpctmclient" + + // Import the gRPC client implementation for query service. + _ "vitess.io/vitess/go/vt/vttablet/grpctabletconn" +) + +func init() { + tabletconntest.SetProtocol("go.cmd.vtctldclient.command", "grpc") +} + +// This file contains utility methods for unit tests. +// We allow the creation of fake tablets, and running their event loop based +// on a FakeMysqlDaemon. + +// FakeTablet keeps track of a fake tablet in memory. It has: +// - a Tablet record (used for creating the tablet, kept for user's information) +// - a FakeMysqlDaemon (used by the fake event loop) +// - a 'done' channel (used to terminate the fake event loop) +type FakeTablet struct { + // Tablet and FakeMysqlDaemon are populated at NewFakeTablet time. + // We also create the RPCServer, so users can register more services + // before calling StartActionLoop(). + Tablet *topodatapb.Tablet + FakeMysqlDaemon *mysqlctl.FakeMysqlDaemon + RPCServer *grpc.Server + + // The following fields are created when we start the event loop for + // the tablet, and closed / cleared when we stop it. + // The Listener is used by the gRPC server. + TM *tabletmanager.TabletManager + Listener net.Listener + + // These optional fields are used if the tablet also needs to + // listen on the 'vt' port. + StartHTTPServer bool + HTTPListener net.Listener + HTTPServer *http.Server +} + +// TabletOption is an interface for changing tablet parameters. +// It's a way to pass multiple parameters to NewFakeTablet without +// making it too cumbersome. +type TabletOption func(tablet *topodatapb.Tablet) + +// TabletKeyspaceShard is the option to set the tablet keyspace and shard +func TabletKeyspaceShard(t *testing.T, keyspace, shard string) TabletOption { + return func(tablet *topodatapb.Tablet) { + tablet.Keyspace = keyspace + shard, kr, err := topo.ValidateShardName(shard) + if err != nil { + require.FailNow(t, "cannot ValidateShardName value %v", shard) + } + tablet.Shard = shard + tablet.KeyRange = kr + } +} + +// ForceInitTablet is the tablet option to set the 'force' flag during InitTablet +func ForceInitTablet() TabletOption { + return func(tablet *topodatapb.Tablet) { + // set the force_init field into the portmap as a hack + tablet.PortMap["force_init"] = 1 + } +} + +// StartHTTPServer is the tablet option to start the HTTP server when +// starting a tablet. +func StartHTTPServer() TabletOption { + return func(tablet *topodatapb.Tablet) { + // set the start_http_server field into the portmap as a hack + tablet.PortMap["start_http_server"] = 1 + } +} + +// NewFakeTablet creates the test tablet in the topology. 'uid' +// has to be between 0 and 99. All the tablet info will be derived +// from that. Look at the implementation if you need values. +// Use TabletOption implementations if you need to change values at creation. +// 'db' can be nil if the test doesn't use a database at all. +func NewFakeTablet(t *testing.T, ts *topo.Server, cell string, uid uint32, tabletType topodatapb.TabletType, db *fakesqldb.DB, options ...TabletOption) *FakeTablet { + t.Helper() + + if uid > 99 { + require.FailNow(t, "uid has to be between 0 and 99: %v", uid) + } + mysqlPort := int32(3300 + uid) + tablet := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: cell, Uid: uid}, + Hostname: "127.0.0.1", + MysqlHostname: "127.0.0.1", + PortMap: map[string]int32{ + "vt": int32(8100 + uid), + "grpc": int32(8200 + uid), + }, + Keyspace: "test_keyspace", + Shard: "0", + Type: tabletType, + } + tablet.MysqlPort = mysqlPort + for _, option := range options { + option(tablet) + } + _, startHTTPServer := tablet.PortMap["start_http_server"] + delete(tablet.PortMap, "start_http_server") + _, force := tablet.PortMap["force_init"] + delete(tablet.PortMap, "force_init") + if err := ts.InitTablet(context.Background(), tablet, force, true /* createShardAndKeyspace */, false /* allowUpdate */); err != nil { + require.FailNow(t, "cannot create tablet %v: %v", uid, err) + } + + // create a FakeMysqlDaemon with the right information by default. + fakeMysqlDaemon := mysqlctl.NewFakeMysqlDaemon(db) + fakeMysqlDaemon.MysqlPort.Store(mysqlPort) + + return &FakeTablet{ + Tablet: tablet, + FakeMysqlDaemon: fakeMysqlDaemon, + RPCServer: grpc.NewServer(), + StartHTTPServer: startHTTPServer, + } +} + +// StartActionLoop will start the action loop for a fake tablet, +// using ft.FakeMysqlDaemon as the backing mysqld. +func (ft *FakeTablet) StartActionLoop(t *testing.T, ts *topo.Server) { + t.Helper() + if ft.TM != nil { + require.FailNow(t, "TM for %v is already running", ft.Tablet.Alias) + } + + // Listen on a random port for gRPC. + var err error + ft.Listener, err = net.Listen("tcp", "127.0.0.1:0") + if err != nil { + require.FailNow(t, "Cannot listen: %v", err) + } + gRPCPort := int32(ft.Listener.Addr().(*net.TCPAddr).Port) + + // If needed, listen on a random port for HTTP. + vtPort := ft.Tablet.PortMap["vt"] + if ft.StartHTTPServer { + ft.HTTPListener, err = net.Listen("tcp", "127.0.0.1:0") + if err != nil { + require.FailNow(t, "Cannot listen on http port: %v", err) + } + handler := http.NewServeMux() + ft.HTTPServer = &http.Server{ + Handler: handler, + } + go func() { + _ = ft.HTTPServer.Serve(ft.HTTPListener) + }() + vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) + } + ft.Tablet.PortMap["vt"] = vtPort + ft.Tablet.PortMap["grpc"] = gRPCPort + ft.Tablet.Hostname = "127.0.0.1" + + // Create a test tm on that port, and re-read the record + // (it has new ports and IP). + ft.TM = &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: ft.FakeMysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + VREngine: vreplication.NewTestEngine(ts, ft.Tablet.Alias.Cell, ft.FakeMysqlDaemon, binlogplayer.NewFakeDBClient, binlogplayer.NewFakeDBClient, topoproto.TabletDbName(ft.Tablet), nil), + Env: vtenv.NewTestEnv(), + } + if err := ft.TM.Start(ft.Tablet, nil); err != nil { + require.FailNow(t, "Error in tablet - %v, err - %v", topoproto.TabletAliasString(ft.Tablet.Alias), err.Error()) + } + ft.Tablet = ft.TM.Tablet() + + // Register the gRPC server, and starts listening. + grpctmserver.RegisterForTest(ft.RPCServer, ft.TM) + go ft.RPCServer.Serve(ft.Listener) + + // And wait for it to serve, so we don't start using it before it's + // ready. + timeout := 5 * time.Second + step := 10 * time.Millisecond + c := tmclient.NewTabletManagerClient() + for timeout >= 0 { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + err := c.Ping(ctx, ft.TM.Tablet()) + cancel() + if err == nil { + break + } + time.Sleep(step) + timeout -= step + } + if timeout < 0 { + panic("StartActionLoop failed.") + } +} + +// StopActionLoop will stop the Action Loop for the given FakeTablet +func (ft *FakeTablet) StopActionLoop(t *testing.T) { + if ft.TM == nil { + return + } + if ft.StartHTTPServer { + ft.HTTPListener.Close() + } + ft.Listener.Close() + ft.TM.Stop() + ft.TM = nil + ft.Listener = nil + ft.HTTPListener = nil +} + +// Target returns the keyspace/shard/type info of this tablet as Target. +func (ft *FakeTablet) Target() *querypb.Target { + return &querypb.Target{ + Keyspace: ft.Tablet.Keyspace, + Shard: ft.Tablet.Shard, + TabletType: ft.Tablet.Type, + } +} diff --git a/go/cmd/vtctldclient/command/keyspaces.go b/go/cmd/vtctldclient/command/keyspaces.go index 4d1156291cf..7eb9494a9c9 100644 --- a/go/cmd/vtctldclient/command/keyspaces.go +++ b/go/cmd/vtctldclient/command/keyspaces.go @@ -110,19 +110,10 @@ SetKeyspaceDurabilityPolicy --durability-policy='semi_sync' customer`, Args: cobra.ExactArgs(1), RunE: commandSetKeyspaceDurabilityPolicy, } - // ValidateSchemaKeyspace makes a ValidateSchemaKeyspace gRPC call to a vtctld. - ValidateSchemaKeyspace = &cobra.Command{ - Use: "ValidateSchemaKeyspace [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", - Short: "Validates that the schema on the primary tablet for shard 0 matches the schema on all other tablets in the keyspace.", - DisableFlagsInUseLine: true, - Aliases: []string{"validateschemakeyspace"}, - Args: cobra.ExactArgs(1), - RunE: commandValidateSchemaKeyspace, - } // ValidateVersionKeyspace makes a ValidateVersionKeyspace gRPC call to a vtctld. ValidateVersionKeyspace = &cobra.Command{ Use: "ValidateVersionKeyspace ", - Short: "Validates that the version on the primary tablet of shard 0 matches all of the other tablets in the keyspace.", + Short: "Validates that the version on the primary tablet of the first shard matches all of the other tablets in the keyspace.", DisableFlagsInUseLine: true, Aliases: []string{"validateversionkeyspace"}, Args: cobra.ExactArgs(1), @@ -351,38 +342,6 @@ func commandSetKeyspaceDurabilityPolicy(cmd *cobra.Command, args []string) error return nil } -var validateSchemaKeyspaceOptions = struct { - ExcludeTables []string - IncludeViews bool - SkipNoPrimary bool - IncludeVSchema bool -}{} - -func commandValidateSchemaKeyspace(cmd *cobra.Command, args []string) error { - cli.FinishedParsing(cmd) - - ks := cmd.Flags().Arg(0) - resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ - Keyspace: ks, - ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, - IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, - SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, - IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, - }) - - if err != nil { - return err - } - - data, err := cli.MarshalJSON(resp) - if err != nil { - return err - } - - fmt.Printf("%s\n", data) - return nil -} - func commandValidateVersionKeyspace(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) @@ -429,11 +388,5 @@ func init() { SetKeyspaceDurabilityPolicy.Flags().StringVar(&setKeyspaceDurabilityPolicyOptions.DurabilityPolicy, "durability-policy", policy.DurabilityNone, "Type of durability to enforce for this keyspace. Default is none. Other values include 'semi_sync' and others as dictated by registered plugins.") Root.AddCommand(SetKeyspaceDurabilityPolicy) - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") - ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") - ValidateSchemaKeyspace.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") - Root.AddCommand(ValidateSchemaKeyspace) - Root.AddCommand(ValidateVersionKeyspace) } diff --git a/go/cmd/vtctldclient/command/permissions.go b/go/cmd/vtctldclient/command/permissions.go new file mode 100644 index 00000000000..57dc2c5b38e --- /dev/null +++ b/go/cmd/vtctldclient/command/permissions.go @@ -0,0 +1,114 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package command + +import ( + "fmt" + + "github.com/spf13/cobra" + + "vitess.io/vitess/go/cmd/vtctldclient/cli" + "vitess.io/vitess/go/vt/topo/topoproto" + + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +var ( + // GetPermissions makes a GetPermissions gRPC call to a vtctld. + GetPermissions = &cobra.Command{ + Use: "GetPermissions ", + Short: "Displays the permissions for a tablet.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandGetPermissions, + } + // ValidatePermissionsShard makes a ValidatePermissionsKeyspace gRPC call to a + // vtctld with the specified shard to examine in the keyspace. + ValidatePermissionsShard = &cobra.Command{ + Use: "ValidatePermissionsShard ", + Short: "Validates that the permissions on the primary match all of the replicas.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandValidatePermissionsShard, + } + // ValidatePermissionsKeyspace makes a ValidatePermissionsKeyspace gRPC call to a + // vtctld. + ValidatePermissionsKeyspace = &cobra.Command{ + Use: "ValidatePermissionsKeyspace ", + Short: "Validates that the permissions on the primary of the first shard match those of all of the other tablets in the keyspace.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(1), + RunE: commandValidatePermissionsKeyspace, + } +) + +func commandGetPermissions(cmd *cobra.Command, args []string) error { + alias, err := topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.GetPermissions(commandCtx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: alias, + }) + if err != nil { + return err + } + p, err := cli.MarshalJSON(resp.Permissions) + if err != nil { + return err + } + fmt.Printf("%s\n", p) + + return nil +} + +func commandValidatePermissionsKeyspace(cmd *cobra.Command, args []string) error { + keyspace := cmd.Flags().Arg(0) + + cli.FinishedParsing(cmd) + + _, err := client.ValidatePermissionsKeyspace(commandCtx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: keyspace, + }) + + return err +} + +func commandValidatePermissionsShard(cmd *cobra.Command, args []string) error { + keyspace, shard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + _, err = client.ValidatePermissionsKeyspace(commandCtx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: keyspace, + Shards: []string{shard}, + }) + + return err +} + +func init() { + Root.AddCommand(GetPermissions) + Root.AddCommand(ValidatePermissionsKeyspace) + Root.AddCommand(ValidatePermissionsShard) +} diff --git a/go/cmd/vtctldclient/command/permissions_test.go b/go/cmd/vtctldclient/command/permissions_test.go new file mode 100644 index 00000000000..a9ddba36f7f --- /dev/null +++ b/go/cmd/vtctldclient/command/permissions_test.go @@ -0,0 +1,608 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package command + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" + "vitess.io/vitess/go/vt/vtenv" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/memorytopo" + + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +func TestPermissions(t *testing.T) { + delay := discovery.GetTabletPickerRetryDelay() + defer func() { + discovery.SetTabletPickerRetryDelay(delay) + }() + discovery.SetTabletPickerRetryDelay(5 * time.Millisecond) + + // Initialize our environment. + ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) + defer cancel() + ts := memorytopo.NewServer(ctx, "cell1", "cell2") + defer ts.Close() + vtctld := grpcvtctldserver.NewVtctldServer(vtenv.NewTestEnv(), ts) + + primary := NewFakeTablet(t, ts, "cell1", 0, topodatapb.TabletType_PRIMARY, nil) + replica := NewFakeTablet(t, ts, "cell1", 1, topodatapb.TabletType_REPLICA, nil) + + // Mark the primary for the shard. + _, err := ts.UpdateShardFields(ctx, primary.Tablet.Keyspace, primary.Tablet.Shard, func(si *topo.ShardInfo) error { + si.PrimaryAlias = primary.Tablet.Alias + return nil + }) + require.NoError(t, err) + + // The primary will be asked for permissions. + primary.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ + "SELECT * FROM mysql.user ORDER BY host, user": { + Fields: []*querypb.Field{ + { + Name: "Host", + Type: sqltypes.Char, + }, + { + Name: "User", + Type: sqltypes.Char, + }, + { + Name: "Password", + Type: sqltypes.Char, + }, + { + Name: "Select_priv", + Type: sqltypes.Char, + }, + { + Name: "Insert_priv", + Type: sqltypes.Char, + }, + { + Name: "Update_priv", + Type: sqltypes.Char, + }, + { + Name: "Delete_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_priv", + Type: sqltypes.Char, + }, + { + Name: "Drop_priv", + Type: sqltypes.Char, + }, + { + Name: "Reload_priv", + Type: sqltypes.Char, + }, + { + Name: "Shutdown_priv", + Type: sqltypes.Char, + }, + { + Name: "Process_priv", + Type: sqltypes.Char, + }, + { + Name: "File_priv", + Type: sqltypes.Char, + }, + { + Name: "Grant_priv", + Type: sqltypes.Char, + }, + { + Name: "References_priv", + Type: sqltypes.Char, + }, + { + Name: "Index_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_db_priv", + Type: sqltypes.Char, + }, + { + Name: "Super_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tmp_table_priv", + Type: sqltypes.Char, + }, + { + Name: "Lock_tables_priv", + Type: sqltypes.Char, + }, + { + Name: "Execute_priv", + Type: sqltypes.Char, + }, + { + Name: "Repl_slave_priv", + Type: sqltypes.Char, + }, + { + Name: "Repl_client_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_user_priv", + Type: sqltypes.Char, + }, + { + Name: "Event_priv", + Type: sqltypes.Char, + }, + { + Name: "Trigger_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tablespace_priv", + Type: sqltypes.Char, + }, + { + Name: "ssl_type", + Type: sqltypes.Char, + }, + { + Name: "ssl_cipher", + Type: 252, + }, + { + Name: "x509_issuer", + Type: 252, + }, + { + Name: "x509_subject", + Type: 252, + }, + { + Name: "max_questions", + Type: 3, + }, + { + Name: "max_updates", + Type: 3, + }, + { + Name: "max_connections", + Type: 3, + }, + { + Name: "max_user_connections", + Type: 3, + }, + { + Name: "plugin", + Type: sqltypes.Char, + }, + { + Name: "authentication_string", + Type: 252, + }, + { + Name: "password_expired", + Type: sqltypes.Char, + }, + { + Name: "is_role", + Type: sqltypes.Char, + }}, + RowsAffected: 0x6, + InsertID: 0x0, + Rows: [][]sqltypes.Value{ + { + sqltypes.NewVarBinary("test_host1"), + sqltypes.NewVarBinary("test_user1"), + sqltypes.NewVarBinary("test_password1"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host2"), + sqltypes.NewVarBinary("test_user2"), + sqltypes.NewVarBinary("test_password2"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host3"), + sqltypes.NewVarBinary("test_user3"), + sqltypes.NewVarBinary("test_password3"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N")}, + { + sqltypes.NewVarBinary("test_host4"), + sqltypes.NewVarBinary("test_user4"), + sqltypes.NewVarBinary("test_password4"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary("0"), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary(""), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("N"), + }, + }, + }, + "SELECT * FROM mysql.db ORDER BY host, db, user": { + Fields: []*querypb.Field{ + { + Name: "Host", + Type: sqltypes.Char, + }, + { + Name: "Db", + Type: sqltypes.Char, + }, + { + Name: "User", + Type: sqltypes.Char, + }, + { + Name: "Select_priv", + Type: sqltypes.Char, + }, + { + Name: "Insert_priv", + Type: sqltypes.Char, + }, + { + Name: "Update_priv", + Type: sqltypes.Char, + }, + { + Name: "Delete_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_priv", + Type: sqltypes.Char, + }, + { + Name: "Drop_priv", + Type: sqltypes.Char, + }, + { + Name: "Grant_priv", + Type: sqltypes.Char, + }, + { + Name: "References_priv", + Type: sqltypes.Char, + }, + { + Name: "Index_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_tmp_table_priv", + Type: sqltypes.Char, + }, + { + Name: "Lock_tables_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Show_view_priv", + Type: sqltypes.Char, + }, + { + Name: "Create_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Alter_routine_priv", + Type: sqltypes.Char, + }, + { + Name: "Execute_priv", + Type: sqltypes.Char, + }, + { + Name: "Event_priv", + Type: sqltypes.Char, + }, + { + Name: "Trigger_priv", + Type: sqltypes.Char, + }, + }, + RowsAffected: 0, + InsertID: 0, + Rows: [][]sqltypes.Value{ + { + sqltypes.NewVarBinary("test_host"), + sqltypes.NewVarBinary("test_db"), + sqltypes.NewVarBinary("test_user"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("N"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + sqltypes.NewVarBinary("Y"), + }, + }, + }, + } + primary.StartActionLoop(t, ts) + defer primary.StopActionLoop(t) + + // Make a two-level-deep copy, so we can make them diverge later. + user := *primary.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"] + user.Fields = append([]*querypb.Field{}, user.Fields...) + + // The replica will be asked for permissions. + replica.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ + "SELECT * FROM mysql.user ORDER BY host, user": &user, + "SELECT * FROM mysql.db ORDER BY host, db, user": primary.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.db ORDER BY host, db, user"], + } + replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) + replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + // These 3 statements come from tablet startup. + "STOP REPLICA", + "FAKE SET SOURCE", + "START REPLICA", + } + replica.StartActionLoop(t, ts) + defer replica.StopActionLoop(t) + + // Overwrite with the correct value to make sure it passes. + replica.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"].Fields[0] = &querypb.Field{ + Name: "Host", + Type: sqltypes.Char, + } + + _, err = vtctld.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: primary.Tablet.Alias, + }) + require.NoError(t, err) + + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + }) + require.NoError(t, err) + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + Shards: []string{primary.Tablet.Shard}, + }) + require.NoError(t, err) + + // Modify one field, which should result in a validation failure/error. + replica.FakeMysqlDaemon.FetchSuperQueryMap["SELECT * FROM mysql.user ORDER BY host, user"].Fields[0] = &querypb.Field{ + Name: "Wrong", + Type: sqltypes.Char, + } + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + }) + require.ErrorContains(t, err, "has an extra user") + _, err = vtctld.ValidatePermissionsKeyspace(ctx, &vtctldatapb.ValidatePermissionsKeyspaceRequest{ + Keyspace: primary.Tablet.Keyspace, + Shards: []string{primary.Tablet.Shard}, + }) + require.ErrorContains(t, err, "has an extra user") +} diff --git a/go/cmd/vtctldclient/command/root.go b/go/cmd/vtctldclient/command/root.go index 3ebe019f94d..2a65a59f606 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -37,7 +37,6 @@ import ( "vitess.io/vitess/go/vt/vtctl/localvtctldclient" "vitess.io/vitess/go/vt/vtctl/vtctldclient" "vitess.io/vitess/go/vt/vtenv" - "vitess.io/vitess/go/vt/vttablet/tmclient" // These imports ensure init()s within them get called and they register their commands/subcommands. "vitess.io/vitess/go/cmd/vtctldclient/cli" @@ -97,8 +96,8 @@ var ( // Root is the main entrypoint to the vtctldclient CLI. Root = &cobra.Command{ Use: "vtctldclient", - Short: "Executes a cluster management command on the remote vtctld server.", - Long: fmt.Sprintf(`Executes a cluster management command on the remote vtctld server. + Short: "Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal.", + Long: fmt.Sprintf(`Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal. If there are no running vtctld servers -- for example when bootstrapping a new Vitess cluster -- you can specify a --server value of '%s'. When doing so, you would use the --topo* flags so that the client can @@ -204,14 +203,6 @@ func getClientForCommand(cmd *cobra.Command) (vtctldclient.VtctldClient, error) } onTerm = append(onTerm, ts.Close) - // Use internal vtctld server implementation. - // Register a nil grpc handler -- we will not use tmclient at all but - // a factory still needs to be registered. - once.Do(func() { - tmclient.RegisterTabletManagerClientFactory("grpc", func() tmclient.TabletManagerClient { - return nil - }) - }) vtctld := grpcvtctldserver.NewVtctldServer(env, ts) localvtctldclient.SetServer(vtctld) VtctldClientProtocol = "local" diff --git a/go/cmd/vtctldclient/command/root_test.go b/go/cmd/vtctldclient/command/root_test.go index 86333ec0e69..0f0cdca8dcd 100644 --- a/go/cmd/vtctldclient/command/root_test.go +++ b/go/cmd/vtctldclient/command/root_test.go @@ -67,15 +67,15 @@ func TestRootWithInternalVtctld(t *testing.T) { cell := "zone1" ts, factory := memorytopo.NewServerAndFactory(ctx, cell) topo.RegisterFactory("test", factory) + origProtocol := command.VtctldClientProtocol command.VtctldClientProtocol = "local" baseArgs := []string{"vtctldclient", "--server", "internal", "--topo-implementation", "test"} args := append([]string{}, os.Args...) - protocol := command.VtctldClientProtocol t.Cleanup(func() { ts.Close() os.Args = append([]string{}, args...) - command.VtctldClientProtocol = protocol + command.VtctldClientProtocol = origProtocol }) testCases := []struct { diff --git a/go/cmd/vtctldclient/command/schema.go b/go/cmd/vtctldclient/command/schema.go index db34bd2588f..21a995f30a1 100644 --- a/go/cmd/vtctldclient/command/schema.go +++ b/go/cmd/vtctldclient/command/schema.go @@ -32,8 +32,9 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" - "vitess.io/vitess/go/vt/proto/vtrpc" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) var ( @@ -58,6 +59,13 @@ For --sql, semi-colons and repeated values may be mixed, for example: Args: cobra.ExactArgs(1), RunE: commandApplySchema, } + CopySchemaShard = &cobra.Command{ + Use: "CopySchemaShard [--tables=,,...] [--exclude-tables=,,...] [--include-views] [--skip-verify] [--wait-replicas-timeout=10s] { || } ", + Short: "Copies the schema from a source shard's primary (or a specific tablet) to a destination shard. The schema is applied directly on the primary of the destination shard, and it is propagated to the replicas through binlogs.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(2), + RunE: commandCopySchemaShard, + } // GetSchema makes a GetSchema gRPC call to a vtctld. GetSchema = &cobra.Command{ Use: "GetSchema [--tables TABLES ...] [--exclude-tables EXCLUDE_TABLES ...] [{--table-names-only | --table-sizes-only}] [--include-views] alias", @@ -90,6 +98,25 @@ For --sql, semi-colons and repeated values may be mixed, for example: Args: cobra.ExactArgs(1), RunE: commandReloadSchemaShard, } + // ValidateSchemaKeyspace makes a ValidateSchemaKeyspace gRPC call to a vtctld. + ValidateSchemaKeyspace = &cobra.Command{ + Use: "ValidateSchemaKeyspace [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", + Short: "Validates that the schema on the primary tablet for the first shard matches the schema on all other tablets in the keyspace.", + DisableFlagsInUseLine: true, + Aliases: []string{"validateschemakeyspace"}, + Args: cobra.ExactArgs(1), + RunE: commandValidateSchemaKeyspace, + } + // ValidateSchemaShard makes a ValidateSchemaKeyspace gRPC call to a vtctld with + // the specified shard to examine in the keyspace. + ValidateSchemaShard = &cobra.Command{ + Use: "ValidateSchemaShard [--exclude-tables=] [--include-views] [--skip-no-primary] [--include-vschema] ", + Short: "Validates that the schema on the primary tablet for the specified shard matches the schema on all other tablets in that shard.", + DisableFlagsInUseLine: true, + Aliases: []string{"validateschemashard"}, + Args: cobra.ExactArgs(1), + RunE: commandValidateSchemaShard, + } ) var applySchemaOptions = struct { @@ -129,9 +156,9 @@ func commandApplySchema(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) - var cid *vtrpc.CallerID + var cid *vtrpcpb.CallerID if applySchemaOptions.CallerID != "" { - cid = &vtrpc.CallerID{Principal: applySchemaOptions.CallerID} + cid = &vtrpcpb.CallerID{Principal: applySchemaOptions.CallerID} } ks := cmd.Flags().Arg(0) @@ -154,6 +181,61 @@ func commandApplySchema(cmd *cobra.Command, args []string) error { return nil } +var copySchemaShardOptions = struct { + tables []string + excludeTables []string + includeViews bool + skipVerify bool + waitReplicasTimeout time.Duration +}{} + +func commandCopySchemaShard(cmd *cobra.Command, args []string) error { + destKeyspace, destShard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(1)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + var sourceTabletAlias *topodatapb.TabletAlias + sourceKeyspace, sourceShard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err == nil { + res, err := client.GetTablets(commandCtx, &vtctldatapb.GetTabletsRequest{ + Keyspace: sourceKeyspace, + Shard: sourceShard, + TabletType: topodatapb.TabletType_PRIMARY, + }) + if err != nil { + return err + } + tablets := res.GetTablets() + if len(tablets) == 0 { + return fmt.Errorf("no primary tablet found in source shard %s/%s", sourceKeyspace, sourceShard) + } + sourceTabletAlias = tablets[0].Alias + } else { + sourceTabletAlias, err = topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) + if err != nil { + return err + } + } + + req := &vtctldatapb.CopySchemaShardRequest{ + SourceTabletAlias: sourceTabletAlias, + Tables: copySchemaShardOptions.tables, + ExcludeTables: copySchemaShardOptions.excludeTables, + IncludeViews: copySchemaShardOptions.includeViews, + SkipVerify: copySchemaShardOptions.skipVerify, + WaitReplicasTimeout: protoutil.DurationToProto(copySchemaShardOptions.waitReplicasTimeout), + DestinationKeyspace: destKeyspace, + DestinationShard: destShard, + } + + _, err = client.CopySchemaShard(commandCtx, req) + + return err +} + var getSchemaOptions = struct { Tables []string ExcludeTables []string @@ -284,6 +366,69 @@ func commandReloadSchemaShard(cmd *cobra.Command, args []string) error { return err } +var validateSchemaKeyspaceOptions = struct { + ExcludeTables []string + IncludeViews bool + SkipNoPrimary bool + IncludeVSchema bool + Shard string +}{} + +func commandValidateSchemaKeyspace(cmd *cobra.Command, args []string) error { + cli.FinishedParsing(cmd) + + keyspace := cmd.Flags().Arg(0) + resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ + Keyspace: keyspace, + ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, + IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, + SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, + IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, + }) + + if err != nil { + return err + } + + data, err := cli.MarshalJSON(resp.ResultsByShard) + if err != nil { + return err + } + + fmt.Printf("%s\n", data) + return nil +} + +func commandValidateSchemaShard(cmd *cobra.Command, args []string) error { + keyspace, shard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.ValidateSchemaKeyspace(commandCtx, &vtctldatapb.ValidateSchemaKeyspaceRequest{ + Keyspace: keyspace, + Shards: []string{shard}, + ExcludeTables: validateSchemaKeyspaceOptions.ExcludeTables, + IncludeVschema: validateSchemaKeyspaceOptions.IncludeVSchema, + SkipNoPrimary: validateSchemaKeyspaceOptions.SkipNoPrimary, + IncludeViews: validateSchemaKeyspaceOptions.IncludeViews, + }) + + if err != nil { + return err + } + + data, err := cli.MarshalJSON(resp.Results) + if err != nil { + return err + } + + fmt.Printf("%s\n", data) + return nil +} + func init() { ApplySchema.Flags().StringVar(&applySchemaOptions.DDLStrategy, "ddl-strategy", string(schema.DDLStrategyDirect), "Online DDL strategy, compatible with @@ddl_strategy session variable (examples: 'gh-ost', 'pt-osc', 'gh-ost --max-load=Threads_running=100'.") ApplySchema.Flags().StringSliceVar(&applySchemaOptions.UUIDList, "uuid", nil, "Optional, comma-delimited, repeatable, explicit UUIDs for migration. If given, must match number of DDL changes.") @@ -293,16 +438,21 @@ func init() { ApplySchema.Flags().StringArrayVar(&applySchemaOptions.SQL, "sql", nil, "Semicolon-delimited, repeatable SQL commands to apply. Exactly one of --sql|--sql-file is required.") ApplySchema.Flags().StringVar(&applySchemaOptions.SQLFile, "sql-file", "", "Path to a file containing semicolon-delimited SQL commands to apply. Exactly one of --sql|--sql-file is required.") ApplySchema.Flags().Int64Var(&applySchemaOptions.BatchSize, "batch-size", 0, "How many queries to batch together. Only applicable when all queries are CREATE TABLE|VIEW") - Root.AddCommand(ApplySchema) + CopySchemaShard.Flags().StringSliceVar(©SchemaShardOptions.tables, "tables", nil, "Specifies a comma-separated list of tables to copy. Each is either an exact match, or a regular expression of the form /regexp/") + CopySchemaShard.Flags().StringSliceVar(©SchemaShardOptions.excludeTables, "exclude-tables", nil, "Specifies a comma-separated list of tables to exclude. Each is either an exact match, or a regular expression of the form /regexp/") + CopySchemaShard.Flags().BoolVar(©SchemaShardOptions.includeViews, "include-views", true, "Includes views in the output") + CopySchemaShard.Flags().BoolVar(©SchemaShardOptions.skipVerify, "skip-verify", false, "Skip verification of source and target schema after copy") + CopySchemaShard.Flags().DurationVar(©SchemaShardOptions.waitReplicasTimeout, "wait-replicas-timeout", grpcvtctldserver.DefaultWaitReplicasTimeout, "The amount of time to wait for replicas to receive the schema change via replication.") + Root.AddCommand(CopySchemaShard) + GetSchema.Flags().StringSliceVar(&getSchemaOptions.Tables, "tables", nil, "List of tables to display the schema for. Each is either an exact match, or a regular expression of the form `/regexp/`.") GetSchema.Flags().StringSliceVar(&getSchemaOptions.ExcludeTables, "exclude-tables", nil, "List of tables to exclude from the result. Each is either an exact match, or a regular expression of the form `/regexp/`.") GetSchema.Flags().BoolVar(&getSchemaOptions.IncludeViews, "include-views", false, "Includes views in the output in addition to base tables.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableNamesOnly, "table-names-only", "n", false, "Display only table names in the result.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableSizesOnly, "table-sizes-only", "s", false, "Display only size information for matching tables. Ignored if --table-names-only is set.") GetSchema.Flags().BoolVarP(&getSchemaOptions.TableSchemaOnly, "table-schema-only", "", false, "Skip introspecting columns and fields metadata.") - Root.AddCommand(GetSchema) Root.AddCommand(ReloadSchema) @@ -314,4 +464,16 @@ func init() { ReloadSchemaShard.Flags().Int32Var(&reloadSchemaShardOptions.Concurrency, "concurrency", 10, "Number of tablets to reload in parallel. Set to zero for unbounded concurrency.") ReloadSchemaShard.Flags().BoolVar(&reloadSchemaShardOptions.IncludePrimary, "include-primary", false, "Also reload the primary tablet.") Root.AddCommand(ReloadSchemaShard) + + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") + ValidateSchemaKeyspace.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") + ValidateSchemaKeyspace.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") + Root.AddCommand(ValidateSchemaKeyspace) + + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeViews, "include-views", false, "Includes views in compared schemas.") + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.IncludeVSchema, "include-vschema", false, "Includes VSchema validation in validation results.") + ValidateSchemaShard.Flags().BoolVar(&validateSchemaKeyspaceOptions.SkipNoPrimary, "skip-no-primary", false, "Skips validation on whether or not a primary exists in shards.") + ValidateSchemaShard.Flags().StringSliceVar(&validateSchemaKeyspaceOptions.ExcludeTables, "exclude-tables", []string{}, "Tables to exclude during schema comparison.") + Root.AddCommand(ValidateSchemaShard) } diff --git a/go/cmd/vtctldclient/command/tablets.go b/go/cmd/vtctldclient/command/tablets.go index bb468fbd7ff..3ee7de1e867 100644 --- a/go/cmd/vtctldclient/command/tablets.go +++ b/go/cmd/vtctldclient/command/tablets.go @@ -92,14 +92,6 @@ Note: hook names may not contain slash (/) characters. Args: cobra.ExactArgs(1), RunE: commandGetFullStatus, } - // GetPermissions makes a GetPermissions gRPC call to a vtctld. - GetPermissions = &cobra.Command{ - Use: "GetPermissions ", - Short: "Displays the permissions for a tablet.", - DisableFlagsInUseLine: true, - Args: cobra.ExactArgs(1), - RunE: commandGetPermissions, - } // GetTablet makes a GetTablet gRPC call to a vtctld. GetTablet = &cobra.Command{ Use: "GetTablet ", @@ -380,29 +372,6 @@ func commandGetFullStatus(cmd *cobra.Command, args []string) error { return nil } -func commandGetPermissions(cmd *cobra.Command, args []string) error { - alias, err := topoproto.ParseTabletAlias(cmd.Flags().Arg(0)) - if err != nil { - return err - } - - cli.FinishedParsing(cmd) - - resp, err := client.GetPermissions(commandCtx, &vtctldatapb.GetPermissionsRequest{ - TabletAlias: alias, - }) - if err != nil { - return err - } - p, err := cli.MarshalJSON(resp.Permissions) - if err != nil { - return err - } - fmt.Printf("%s\n", p) - - return nil -} - func commandGetTablet(cmd *cobra.Command, args []string) error { aliasStr := cmd.Flags().Arg(0) alias, err := topoproto.ParseTabletAlias(aliasStr) @@ -685,7 +654,6 @@ func init() { Root.AddCommand(ExecuteHook) Root.AddCommand(GetFullStatus) - Root.AddCommand(GetPermissions) Root.AddCommand(GetTablet) GetTablets.Flags().StringSliceVarP(&getTabletsOptions.TabletAliasStrings, "tablet-alias", "t", nil, "List of tablet aliases to filter by.") diff --git a/go/cmd/vtctldclient/command/topology.go b/go/cmd/vtctldclient/command/topology.go index 6aa6949341c..a03ce403eb8 100644 --- a/go/cmd/vtctldclient/command/topology.go +++ b/go/cmd/vtctldclient/command/topology.go @@ -18,10 +18,13 @@ package command import ( "fmt" + "os" + "strings" "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/cli" + "vitess.io/vitess/go/vt/topo" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -36,12 +39,30 @@ var ( RunE: commandGetTopologyPath, } + // WriteTopologyPath writes the contents of a local file to a path + // in the topology server. + WriteTopologyPath = &cobra.Command{ + Use: "WriteTopologyPath --server=local ", + Short: "Copies a local file to the topology server at the given path.", + DisableFlagsInUseLine: true, + Args: cobra.ExactArgs(2), + PreRunE: func(cmd *cobra.Command, args []string) error { + if VtctldClientProtocol != "local" { + return fmt.Errorf("The WriteTopologyPath command can only be used with --server=%s", useInternalVtctld) + } + return nil + }, + RunE: commandWriteTopologyPath, + } +) + +var getTopologyPathOptions = struct { // The version of the key/path to get. If not specified, the latest/current // version is returned. - version int64 = 0 + version int64 // If true, only the data is output and it is in JSON format rather than prototext. - dataAsJSON bool = false -) + dataAsJSON bool +}{} func commandGetTopologyPath(cmd *cobra.Command, args []string) error { path := cmd.Flags().Arg(0) @@ -50,14 +71,14 @@ func commandGetTopologyPath(cmd *cobra.Command, args []string) error { resp, err := client.GetTopologyPath(commandCtx, &vtctldatapb.GetTopologyPathRequest{ Path: path, - Version: version, - AsJson: dataAsJSON, + Version: getTopologyPathOptions.version, + AsJson: getTopologyPathOptions.dataAsJSON, }) if err != nil { return err } - if dataAsJSON { + if getTopologyPathOptions.dataAsJSON { if resp.GetCell() == nil || resp.GetCell().GetData() == "" { return fmt.Errorf("no data found for path %s", path) } @@ -75,8 +96,41 @@ func commandGetTopologyPath(cmd *cobra.Command, args []string) error { return nil } +var writeTopologyPathOptions = struct { + // The cell to use for the copy. Defaults to the global cell. + cell string +}{} + +func commandWriteTopologyPath(cmd *cobra.Command, args []string) error { + file := cmd.Flags().Arg(0) + path := cmd.Flags().Arg(1) + ts, err := topo.OpenServer(topoOptions.implementation, strings.Join(topoOptions.globalServerAddresses, ","), topoOptions.globalRoot) + if err != nil { + return fmt.Errorf("failed to connect to the topology server: %v", err) + } + cli.FinishedParsing(cmd) + + conn, err := ts.ConnForCell(cmd.Context(), writeTopologyPathOptions.cell) + if err != nil { + return fmt.Errorf("failed to connect to the topology server: %v", err) + } + data, err := os.ReadFile(file) + if err != nil { + return fmt.Errorf("failed to read file %s: %v", file, err) + } + _, err = conn.Update(cmd.Context(), path, data, nil) + if err != nil { + return fmt.Errorf("failed to write to topology server path %s: %v", path, err) + } + + return nil +} + func init() { - GetTopologyPath.Flags().Int64Var(&version, "version", version, "The version of the path's key to get. If not specified, the latest version is returned.") - GetTopologyPath.Flags().BoolVar(&dataAsJSON, "data-as-json", dataAsJSON, "If true, only the data is output and it is in JSON format rather than prototext.") + GetTopologyPath.Flags().Int64Var(&getTopologyPathOptions.version, "version", getTopologyPathOptions.version, "The version of the path's key to get. If not specified, the latest version is returned.") + GetTopologyPath.Flags().BoolVar(&getTopologyPathOptions.dataAsJSON, "data-as-json", getTopologyPathOptions.dataAsJSON, "If true, only the data is output and it is in JSON format rather than prototext.") Root.AddCommand(GetTopologyPath) + + WriteTopologyPath.Flags().StringVar(&writeTopologyPathOptions.cell, "cell", topo.GlobalCell, "Topology server cell to copy the file to.") + Root.AddCommand(WriteTopologyPath) } diff --git a/go/cmd/vtctldclient/main.go b/go/cmd/vtctldclient/main.go index a9add98f822..4f31204ca8c 100644 --- a/go/cmd/vtctldclient/main.go +++ b/go/cmd/vtctldclient/main.go @@ -29,6 +29,8 @@ import ( "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/vtctl/grpcclientcommon" "vitess.io/vitess/go/vt/vtctl/vtctlclient" + "vitess.io/vitess/go/vt/vttablet/grpctmclient" + "vitess.io/vitess/go/vt/vttablet/tmclient" _flag "vitess.io/vitess/go/internal/flag" ) @@ -44,6 +46,8 @@ func main() { grpcclient.RegisterFlags(command.Root.PersistentFlags()) grpccommon.RegisterFlags(command.Root.PersistentFlags()) grpcclientcommon.RegisterFlags(command.Root.PersistentFlags()) + grpctmclient.RegisterFlags(command.Root.PersistentFlags()) + tmclient.RegisterFlags(command.Root.PersistentFlags()) servenv.RegisterMySQLServerFlags(command.Root.PersistentFlags()) vtctlclient.RegisterFlags(command.Root.PersistentFlags()) acl.RegisterFlags(command.Root.PersistentFlags()) diff --git a/go/cmd/vtctldclient/plugin_grpctmclient.go b/go/cmd/vtctldclient/plugin_grpctmclient.go new file mode 100644 index 00000000000..890562ddc1a --- /dev/null +++ b/go/cmd/vtctldclient/plugin_grpctmclient.go @@ -0,0 +1,28 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +// Imports and registers the gRPC tabletmanager client. +// This is needed when --server=internal as the vtctldclient +// binary will then not only need to talk to the topo server +// directly but it will also need to talk to tablets directly +// via tmclient. + +import ( + _ "vitess.io/vitess/go/vt/vttablet/grpctmclient" + _ "vitess.io/vitess/go/vt/vttablet/tmclient" +) diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index bfa50a4d98c..0e0c91fbf7d 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -1,4 +1,4 @@ -Executes a cluster management command on the remote vtctld server. +Executes a cluster management command on the remote vtctld server or alternatively as a standalone binary using --server=internal. If there are no running vtctld servers -- for example when bootstrapping a new Vitess cluster -- you can specify a --server value of 'internal'. When doing so, you would use the --topo* flags so that the client can @@ -21,6 +21,7 @@ Available Commands: ChangeTabletTags Changes the tablet tags for the specified tablet, if possible. ChangeTabletType Changes the db type for the specified tablet, if possible. CheckThrottler Issue a throttler check on the given tablet. + CopySchemaShard Copies the schema from a source shard's primary (or a specific tablet) to a destination shard. The schema is applied directly on the primary of the destination shard, and it is propagated to the replicas through binlogs. CreateKeyspace Creates the specified keyspace in the topology. CreateShard Creates the specified shard in the topology. DeleteCellInfo Deletes the CellInfo for the provided cell. @@ -104,52 +105,63 @@ Available Commands: VDiff Perform commands related to diffing tables involved in a VReplication workflow between the source and target. Validate Validates that all nodes reachable from the global replication graph, as well as all tablets in discoverable cells, are consistent. ValidateKeyspace Validates that all nodes reachable from the specified keyspace are consistent. - ValidateSchemaKeyspace Validates that the schema on the primary tablet for shard 0 matches the schema on all other tablets in the keyspace. + ValidatePermissionsKeyspace Validates that the permissions on the primary of the first shard match those of all of the other tablets in the keyspace. + ValidatePermissionsShard Validates that the permissions on the primary match all of the replicas. + ValidateSchemaKeyspace Validates that the schema on the primary tablet for the first shard matches the schema on all other tablets in the keyspace. + ValidateSchemaShard Validates that the schema on the primary tablet for the specified shard matches the schema on all other tablets in that shard. ValidateShard Validates that all nodes reachable from the specified shard are consistent. - ValidateVersionKeyspace Validates that the version on the primary tablet of shard 0 matches all of the other tablets in the keyspace. + ValidateVersionKeyspace Validates that the version on the primary tablet of the first shard matches all of the other tablets in the keyspace. ValidateVersionShard Validates that the version on the primary matches all of the replicas. Workflow Administer VReplication workflows (Reshard, MoveTables, etc) in the given keyspace. + WriteTopologyPath Copies a local file to the topology server at the given path. completion Generate the autocompletion script for the specified shell help Help about any command Flags: - --action_timeout duration timeout to use for the command (default 1h0m0s) - --alsologtostderr log to standard error as well as files - --compact use compact format for otherwise verbose outputs - --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. - --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy - --grpc_enable_tracing Enable gRPC tracing. - --grpc_initial_conn_window_size int gRPC initial connection window size - --grpc_initial_window_size int gRPC initial window size - --grpc_keepalive_time duration After a duration of this time, if the client doesn't see any activity, it pings the server to see if the transport is still alive. (default 10s) - --grpc_keepalive_timeout duration After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) - --grpc_max_message_size int Maximum allowed RPC message size. Larger messages will be rejected by gRPC with the error 'exceeding the max size'. (default 16777216) - --grpc_prometheus Enable gRPC monitoring with Prometheus. - -h, --help help for vtctldclient - --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) - --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace - --log_dir string If non-empty, write log files in this directory - --log_link string If non-empty, add symbolic links in this directory to the log files - --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) - --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. - --logtostderr log to standard error instead of files - --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") - --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) - --server string server to use for the connection (required) - --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) - --topo-global-root string the path of the global topology data in the global topology server (default "/vitess/global") - --topo-global-server-address strings the address of the global topology server(s) (default [localhost:2379]) - --topo-implementation string the topology implementation to use (default "etcd2") - -v, --v Level log level for V logs - --version version for vtctldclient - --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging - --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") - --vtctld_grpc_ca string the server ca to use to validate servers when connecting - --vtctld_grpc_cert string the cert to use to connect - --vtctld_grpc_crl string the server crl to use to validate server certificates when connecting - --vtctld_grpc_key string the key to use to connect - --vtctld_grpc_server_name string the server name to use to validate server certificate + --action_timeout duration timeout to use for the command (default 1h0m0s) + --alsologtostderr log to standard error as well as files + --compact use compact format for otherwise verbose outputs + --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. + --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy + --grpc_enable_tracing Enable gRPC tracing. + --grpc_initial_conn_window_size int gRPC initial connection window size + --grpc_initial_window_size int gRPC initial window size + --grpc_keepalive_time duration After a duration of this time, if the client doesn't see any activity, it pings the server to see if the transport is still alive. (default 10s) + --grpc_keepalive_timeout duration After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) + --grpc_max_message_size int Maximum allowed RPC message size. Larger messages will be rejected by gRPC with the error 'exceeding the max size'. (default 16777216) + --grpc_prometheus Enable gRPC monitoring with Prometheus. + -h, --help help for vtctldclient + --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) + --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace + --log_dir string If non-empty, write log files in this directory + --log_link string If non-empty, add symbolic links in this directory to the log files + --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. + --logtostderr log to standard error instead of files + --mysql_server_version string MySQL server version to advertise. (default "8.0.40-Vitess") + --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) + --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) + --server string server to use for the connection (required) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting + --tablet_manager_grpc_cert string the cert to use to connect + --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,App}, CheckThrottler and FullStatus) (default 8) + --tablet_manager_grpc_crl string the server crl to use to validate server certificates when connecting + --tablet_manager_grpc_key string the key to use to connect + --tablet_manager_grpc_server_name string the server name to use to validate server certificate + --tablet_manager_protocol string Protocol to use to make tabletmanager RPCs to vttablets. (default "grpc") + --topo-global-root string the path of the global topology data in the global topology server (default "/vitess/global") + --topo-global-server-address strings the address of the global topology server(s) (default [localhost:2379]) + --topo-implementation string the topology implementation to use (default "etcd2") + -v, --v Level log level for V logs + --version version for vtctldclient + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging + --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") + --vtctld_grpc_ca string the server ca to use to validate servers when connecting + --vtctld_grpc_cert string the cert to use to connect + --vtctld_grpc_crl string the server crl to use to validate server certificates when connecting + --vtctld_grpc_key string the key to use to connect + --vtctld_grpc_server_name string the server name to use to validate server certificate Use "vtctldclient [command] --help" for more information about a command. diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index 85a9ae7be16..0ad25301af0 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -287,11 +287,8 @@ func verifyBackupCount(t *testing.T, shardKsName string, expected int) []string } func listBackups(shardKsName string) ([]string, error) { - backups, err := localCluster.VtctlProcess.ExecuteCommandWithOutput( - "--backup_storage_implementation", "file", - "--file_backup_storage_root", - path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), - "ListBackups", shardKsName, + backups, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput( + "GetBackups", shardKsName, ) if err != nil { return nil, err @@ -311,10 +308,7 @@ func removeBackups(t *testing.T) { backups, err := listBackups(shardKsName) require.NoError(t, err) for _, backup := range backups { - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput( - "--backup_storage_implementation", "file", - "--file_backup_storage_root", - path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput( "RemoveBackup", shardKsName, backup, ) require.NoError(t, err) diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index 6e1840b2979..54003416776 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -76,7 +76,7 @@ func TestMain(m *testing.M) { }, } shard := &localCluster.Keyspaces[0].Shards[0] - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 86b2612a044..afa5023a047 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -254,7 +254,7 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp if err := localCluster.InitTablet(replica2, keyspaceName, shard.Name); err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/cellalias/cell_alias_test.go b/go/test/endtoend/cellalias/cell_alias_test.go index 6e8f901a245..ef003754655 100644 --- a/go/test/endtoend/cellalias/cell_alias_test.go +++ b/go/test/endtoend/cellalias/cell_alias_test.go @@ -109,12 +109,12 @@ func TestMain(m *testing.M) { if err != nil { return 1, err } - err = localCluster.VtctlProcess.AddCellInfo(cell2) + err = localCluster.VtctldClientProcess.AddCellInfo(cell2) if err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 2ac46a8d145..ed61f7fd0c9 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -101,9 +101,7 @@ type LocalProcessCluster struct { VtctlMajorVersion int // standalone executable - VtctlclientProcess VtctlClientProcess VtctldClientProcess VtctldClientProcess - VtctlProcess VtctlProcess VtadminProcess VtAdminProcess // background executable processes @@ -249,15 +247,6 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { } } - cluster.VtctlProcess = *VtctlProcessInstance(cluster.TopoProcess.Port, cluster.Hostname) - if !cluster.ReusingVTDATAROOT { - if err = cluster.VtctlProcess.AddCellInfo(cluster.Cell); err != nil { - log.Error(err) - return - } - cluster.VtctlProcess.LogDir = cluster.TmpDirectory - } - cluster.VtctldProcess = *VtctldProcessInstance(cluster.GetAndReservePort(), cluster.GetAndReservePort(), cluster.TopoProcess.Port, cluster.Hostname, cluster.TmpDirectory) log.Infof("Starting vtctld server on port: %d", cluster.VtctldProcess.Port) @@ -267,8 +256,15 @@ func (cluster *LocalProcessCluster) StartTopo() (err error) { return } - cluster.VtctlclientProcess = *VtctlClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) - cluster.VtctldClientProcess = *VtctldClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) + cluster.VtctldClientProcess = *cluster.NewVtctldClientProcessInstance("localhost", cluster.VtctldProcess.GrpcPort, cluster.TmpDirectory) + if !cluster.ReusingVTDATAROOT { + if err = cluster.VtctldClientProcess.AddCellInfo(cluster.Cell); err != nil { + log.Error(err) + return + } + cluster.VtctldClientProcess.LogDir = cluster.TmpDirectory + } + return } @@ -388,7 +384,7 @@ func (cluster *LocalProcessCluster) startKeyspace(keyspace Keyspace, shardNames keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + _ = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) for _, shardName := range shardNames { shard, err := cluster.AddShard(keyspace.Name, shardName, totalTabletsRequired, rdonly, customizers) if err != nil { @@ -560,7 +556,7 @@ func (cluster *LocalProcessCluster) StartKeyspaceLegacy(keyspace Keyspace, shard keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + _ = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) var mysqlctlProcessList []*exec.Cmd for _, shardName := range shardNames { shard := &Shard{ @@ -703,7 +699,7 @@ func (cluster *LocalProcessCluster) SetupCluster(keyspace *Keyspace, shards []Sh if !cluster.ReusingVTDATAROOT { // Create Keyspace - err = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) + err = cluster.VtctldClientProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) if err != nil { log.Error(err) return @@ -1294,14 +1290,32 @@ func (cluster *LocalProcessCluster) NewVttabletInstance(tabletType string, UID i // NewVTOrcProcess creates a new VTOrcProcess object func (cluster *LocalProcessCluster) NewVTOrcProcess(config VTOrcConfiguration) *VTOrcProcess { - base := VtctlProcessInstance(cluster.TopoProcess.Port, cluster.Hostname) - base.Binary = "vtorc" + base := VtProcessInstance("vtorc", "vtorc", cluster.TopoProcess.Port, cluster.Hostname) return &VTOrcProcess{ - VtctlProcess: *base, - LogDir: cluster.TmpDirectory, - Config: config, - Port: cluster.GetAndReservePort(), + VtProcess: base, + LogDir: cluster.TmpDirectory, + Config: config, + Port: cluster.GetAndReservePort(), + } +} + +// VtctldClientProcessInstance returns a VtctldProcess handle for a +// vtctldclient process configured with the given Config. +func (cluster *LocalProcessCluster) NewVtctldClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctldClientProcess { + version, err := GetMajorVersion("vtctldclient") + if err != nil { + log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %v", err) + } + + base := VtProcessInstance("vtctldclient", "vtctldclient", cluster.TopoProcess.Port, cluster.Hostname) + + vtctldclient := &VtctldClientProcess{ + VtProcess: base, + Server: fmt.Sprintf("%s:%d", hostname, grpcPort), + TempDirectory: tmpDirectory, + VtctldClientMajorVersion: version, } + return vtctldclient } // NewVTAdminProcess creates a new VTAdminProcess object diff --git a/go/test/endtoend/cluster/cluster_util.go b/go/test/endtoend/cluster/cluster_util.go index d449b4c64f7..18f78dcb3d0 100644 --- a/go/test/endtoend/cluster/cluster_util.go +++ b/go/test/endtoend/cluster/cluster_util.go @@ -299,22 +299,6 @@ func NewConnParams(port int, password, socketPath, keyspace string) mysql.ConnPa } -func filterDoubleDashArgs(args []string, version int) (filtered []string) { - if version > 13 { - return args - } - - for _, arg := range args { - if arg == "--" { - continue - } - - filtered = append(filtered, arg) - } - - return filtered -} - // WriteDbCredentialToTmp writes JSON formatted db credentials to the // specified tmp directory. func WriteDbCredentialToTmp(tmpDir string) string { diff --git a/go/test/endtoend/cluster/vt_process.go b/go/test/endtoend/cluster/vt_process.go new file mode 100644 index 00000000000..d1b7180b31d --- /dev/null +++ b/go/test/endtoend/cluster/vt_process.go @@ -0,0 +1,62 @@ +/* +Copyright 2025 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cluster + +import ( + "fmt" +) + +// VtProcess is a structure for holding generic vitess process info. +type VtProcess struct { + Name string + Binary string + LogDir string + TopoImplementation string + TopoGlobalAddress string + TopoGlobalRoot string + TopoServerAddress string + TopoRootPath string +} + +// VtProcessInstance returns a VtProcess handle configured with the given Config. +// The process must be manually started by calling setup() +func VtProcessInstance(name, binary string, topoPort int, hostname string) VtProcess { + // Default values for etcd2 topo server. + topoImplementation := "etcd2" + topoRootPath := "/" + + // Checking and resetting the parameters for required topo server. + switch *topoFlavor { + case "zk2": + topoImplementation = "zk2" + case "consul": + topoImplementation = "consul" + // For consul we do not need "/" in the path + topoRootPath = "" + } + + vt := VtProcess{ + Name: name, + Binary: binary, + TopoImplementation: topoImplementation, + TopoGlobalAddress: fmt.Sprintf("%s:%d", hostname, topoPort), + TopoGlobalRoot: TopoGlobalRoot(*topoFlavor), + TopoServerAddress: fmt.Sprintf("%s:%d", hostname, topoPort), + TopoRootPath: topoRootPath, + } + return vt +} diff --git a/go/test/endtoend/cluster/vtbackup_process.go b/go/test/endtoend/cluster/vtbackup_process.go index 57350922a21..ea12c8200d4 100644 --- a/go/test/endtoend/cluster/vtbackup_process.go +++ b/go/test/endtoend/cluster/vtbackup_process.go @@ -31,13 +31,14 @@ import ( // VtbackupProcess is a generic handle for a running Vtbackup. // It can be spawned manually type VtbackupProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess LogDir string MysqlPort int Directory string + BackupStorageImplementation string + FileBackupStorageRoot string + Cell string Keyspace string Shard string @@ -56,9 +57,9 @@ type VtbackupProcess struct { func (vtbackup *VtbackupProcess) Setup() (err error) { vtbackup.proc = exec.Command( vtbackup.Binary, - "--topo_implementation", vtbackup.CommonArg.TopoImplementation, - "--topo_global_server_address", vtbackup.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtbackup.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtbackup.TopoImplementation, + "--topo_global_server_address", vtbackup.TopoGlobalAddress, + "--topo_global_root", vtbackup.TopoGlobalRoot, "--log_dir", vtbackup.LogDir, //initDBfile is required to run vtbackup @@ -68,8 +69,8 @@ func (vtbackup *VtbackupProcess) Setup() (err error) { "--init_shard", vtbackup.Shard, //Backup Arguments are not optional - "--backup_storage_implementation", "file", - "--file_backup_storage_root", path.Join(os.Getenv("VTDATAROOT"), "tmp", "backupstorage"), + "--backup_storage_implementation", vtbackup.BackupStorageImplementation, + "--file_backup_storage_root", vtbackup.FileBackupStorageRoot, ) if vtbackup.initialBackup { @@ -129,20 +130,20 @@ func (vtbackup *VtbackupProcess) TearDown() error { // The process must be manually started by calling Setup() func VtbackupProcessInstance(tabletUID int, mysqlPort int, newInitDBFile string, keyspace string, shard string, cell string, hostname string, tmpDirectory string, topoPort int, initialBackup bool) *VtbackupProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtbackup", "vtbackup", topoPort, hostname) vtbackup := &VtbackupProcess{ - Name: "vtbackup", - Binary: "vtbackup", - CommonArg: *vtctl, - LogDir: tmpDirectory, - Directory: os.Getenv("VTDATAROOT"), - TabletAlias: fmt.Sprintf("%s-%010d", cell, tabletUID), - initDBfile: newInitDBFile, - Keyspace: keyspace, - Shard: shard, - Cell: cell, - MysqlPort: mysqlPort, - initialBackup: initialBackup, + VtProcess: base, + LogDir: tmpDirectory, + Directory: os.Getenv("VTDATAROOT"), + BackupStorageImplementation: "file", + FileBackupStorageRoot: path.Join(os.Getenv("VTDATAROOT"), "/backups"), + TabletAlias: fmt.Sprintf("%s-%010d", cell, tabletUID), + initDBfile: newInitDBFile, + Keyspace: keyspace, + Shard: shard, + Cell: cell, + MysqlPort: mysqlPort, + initialBackup: initialBackup, } return vtbackup } diff --git a/go/test/endtoend/cluster/vtctl_process.go b/go/test/endtoend/cluster/vtctl_process.go deleted file mode 100644 index 185c3079d34..00000000000 --- a/go/test/endtoend/cluster/vtctl_process.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package cluster - -import ( - "fmt" - "os/exec" - "strings" - - "vitess.io/vitess/go/vt/log" -) - -// VtctlProcess is a generic handle for a running vtctl command . -// It can be spawned manually -type VtctlProcess struct { - Name string - Binary string - LogDir string - TopoImplementation string - TopoGlobalAddress string - TopoGlobalRoot string - TopoServerAddress string - TopoRootPath string - VtctlMajorVersion int -} - -// AddCellInfo executes vtctl command to add cell info -func (vtctl *VtctlProcess) AddCellInfo(Cell string) (err error) { - tmpProcess := exec.Command( - vtctl.Binary, - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot, - ) - if *isCoverage { - tmpProcess.Args = append(tmpProcess.Args, "--test.coverprofile="+getCoveragePath("vtctl-addcell.out")) - } - tmpProcess.Args = append(tmpProcess.Args, - "AddCellInfo", "--", - "--root", vtctl.TopoRootPath+Cell, - "--server_address", vtctl.TopoServerAddress, - Cell) - tmpProcess.Args = filterDoubleDashArgs(tmpProcess.Args, vtctl.VtctlMajorVersion) - log.Infof("Adding CellInfo for cell %v with command: %v", Cell, strings.Join(tmpProcess.Args, " ")) - return tmpProcess.Run() -} - -// CreateKeyspace executes vtctl command to create keyspace -func (vtctl *VtctlProcess) CreateKeyspace(keyspace, sidecarDBName, durabilityPolicy string) error { - args := []string{ - "CreateKeyspace", keyspace, - "--sidecar-db-name", sidecarDBName, - } - if durabilityPolicy != "" { - args = append(args, "--durability-policy", durabilityPolicy) - } - output, err := vtctl.ExecuteCommandWithOutput(args...) - if err != nil { - log.Errorf("CreateKeyspace returned err: %s, output: %s", err, output) - } - return err -} - -// ExecuteCommandWithOutput executes any vtctlclient command and returns output -func (vtctl *VtctlProcess) ExecuteCommandWithOutput(args ...string) (result string, err error) { - args = append([]string{ - "--log_dir", vtctl.LogDir, - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot}, args...) - if *isCoverage { - args = append([]string{"--test.coverprofile=" + getCoveragePath("vtctl-o-"+args[0]+".out"), "--test.v"}, args...) - } - tmpProcess := exec.Command( - vtctl.Binary, - filterDoubleDashArgs(args, vtctl.VtctlMajorVersion)..., - ) - log.Info(fmt.Sprintf("Executing vtctlclient with arguments %v", strings.Join(tmpProcess.Args, " "))) - resultByte, err := tmpProcess.CombinedOutput() - return filterResultForWarning(filterResultWhenRunsForCoverage(string(resultByte))), err -} - -// ExecuteCommand executes any vtctlclient command -func (vtctl *VtctlProcess) ExecuteCommand(args ...string) (err error) { - args = append([]string{ - "--topo_implementation", vtctl.TopoImplementation, - "--topo_global_server_address", vtctl.TopoGlobalAddress, - "--topo_global_root", vtctl.TopoGlobalRoot}, args...) - if *isCoverage { - args = append([]string{"--test.coverprofile=" + getCoveragePath("vtctl-"+args[0]+".out"), "--test.v"}, args...) - } - tmpProcess := exec.Command( - vtctl.Binary, - filterDoubleDashArgs(args, vtctl.VtctlMajorVersion)..., - ) - log.Info(fmt.Sprintf("Executing vtctlclient with arguments %v", strings.Join(tmpProcess.Args, " "))) - return tmpProcess.Run() -} - -// VtctlProcessInstance returns a VtctlProcess handle for vtctl process -// configured with the given Config. -// The process must be manually started by calling setup() -func VtctlProcessInstance(topoPort int, hostname string) *VtctlProcess { - - // Default values for etcd2 topo server. - topoImplementation := "etcd2" - topoRootPath := "/" - - // Checking and resetting the parameters for required topo server. - switch *topoFlavor { - case "zk2": - topoImplementation = "zk2" - case "consul": - topoImplementation = "consul" - // For consul we do not need "/" in the path - topoRootPath = "" - } - - version, err := GetMajorVersion("vtctl") - if err != nil { - log.Warningf("failed to get major vtctl version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctl := &VtctlProcess{ - Name: "vtctl", - Binary: "vtctl", - TopoImplementation: topoImplementation, - TopoGlobalAddress: fmt.Sprintf("%s:%d", hostname, topoPort), - TopoGlobalRoot: TopoGlobalRoot(*topoFlavor), - TopoServerAddress: fmt.Sprintf("%s:%d", hostname, topoPort), - TopoRootPath: topoRootPath, - VtctlMajorVersion: version, - } - return vtctl -} diff --git a/go/test/endtoend/cluster/vtctlclient_process.go b/go/test/endtoend/cluster/vtctlclient_process.go deleted file mode 100644 index 0c5fb1bc8c2..00000000000 --- a/go/test/endtoend/cluster/vtctlclient_process.go +++ /dev/null @@ -1,266 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package cluster - -import ( - "fmt" - "os/exec" - "strings" - "time" - - "vitess.io/vitess/go/vt/vterrors" - - "vitess.io/vitess/go/vt/log" -) - -// VtctlClientProcess is a generic handle for a running vtctlclient command . -// It can be spawned manually -type VtctlClientProcess struct { - Name string - Binary string - Server string - TempDirectory string - ZoneName string - VtctlClientMajorVersion int -} - -// VtctlClientParams encapsulated params to provide if non-default -type VtctlClientParams struct { - DDLStrategy string - MigrationContext string - UUIDList string - CallerID string - BatchSize int -} - -// InitShardPrimary executes vtctlclient command to make specified tablet the primary for the shard. -func (vtctlclient *VtctlClientProcess) InitShardPrimary(Keyspace string, Shard string, Cell string, TabletUID int) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput( - "InitShardPrimary", "--", - "--force", "--wait_replicas_timeout", "31s", - fmt.Sprintf("%s/%s", Keyspace, Shard), - fmt.Sprintf("%s-%d", Cell, TabletUID)) - if err != nil { - log.Errorf("error in InitShardPrimary output %s, err %s", output, err.Error()) - } - return err -} - -// InitializeShard executes vtctlclient command to make specified tablet the primary for the shard. -func (vtctlclient *VtctlClientProcess) InitializeShard(Keyspace string, Shard string, Cell string, TabletUID int) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput( - "PlannedReparentShard", "--", - "--keyspace_shard", fmt.Sprintf("%s/%s", Keyspace, Shard), - "--wait_replicas_timeout", "31s", - "--new_primary", fmt.Sprintf("%s-%d", Cell, TabletUID)) - if err != nil { - log.Errorf("error in PlannedReparentShard output %s, err %s", output, err.Error()) - } - return err -} - -// ApplySchemaWithOutput applies SQL schema to the keyspace -func (vtctlclient *VtctlClientProcess) ApplySchemaWithOutput(Keyspace string, SQL string, params VtctlClientParams) (result string, err error) { - args := []string{ - "ApplySchema", "--", - "--sql", SQL, - } - if params.MigrationContext != "" { - args = append(args, "--migration_context", params.MigrationContext) - } - if params.DDLStrategy != "" { - args = append(args, "--ddl_strategy", params.DDLStrategy) - } - if params.UUIDList != "" { - args = append(args, "--uuid_list", params.UUIDList) - } - if params.BatchSize > 0 { - args = append(args, "--batch_size", fmt.Sprintf("%d", params.BatchSize)) - } - if params.CallerID != "" { - args = append(args, "--caller_id", params.CallerID) - } - args = append(args, Keyspace) - return vtctlclient.ExecuteCommandWithOutput(args...) -} - -// ApplySchema applies SQL schema to the keyspace -func (vtctlclient *VtctlClientProcess) ApplySchema(Keyspace string, SQL string) error { - message, err := vtctlclient.ApplySchemaWithOutput(Keyspace, SQL, VtctlClientParams{DDLStrategy: "direct -allow-zero-in-date"}) - - return vterrors.Wrap(err, message) -} - -// ApplyVSchema applies vitess schema (JSON format) to the keyspace -func (vtctlclient *VtctlClientProcess) ApplyVSchema(Keyspace string, JSON string) (err error) { - return vtctlclient.ExecuteCommand( - "ApplyVSchema", "--", - "--vschema", JSON, - Keyspace, - ) -} - -// ApplyRoutingRules does it -func (vtctlclient *VtctlClientProcess) ApplyRoutingRules(JSON string) (err error) { - return vtctlclient.ExecuteCommand("ApplyRoutingRules", "--", "--rules", JSON) -} - -// ApplyRoutingRules does it -func (vtctlclient *VtctlClientProcess) ApplyShardRoutingRules(JSON string) (err error) { - return vtctlclient.ExecuteCommand("ApplyShardRoutingRules", "--", "--rules", JSON) -} - -// OnlineDDLShowRecent responds with recent schema migration list -func (vtctlclient *VtctlClientProcess) OnlineDDLShowRecent(Keyspace string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "show", - "recent", - ) -} - -// OnlineDDLCancelMigration cancels a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLCancelMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "cancel", - uuid, - ) -} - -// OnlineDDLCancelAllMigrations cancels all migrations for a keyspace -func (vtctlclient *VtctlClientProcess) OnlineDDLCancelAllMigrations(Keyspace string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "cancel-all", - ) -} - -// OnlineDDLRetryMigration retries a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLRetryMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "retry", - uuid, - ) -} - -// OnlineDDLRevertMigration reverts a given migration uuid -func (vtctlclient *VtctlClientProcess) OnlineDDLRevertMigration(Keyspace, uuid string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "OnlineDDL", - Keyspace, - "revert", - uuid, - ) -} - -// VExec runs a VExec query -func (vtctlclient *VtctlClientProcess) VExec(Keyspace, workflow, query string) (result string, err error) { - return vtctlclient.ExecuteCommandWithOutput( - "VExec", - fmt.Sprintf("%s.%s", Keyspace, workflow), - query, - ) -} - -// ExecuteCommand executes any vtctlclient command -func (vtctlclient *VtctlClientProcess) ExecuteCommand(args ...string) (err error) { - output, err := vtctlclient.ExecuteCommandWithOutput(args...) - if output != "" { - if err != nil { - log.Errorf("Output:\n%v", output) - } - } - return err -} - -// ExecuteCommandWithOutput executes any vtctlclient command and returns output -func (vtctlclient *VtctlClientProcess) ExecuteCommandWithOutput(args ...string) (string, error) { - var resultByte []byte - var resultStr string - var err error - retries := 10 - retryDelay := 1 * time.Second - pArgs := []string{"--server", vtctlclient.Server} - if *isCoverage { - pArgs = append(pArgs, "--test.coverprofile="+getCoveragePath("vtctlclient-"+args[0]+".out"), "--test.v") - } - pArgs = append(pArgs, args...) - for i := 1; i <= retries; i++ { - tmpProcess := exec.Command( - vtctlclient.Binary, - filterDoubleDashArgs(pArgs, vtctlclient.VtctlClientMajorVersion)..., - ) - log.Infof("Executing vtctlclient with command: %v (attempt %d of %d)", strings.Join(tmpProcess.Args, " "), i, retries) - resultByte, err = tmpProcess.CombinedOutput() - resultStr = string(resultByte) - if err == nil || !shouldRetry(resultStr) { - break - } - time.Sleep(retryDelay) - } - return filterResultForWarning(filterResultWhenRunsForCoverage(resultStr)), err -} - -// VtctlClientProcessInstance returns a VtctlProcess handle for vtctlclient process -// configured with the given Config. -func VtctlClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctlClientProcess { - version, err := GetMajorVersion("vtctl") // `vtctlclient` does not have a --version flag, so we assume both vtctl/vtctlclient have the same version - if err != nil { - log.Warningf("failed to get major vtctlclient version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctlclient := &VtctlClientProcess{ - Name: "vtctlclient", - Binary: "vtctlclient", - Server: fmt.Sprintf("%s:%d", hostname, grpcPort), - TempDirectory: tmpDirectory, - VtctlClientMajorVersion: version, - } - return vtctlclient -} - -// InitTablet initializes a tablet -func (vtctlclient *VtctlClientProcess) InitTablet(tablet *Vttablet, cell string, keyspaceName string, hostname string, shardName string) error { - tabletType := "replica" - if tablet.Type == "rdonly" { - tabletType = "rdonly" - } - args := []string{"InitTablet", "--", "--hostname", hostname, - "--port", fmt.Sprintf("%d", tablet.HTTPPort), "--allow_update", "--parent", - "--keyspace", keyspaceName, - "--shard", shardName} - if tablet.MySQLPort > 0 { - args = append(args, "--mysql_port", fmt.Sprintf("%d", tablet.MySQLPort)) - } - if tablet.GrpcPort > 0 { - args = append(args, "--grpc_port", fmt.Sprintf("%d", tablet.GrpcPort)) - } - args = append(args, fmt.Sprintf("%s-%010d", cell, tablet.TabletUID), tabletType) - return vtctlclient.ExecuteCommand(args...) -} - -// shouldRetry tells us if the command should be retried based on the results/output -- meaning that it -// is likely an ephemeral or recoverable issue that is likely to succeed when retried. -func shouldRetry(cmdResults string) bool { - return strings.Contains(cmdResults, "Deadlock found when trying to get lock; try restarting transaction") -} diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index 6ac6ed5d2b0..831f5a23af7 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -32,9 +32,7 @@ import ( // VtctldProcess is a generic handle for a running vtctld . // It can be spawned manually type VtctldProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess ServiceMap string BackupStorageImplementation string FileBackupStorageRoot string @@ -55,9 +53,9 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) _ = createDirectory(path.Join(vtctld.Directory, "backups"), 0700) vtctld.proc = exec.Command( vtctld.Binary, - "--topo_implementation", vtctld.CommonArg.TopoImplementation, - "--topo_global_server_address", vtctld.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtctld.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtctld.TopoImplementation, + "--topo_global_server_address", vtctld.TopoGlobalAddress, + "--topo_global_root", vtctld.TopoGlobalRoot, "--cell", cell, "--service_map", vtctld.ServiceMap, "--backup_storage_implementation", vtctld.BackupStorageImplementation, @@ -164,15 +162,13 @@ func (vtctld *VtctldProcess) TearDown() error { } } -// VtctldProcessInstance returns a VtctlProcess handle for vtctl process +// VtctldProcessInstance returns a VtctldProcess handle // configured with the given Config. // The process must be manually started by calling setup() func VtctldProcessInstance(httpPort int, grpcPort int, topoPort int, hostname string, tmpDirectory string) *VtctldProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtctld", "vtctld", topoPort, hostname) vtctld := &VtctldProcess{ - Name: "vtctld", - Binary: "vtctld", - CommonArg: *vtctl, + VtProcess: base, ServiceMap: "grpc-vtctl,grpc-vtctld", BackupStorageImplementation: "file", FileBackupStorageRoot: path.Join(os.Getenv("VTDATAROOT"), "/backups"), diff --git a/go/test/endtoend/cluster/vtctldclient_process.go b/go/test/endtoend/cluster/vtctldclient_process.go index 8b401f59070..3dc1a811930 100644 --- a/go/test/endtoend/cluster/vtctldclient_process.go +++ b/go/test/endtoend/cluster/vtctldclient_process.go @@ -19,6 +19,7 @@ package cluster import ( "fmt" "os/exec" + "slices" "strings" "time" @@ -35,8 +36,7 @@ import ( // VtctldClientProcess is a generic handle for a running vtctldclient command . // It can be spawned manually type VtctldClientProcess struct { - Name string - Binary string + VtProcess Server string TempDirectory string ZoneName string @@ -44,6 +44,25 @@ type VtctldClientProcess struct { Quiet bool } +// VtctldClientProcessInstance returns a VtctldClientProcess handle +// configured with the given Config. +// The process must be manually started by calling setup() +func VtctldClientProcessInstance(grpcPort int, topoPort int, hostname string, tmpDirectory string) *VtctldClientProcess { + version, err := GetMajorVersion("vtctld") // `vtctldclient` does not have a --version flag, so we assume both vtctl/vtctldclient have the same version + if err != nil { + log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %s", err) + } + + base := VtProcessInstance("vtctldclient", "vtctldclient", topoPort, hostname) + vtctldclient := &VtctldClientProcess{ + VtProcess: base, + Server: fmt.Sprintf("%s:%d", hostname, grpcPort), + TempDirectory: tmpDirectory, + VtctldClientMajorVersion: version, + } + return vtctldclient +} + // ExecuteCommand executes any vtctldclient command func (vtctldclient *VtctldClientProcess) ExecuteCommand(args ...string) (err error) { output, err := vtctldclient.ExecuteCommandWithOutput(args...) @@ -55,14 +74,24 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommand(args ...string) (err err return err } -// ExecuteCommandWithOutput executes any vtctldclient command and returns output +// ExecuteCommandWithOutput executes any vtctldclient command and returns output. func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string) (string, error) { var resultByte []byte var resultStr string var err error retries := 10 retryDelay := 1 * time.Second - pArgs := []string{"--server", vtctldclient.Server} + pArgs := []string{ + // These are needed to support --server=internal and are otherwise + // ignored/unused. + "--topo-implementation", vtctldclient.TopoImplementation, + "--topo-global-server-address", vtctldclient.TopoGlobalAddress, + "--topo-global-root", vtctldclient.TopoGlobalRoot, + } + if !slices.Contains(args, "--server") { + // Only add the default server if one was not already specified. + pArgs = append(pArgs, "--server", vtctldclient.Server) + } if *isCoverage { pArgs = append(pArgs, "--test.coverprofile="+getCoveragePath("vtctldclient-"+args[0]+".out"), "--test.v") } @@ -70,7 +99,7 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string for i := range retries { tmpProcess := exec.Command( vtctldclient.Binary, - filterDoubleDashArgs(pArgs, vtctldclient.VtctldClientMajorVersion)..., + pArgs..., ) msg := binlogplayer.LimitString(strings.Join(tmpProcess.Args, " "), 256) // limit log line length if !vtctldclient.Quiet { @@ -86,22 +115,19 @@ func (vtctldclient *VtctldClientProcess) ExecuteCommandWithOutput(args ...string return filterResultWhenRunsForCoverage(resultStr), err } -// VtctldClientProcessInstance returns a VtctldProcess handle for vtctldclient process -// configured with the given Config. -func VtctldClientProcessInstance(hostname string, grpcPort int, tmpDirectory string) *VtctldClientProcess { - version, err := GetMajorVersion("vtctld") // `vtctldclient` does not have a --version flag, so we assume both vtctl/vtctldclient have the same version - if err != nil { - log.Warningf("failed to get major vtctldclient version; interop with CLI changes for VEP-4 may not work: %s", err) - } - - vtctldclient := &VtctldClientProcess{ - Name: "vtctldclient", - Binary: "vtctldclient", - Server: fmt.Sprintf("%s:%d", hostname, grpcPort), - TempDirectory: tmpDirectory, - VtctldClientMajorVersion: version, +// AddCellInfo executes the vtctldclient command to add cell info. +// It uses --server=internal as there may not yet be a vtctld running +// as we need to create a cell for vtctld to use first. +func (vtctldclient *VtctldClientProcess) AddCellInfo(Cell string) error { + args := []string{ + "--server", "internal", + "AddCellInfo", + "--root", vtctldclient.TopoRootPath + Cell, + "--server-address", vtctldclient.TopoServerAddress, + Cell, } - return vtctldclient + _, err := vtctldclient.ExecuteCommandWithOutput(args...) + return err } // ApplyRoutingRules applies the given routing rules. @@ -233,16 +259,17 @@ func (vtctldclient *VtctldClientProcess) InitShardPrimary(keyspace string, shard return err } -// CreateKeyspace executes the vtctl command to create a keyspace -func (vtctldclient *VtctldClientProcess) CreateKeyspace(keyspaceName string, sidecarDBName string) (err error) { +// CreateKeyspace executes the vtctldclient command to create a keyspace +func (vtctldclient *VtctldClientProcess) CreateKeyspace(keyspaceName string, sidecarDBName string, durabilityPolicy string) (err error) { var output string - // For upgrade/downgrade tests where an older version is also used. - if vtctldclient.VtctldClientMajorVersion < 17 { - log.Errorf("CreateKeyspace does not support the --sidecar-db-name flag in vtctl version %d; ignoring...", vtctldclient.VtctldClientMajorVersion) - output, err = vtctldclient.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName) - } else { - output, err = vtctldclient.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--sidecar-db-name", sidecarDBName) + args := []string{ + "CreateKeyspace", keyspaceName, + "--sidecar-db-name", sidecarDBName, + } + if durabilityPolicy != "" { + args = append(args, "--durability-policy", durabilityPolicy) } + output, err = vtctldclient.ExecuteCommandWithOutput(args...) if err != nil { log.Errorf("CreateKeyspace returned err: %s, output: %s", err, output) } @@ -314,3 +341,10 @@ func (vtctldclient *VtctldClientProcess) OnlineDDLShow(keyspace, workflow string workflow, ) } + +// shouldRetry tells us if the command should be retried based on the results/output +// -- meaning that it is likely an ephemeral or recoverable issue that is likely to +// succeed when retried. +func shouldRetry(cmdResults string) bool { + return strings.Contains(cmdResults, "Deadlock found when trying to get lock; try restarting transaction") +} diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index 2adbdf13250..53b8b6152e8 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -40,9 +40,7 @@ import ( // VtgateProcess is a generic handle for a running vtgate . // It can be spawned manually type VtgateProcess struct { - Name string - Binary string - CommonArg VtctlProcess + VtProcess LogDir string ErrorLog string FileToLogQueries string @@ -149,9 +147,9 @@ const defaultVtGatePlannerVersion = planbuilder.Gen4 // Setup starts Vtgate process with required arguements func (vtgate *VtgateProcess) Setup() (err error) { args := []string{ - "--topo_implementation", vtgate.CommonArg.TopoImplementation, - "--topo_global_server_address", vtgate.CommonArg.TopoGlobalAddress, - "--topo_global_root", vtgate.CommonArg.TopoGlobalRoot, + "--topo_implementation", vtgate.TopoImplementation, + "--topo_global_server_address", vtgate.TopoGlobalAddress, + "--topo_global_root", vtgate.TopoGlobalRoot, "--config-file", vtgate.ConfigFile, "--log_dir", vtgate.LogDir, "--log_queries_to_file", vtgate.FileToLogQueries, @@ -374,10 +372,9 @@ func VtgateProcessInstance( extraArgs []string, plannerVersion plancontext.PlannerVersion, ) *VtgateProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vtgate", "vtgate", topoPort, hostname) vtgate := &VtgateProcess{ - Name: "vtgate", - Binary: "vtgate", + VtProcess: base, FileToLogQueries: path.Join(tmpDirectory, "/vtgate_querylog.txt"), ConfigFile: path.Join(tmpDirectory, fmt.Sprintf("vtgate-config-%d.json", port)), Directory: os.Getenv("VTDATAROOT"), @@ -390,7 +387,6 @@ func VtgateProcessInstance( Cell: cell, CellsToWatch: cellsToWatch, TabletTypesToWait: tabletTypesToWait, - CommonArg: *vtctl, MySQLAuthServerImpl: "none", ExtraArgs: extraArgs, PlannerVersion: plannerVersion, diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index af101a8bebd..4d726241756 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -36,7 +36,7 @@ import ( // VTOrcProcess is a test struct for running // vtorc as a separate process for testing type VTOrcProcess struct { - VtctlProcess + VtProcess Port int LogDir string LogFileName string @@ -83,7 +83,6 @@ func (orc *VTOrcProcess) RewriteConfiguration() error { // Setup starts orc process with required arguements func (orc *VTOrcProcess) Setup() (err error) { - // create the configuration file timeNow := time.Now().UnixNano() err = os.MkdirAll(orc.LogDir, 0755) diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 6bc6e6b8d7f..65c6fbeec26 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -47,8 +47,7 @@ const vttabletStateTimeout = 60 * time.Second // VttabletProcess is a generic handle for a running vttablet . // It can be spawned manually type VttabletProcess struct { - Name string - Binary string + VtProcess FileToLogQueries string TabletUID int TabletPath string @@ -56,7 +55,6 @@ type VttabletProcess struct { Port int GrpcPort int Shard string - CommonArg VtctlProcess LogDir string ErrorLog string TabletHostname string @@ -93,9 +91,9 @@ type VttabletProcess struct { func (vttablet *VttabletProcess) Setup() (err error) { vttablet.proc = exec.Command( vttablet.Binary, - "--topo_implementation", vttablet.CommonArg.TopoImplementation, - "--topo_global_server_address", vttablet.CommonArg.TopoGlobalAddress, - "--topo_global_root", vttablet.CommonArg.TopoGlobalRoot, + "--topo_implementation", vttablet.TopoImplementation, + "--topo_global_server_address", vttablet.TopoGlobalAddress, + "--topo_global_root", vttablet.TopoGlobalRoot, "--log_queries_to_file", vttablet.FileToLogQueries, "--tablet-path", vttablet.TabletPath, "--port", fmt.Sprintf("%d", vttablet.Port), @@ -717,10 +715,9 @@ func (vttablet *VttabletProcess) IsShutdown() bool { // configured with the given Config. // The process must be manually started by calling setup() func VttabletProcessInstance(port, grpcPort, tabletUID int, cell, shard, keyspace string, vtctldPort int, tabletType string, topoPort int, hostname, tmpDirectory string, extraArgs []string, charset string) *VttabletProcess { - vtctl := VtctlProcessInstance(topoPort, hostname) + base := VtProcessInstance("vttablet", "vttablet", topoPort, hostname) vttablet := &VttabletProcess{ - Name: "vttablet", - Binary: "vttablet", + VtProcess: base, FileToLogQueries: path.Join(tmpDirectory, fmt.Sprintf("/vt_%010d_querylog.txt", tabletUID)), Directory: path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/vt_%010d", tabletUID)), Cell: cell, @@ -731,7 +728,6 @@ func VttabletProcessInstance(port, grpcPort, tabletUID int, cell, shard, keyspac TabletHostname: hostname, Keyspace: keyspace, TabletType: "replica", - CommonArg: *vtctl, HealthCheckInterval: 5, Port: port, GrpcPort: grpcPort, diff --git a/go/test/endtoend/docker/vttestserver_test.go b/go/test/endtoend/docker/vttestserver_test.go index e34be52accf..4cbe5cdf0fc 100644 --- a/go/test/endtoend/docker/vttestserver_test.go +++ b/go/test/endtoend/docker/vttestserver_test.go @@ -140,8 +140,8 @@ func TestVtctldCommands(t *testing.T) { err = vtest.waitUntilDockerHealthy(10) require.NoError(t, err) - vtctldClient := cluster.VtctldClientProcessInstance("localhost", vtest.basePort+1, os.TempDir()) - res, err := vtctldClient.ExecuteCommandWithOutput("GetKeyspaces") + vtctldClient := cluster.VtctldClientProcessInstance(vtest.basePort+1, 0, "localhost", os.TempDir()) + res, err := vtctldClient.ExecuteCommandWithOutput("--server", "internal", "GetKeyspaces") require.NoError(t, err) // We verify that the command succeeds, and the keyspace name is present in the output. require.Contains(t, res, "long_ks_name") diff --git a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go index 460ae310d7f..0d47f8fad4d 100644 --- a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go +++ b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go @@ -130,7 +130,7 @@ func initializeCluster(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go index 86c847125a7..95411536905 100644 --- a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go +++ b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go @@ -138,33 +138,30 @@ func TestSecureTransport(t *testing.T) { require.NoError(t, err) } - // setup replication - var vtctlClientArgs []string + // Shared flags. + vtctldClientArgs := []string{"--server", "internal"} + vtctldClientArgs = append(vtctldClientArgs, tmclientExtraArgs("vttablet-client-1")...) - vtctlClientTmArgs := append(vtctlClientArgs, tmclientExtraArgs("vttablet-client-1")...) - - // Reparenting - vtctlClientArgs = append(vtctlClientTmArgs, "InitShardPrimary", "--", "--force", "test_keyspace/0", primaryTablet.Alias) - err = clusterInstance.VtctlProcess.ExecuteCommand(vtctlClientArgs...) + // Reparenting. + vtctlInitArgs := append(vtctldClientArgs, "InitShardPrimary", "--force", "test_keyspace/0", primaryTablet.Alias) + err = clusterInstance.VtctldClientProcess.ExecuteCommand(vtctlInitArgs...) require.NoError(t, err) err = clusterInstance.StartVTOrc("test_keyspace") require.NoError(t, err) - // Apply schema - var vtctlApplySchemaArgs = append(vtctlClientTmArgs, "ApplySchema", "--", "--sql", createVtInsertTest, "test_keyspace") - err = clusterInstance.VtctlProcess.ExecuteCommand(vtctlApplySchemaArgs...) + // Apply schema. + var vtctlApplySchemaArgs = append(vtctldClientArgs, "ApplySchema", "--sql", createVtInsertTest, "test_keyspace") + err = clusterInstance.VtctldClientProcess.ExecuteCommand(vtctlApplySchemaArgs...) require.NoError(t, err) for _, tablet := range []cluster.Vttablet{primaryTablet, replicaTablet} { - var vtctlTabletArgs []string - vtctlTabletArgs = append(vtctlTabletArgs, tmclientExtraArgs("vttablet-client-1")...) - vtctlTabletArgs = append(vtctlTabletArgs, "RunHealthCheck", tablet.Alias) - _, err = clusterInstance.VtctlProcess.ExecuteCommandWithOutput(vtctlTabletArgs...) + vtctlTabletArgs := append(vtctldClientArgs, "RunHealthCheck", tablet.Alias) + _, err = clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(vtctlTabletArgs...) require.NoError(t, err) } - // start vtgate + // Start vtgate. clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, tabletConnExtraArgs("vttablet-client-1")...) clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, serverExtraArguments("vtgate-server-instance", "vtgate-client")...) err = clusterInstance.StartVtgate() @@ -349,7 +346,7 @@ func clusterSetUp(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/keyspace/keyspace_test.go b/go/test/endtoend/keyspace/keyspace_test.go index e8a11ceed07..dbabfc82d16 100644 --- a/go/test/endtoend/keyspace/keyspace_test.go +++ b/go/test/endtoend/keyspace/keyspace_test.go @@ -97,7 +97,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterForKSTest.VtctlProcess.AddCellInfo(cell2); err != nil { + if err := clusterForKSTest.VtctldClientProcess.AddCellInfo(cell2); err != nil { return 1 } @@ -139,7 +139,7 @@ func TestMain(m *testing.M) { // TestDurabilityPolicyField tests that the DurabilityPolicy field of a keyspace can be set during creation, read and updated later // from vtctld server and the vtctl binary func TestDurabilityPolicyField(t *testing.T) { - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterForKSTest.VtctldProcess.GrpcPort, clusterForKSTest.TmpDirectory) + vtctldClientProcess := clusterForKSTest.NewVtctldClientProcessInstance("localhost", clusterForKSTest.VtctldProcess.GrpcPort, clusterForKSTest.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", "ks_durability", "--durability-policy=semi_sync") require.NoError(t, err, out) @@ -218,7 +218,7 @@ func TestGetKeyspace(t *testing.T) { } func TestDeleteKeyspace(t *testing.T) { - _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName) + _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName, "") _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace/0") _ = clusterForKSTest.InitTablet(&cluster.Vttablet{ Type: "primary", @@ -240,7 +240,7 @@ func TestDeleteKeyspace(t *testing.T) { _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("DeleteKeyspace", "test_delete_keyspace") // Start over and this time use recursive DeleteKeyspace to do everything. - _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName) + _ = clusterForKSTest.VtctldClientProcess.CreateKeyspace("test_delete_keyspace", sidecar.DefaultName, "") _ = clusterForKSTest.VtctldClientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace/0") _ = clusterForKSTest.InitTablet(&cluster.Vttablet{ Type: "primary", diff --git a/go/test/endtoend/messaging/message_test.go b/go/test/endtoend/messaging/message_test.go index e91a8dcc335..7dbef603417 100644 --- a/go/test/endtoend/messaging/message_test.go +++ b/go/test/endtoend/messaging/message_test.go @@ -84,7 +84,7 @@ func TestMessage(t *testing.T) { utils.Exec(t, conn, fmt.Sprintf("use %s", lookupKeyspace)) utils.Exec(t, conn, createMessage) - clusterInstance.VtctlProcess.ExecuteCommand(fmt.Sprintf("ReloadSchemaKeyspace %s", lookupKeyspace)) + clusterInstance.VtctldClientProcess.ExecuteCommand(fmt.Sprintf("ReloadSchemaKeyspace %s", lookupKeyspace)) defer utils.Exec(t, conn, "drop table vitess_message") diff --git a/go/test/endtoend/mysqlctl/mysqlctl_test.go b/go/test/endtoend/mysqlctl/mysqlctl_test.go index 070114da420..f5f08bf98e9 100644 --- a/go/test/endtoend/mysqlctl/mysqlctl_test.go +++ b/go/test/endtoend/mysqlctl/mysqlctl_test.go @@ -52,7 +52,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/mysqlctld/mysqlctld_test.go b/go/test/endtoend/mysqlctld/mysqlctld_test.go index 432beb0c6d5..3d4b8e70a76 100644 --- a/go/test/endtoend/mysqlctld/mysqlctld_test.go +++ b/go/test/endtoend/mysqlctld/mysqlctld_test.go @@ -56,7 +56,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/recovery/recovery_util.go b/go/test/endtoend/recovery/recovery_util.go index cffae6a5005..f862b30a9b3 100644 --- a/go/test/endtoend/recovery/recovery_util.go +++ b/go/test/endtoend/recovery/recovery_util.go @@ -55,16 +55,16 @@ func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tabl tablet.ValidateTabletRestart(t) replicaTabletArgs := commonTabletArg - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("GetKeyspace", restoreKSName) + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput("GetKeyspace", restoreKSName) if restoreTime.IsZero() { restoreTime = time.Now().UTC() } if err != nil { - _, err := localCluster.VtctlProcess.ExecuteCommandWithOutput("CreateKeyspace", "--", - "--keyspace_type=SNAPSHOT", "--base_keyspace="+keyspaceName, - "--snapshot_time", restoreTime.Format(time.RFC3339), restoreKSName) + _, err := localCluster.VtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", restoreKSName, + "--type=SNAPSHOT", "--base-keyspace="+keyspaceName, + "--snapshot-timestamp", restoreTime.Format(time.RFC3339)) require.Nil(t, err) } diff --git a/go/test/endtoend/recovery/unshardedrecovery/recovery.go b/go/test/endtoend/recovery/unshardedrecovery/recovery.go index ae6b152271b..0d3c38a50f7 100644 --- a/go/test/endtoend/recovery/unshardedrecovery/recovery.go +++ b/go/test/endtoend/recovery/unshardedrecovery/recovery.go @@ -158,7 +158,7 @@ func TestMainImpl(m *testing.M) { } } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", localCluster.VtctldProcess.GrpcPort, localCluster.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(localCluster.VtctldProcess.GrpcPort, localCluster.TopoPort, "localhost", localCluster.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/reparent/emergencyreparent/ers_test.go b/go/test/endtoend/reparent/emergencyreparent/ers_test.go index 37855a47df6..f2febf9e27f 100644 --- a/go/test/endtoend/reparent/emergencyreparent/ers_test.go +++ b/go/test/endtoend/reparent/emergencyreparent/ers_test.go @@ -48,8 +48,8 @@ func TestTrivialERS(t *testing.T) { } // We should do the same for vtctl binary for i := 1; i <= 4; i++ { - out, err := utils.ErsWithVtctl(clusterInstance) - log.Infof("ERS-vtctl loop %d. EmergencyReparentShard Output: %v", i, out) + out, err := utils.ErsWithVtctldClient(clusterInstance) + log.Infof("ERS-vtctldclient loop %d. EmergencyReparentShard Output: %v", i, out) require.NoError(t, err) time.Sleep(5 * time.Second) } @@ -396,7 +396,7 @@ func TestERSForInitialization(t *testing.T) { err = clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) require.NoError(t, err) if clusterInstance.VtctlMajorVersion >= 14 { - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspace.Name, "--durability-policy=semi_sync") require.NoError(t, err, out) } diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 5fa06c9be4c..521e17606ce 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -155,7 +155,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s require.NoError(t, err, "Error managing topo") numCell := 1 for numCell < len(cells) { - err = clusterInstance.VtctlProcess.AddCellInfo(cells[numCell]) + err = clusterInstance.VtctldClientProcess.AddCellInfo(cells[numCell]) require.NoError(t, err, "Error managing topo") numCell++ } @@ -209,7 +209,7 @@ func setupCluster(ctx context.Context, t *testing.T, shardName string, cells []s } } if clusterInstance.VtctlMajorVersion >= 14 { - clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", KeyspaceName, fmt.Sprintf("--durability-policy=%s", durability)) require.NoError(t, err, out) } @@ -407,10 +407,10 @@ func ErsIgnoreTablet(clusterInstance *cluster.LocalProcessCluster, tab *cluster. return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) } -// ErsWithVtctl runs ERS via vtctl binary -func ErsWithVtctl(clusterInstance *cluster.LocalProcessCluster) (string, error) { - args := []string{"EmergencyReparentShard", "--", "--keyspace_shard", fmt.Sprintf("%s/%s", KeyspaceName, ShardName)} - return clusterInstance.VtctlProcess.ExecuteCommandWithOutput(args...) +// ErsWithVtctldClient runs ERS via a vtctldclient binary. +func ErsWithVtctldClient(clusterInstance *cluster.LocalProcessCluster) (string, error) { + args := []string{"EmergencyReparentShard", fmt.Sprintf("%s/%s", KeyspaceName, ShardName)} + return clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) } // endregion diff --git a/go/test/endtoend/sharded/sharded_keyspace_test.go b/go/test/endtoend/sharded/sharded_keyspace_test.go index ba7884de40f..1170609f62e 100644 --- a/go/test/endtoend/sharded/sharded_keyspace_test.go +++ b/go/test/endtoend/sharded/sharded_keyspace_test.go @@ -83,7 +83,7 @@ func TestMain(m *testing.M) { if err := clusterInstance.StartTopo(); err != nil { return 1, err } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { + if err := clusterInstance.VtctldClientProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1, err } @@ -147,10 +147,10 @@ func TestShardedKeyspace(t *testing.T) { require.Nil(t, err) assert.Equal(t, `[[INT64(1) VARCHAR("test 1")]]`, fmt.Sprintf("%v", rows.Rows)) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidateSchemaShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("ValidateSchemaKeyspace", keyspaceName) @@ -166,9 +166,9 @@ func TestShardedKeyspace(t *testing.T) { require.Nil(t, err) err = clusterInstance.VtctldClientProcess.ExecuteCommand("GetPermissions", shard1.Vttablets[1].Alias) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidatePermissionsShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidatePermissionsShard", fmt.Sprintf("%s/%s", keyspaceName, shard1.Name)) require.Nil(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ValidatePermissionsKeyspace", keyspaceName) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("ValidatePermissionsKeyspace", keyspaceName) require.Nil(t, err) rows, err = shard1Primary.VttabletProcess.QueryTablet("select id, msg from vt_select_test order by id", keyspaceName, true) diff --git a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go index e692bf94de4..c393e7c4646 100644 --- a/go/test/endtoend/tabletmanager/custom_rule_topo_test.go +++ b/go/test/endtoend/tabletmanager/custom_rule_topo_test.go @@ -54,7 +54,7 @@ func TestTopoCustomRule(t *testing.T) { require.NoError(t, err) // Copy config file into topo. - err = clusterInstance.VtctlclientProcess.ExecuteCommand("TopoCp", "--", "--to_topo", topoCustomRuleFile, topoCustomRulePath) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("--server", "internal", "WriteTopologyPath", topoCustomRuleFile, topoCustomRulePath) require.Nil(t, err, "error should be Nil") // Set extra tablet args for topo custom rule @@ -100,7 +100,7 @@ func TestTopoCustomRule(t *testing.T) { err = os.WriteFile(topoCustomRuleFile, data, 0777) require.NoError(t, err) - err = clusterInstance.VtctlclientProcess.ExecuteCommand("TopoCp", "--", "--to_topo", topoCustomRuleFile, topoCustomRulePath) + err = clusterInstance.VtctldClientProcess.ExecuteCommand("--server", "internal", "WriteTopologyPath", topoCustomRuleFile, topoCustomRulePath) require.Nil(t, err, "error should be Nil") // And wait until the query fails with the right error. diff --git a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go index 226238a46c6..48b341bf449 100644 --- a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go +++ b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go @@ -154,7 +154,7 @@ func TestMain(m *testing.M) { Host: clusterInstance.Hostname, Port: clusterInstance.VtgateMySQLPort, } - clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + clusterInstance.VtctldClientProcess = *cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) return m.Run() }() diff --git a/go/test/endtoend/topoconncache/main_test.go b/go/test/endtoend/topoconncache/main_test.go index 074bf875165..512998a3769 100644 --- a/go/test/endtoend/topoconncache/main_test.go +++ b/go/test/endtoend/topoconncache/main_test.go @@ -116,12 +116,12 @@ func TestMain(m *testing.M) { if err != nil { return 1, err } - err = clusterInstance.VtctlProcess.AddCellInfo(cell2) + err = clusterInstance.VtctldClientProcess.AddCellInfo(cell2) if err != nil { return 1, err } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) _, err = vtctldClientProcess.ExecuteCommandWithOutput("CreateKeyspace", keyspaceName, "--durability-policy=semi_sync") if err != nil { return 1, err diff --git a/go/test/endtoend/topoconncache/topo_conn_cache_test.go b/go/test/endtoend/topoconncache/topo_conn_cache_test.go index f676af318cd..edd40226ed8 100644 --- a/go/test/endtoend/topoconncache/topo_conn_cache_test.go +++ b/go/test/endtoend/topoconncache/topo_conn_cache_test.go @@ -116,9 +116,9 @@ func deleteTablet(t *testing.T, tablet *cluster.Vttablet) { func addCellback(t *testing.T) { // creating new cell , with same name as previously deleted one but at a different root path. - clusterInstance.VtctlProcess.TopoRootPath = "/org1/obj1/" + clusterInstance.VtctldClientProcess.TopoRootPath = "/org1/obj1/" - err := clusterInstance.VtctlProcess.AddCellInfo(cell2) + err := clusterInstance.VtctldClientProcess.AddCellInfo(cell2) require.NoError(t, err) // create new vttablets diff --git a/go/test/endtoend/topotest/consul/main_test.go b/go/test/endtoend/topotest/consul/main_test.go index c6d48f44930..b71551dc6b7 100644 --- a/go/test/endtoend/topotest/consul/main_test.go +++ b/go/test/endtoend/topotest/consul/main_test.go @@ -143,7 +143,7 @@ func TestTopoRestart(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -185,7 +185,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. diff --git a/go/test/endtoend/topotest/etcd2/main_test.go b/go/test/endtoend/topotest/etcd2/main_test.go index ee2b542109b..b274219b41a 100644 --- a/go/test/endtoend/topotest/etcd2/main_test.go +++ b/go/test/endtoend/topotest/etcd2/main_test.go @@ -122,7 +122,7 @@ func TestTopoDownServingQuery(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -164,7 +164,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. @@ -203,7 +203,7 @@ func TestKeyspaceLocking(t *testing.T) { // TestLockingWithTTL tests that locking with the TTL override works as intended. func TestLockingWithTTL(t *testing.T) { // Create the topo server connection. - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) ctx := context.Background() @@ -224,7 +224,7 @@ func TestLockingWithTTL(t *testing.T) { // TestNamedLocking tests that named locking works as intended. func TestNamedLocking(t *testing.T) { // Create topo server connection. - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) ctx := context.Background() diff --git a/go/test/endtoend/topotest/zk2/main_test.go b/go/test/endtoend/topotest/zk2/main_test.go index c6569519a3d..95a2fc13894 100644 --- a/go/test/endtoend/topotest/zk2/main_test.go +++ b/go/test/endtoend/topotest/zk2/main_test.go @@ -119,7 +119,7 @@ func TestTopoDownServingQuery(t *testing.T) { // TestShardLocking tests that shard locking works as intended. func TestShardLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a shard lock. @@ -161,7 +161,7 @@ func TestShardLocking(t *testing.T) { // TestKeyspaceLocking tests that keyspace locking works as intended. func TestKeyspaceLocking(t *testing.T) { // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) // Acquire a keyspace lock. diff --git a/go/test/endtoend/vault/vault_test.go b/go/test/endtoend/vault/vault_test.go index aab68159ca3..f1ffbf75357 100644 --- a/go/test/endtoend/vault/vault_test.go +++ b/go/test/endtoend/vault/vault_test.go @@ -243,7 +243,7 @@ func initializeClusterLate(t *testing.T) { err := clusterInstance.SetupCluster(keyspace, []cluster.Shard{*shard}) require.NoError(t, err) - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInstance.VtctldProcess.GrpcPort, clusterInstance.TopoPort, "localhost", clusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") require.NoError(t, err, out) diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index dc5a72e5e88..bcf50d43702 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -109,8 +109,6 @@ type VitessCluster struct { Cells map[string]*Cell Topo *cluster.TopoProcess Vtctld *cluster.VtctldProcess - Vtctl *cluster.VtctlProcess - VtctlClient *cluster.VtctlClientProcess VtctldClient *cluster.VtctldClientProcess VTOrcProcess *cluster.VTOrcProcess } @@ -166,13 +164,12 @@ func (vc *VitessCluster) StartVTOrc() error { if vc.VTOrcProcess != nil { return nil } - base := cluster.VtctlProcessInstance(vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) - base.Binary = "vtorc" + base := cluster.VtProcessInstance("vtorc", "vtorc", vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) vtorcProcess := &cluster.VTOrcProcess{ - VtctlProcess: *base, - LogDir: vc.ClusterConfig.tmpDir, - Config: cluster.VTOrcConfiguration{}, - Port: vc.ClusterConfig.vtorcPort, + VtProcess: base, + LogDir: vc.ClusterConfig.tmpDir, + Config: cluster.VTOrcConfiguration{}, + Port: vc.ClusterConfig.vtorcPort, } err := vtorcProcess.Setup() if err != nil { @@ -385,8 +382,6 @@ func NewVitessCluster(t *testing.T, opts *clusterOptions) *VitessCluster { } vc.setupVtctld() - vc.setupVtctl() - vc.setupVtctlClient() vc.setupVtctldClient() return vc @@ -400,27 +395,17 @@ func (vc *VitessCluster) setupVtctld() { vc.Vtctld.Setup(vc.CellNames[0], extraVtctldArgs...) } -func (vc *VitessCluster) setupVtctl() { - vc.Vtctl = cluster.VtctlProcessInstance(vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname) - require.NotNil(vc.t, vc.Vtctl) +func (vc *VitessCluster) setupVtctldClient() { + vc.VtctldClient = cluster.VtctldClientProcessInstance(vc.ClusterConfig.vtctldGrpcPort, vc.ClusterConfig.topoPort, vc.ClusterConfig.hostname, vc.ClusterConfig.tmpDir) + require.NotNil(vc.t, vc.VtctldClient) for _, cellName := range vc.CellNames { - vc.Vtctl.AddCellInfo(cellName) + vc.VtctldClient.AddCellInfo(cellName) cell, err := vc.AddCell(vc.t, cellName) require.NoError(vc.t, err) require.NotNil(vc.t, cell) } } -func (vc *VitessCluster) setupVtctlClient() { - vc.VtctlClient = cluster.VtctlClientProcessInstance(vc.ClusterConfig.hostname, vc.Vtctld.GrpcPort, vc.ClusterConfig.tmpDir) - require.NotNil(vc.t, vc.VtctlClient) -} - -func (vc *VitessCluster) setupVtctldClient() { - vc.VtctldClient = cluster.VtctldClientProcessInstance(vc.ClusterConfig.hostname, vc.Vtctld.GrpcPort, vc.ClusterConfig.tmpDir) - require.NotNil(vc.t, vc.VtctldClient) -} - // CleanupDataroot deletes the vtdataroot directory. Since we run multiple tests sequentially in a single CI test shard, // we can run out of disk space due to all the leftover artifacts from previous tests. func (vc *VitessCluster) CleanupDataroot(t *testing.T, recreate bool) { @@ -461,7 +446,7 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, SidecarDBName: sidecarDBName, } - err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, "") require.NoError(t, err) log.Infof("Applying throttler config for keyspace %s", keyspace.Name) @@ -486,17 +471,17 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, require.NoError(t, vc.AddShards(t, cells, keyspace, shards, numReplicas, numRdonly, tabletIDBase, opts)) if schema != "" { - err := vc.VtctlClient.ApplySchema(ksName, schema) + err := vc.VtctldClient.ApplySchema(ksName, schema) require.NoError(t, err) } keyspace.Schema = schema if vschema != "" { - err := vc.VtctlClient.ApplyVSchema(ksName, vschema) + err := vc.VtctldClient.ApplyVSchema(ksName, vschema) require.NoError(t, err) } keyspace.VSchema = vschema - err = vc.VtctlClient.ExecuteCommand("RebuildKeyspaceGraph", ksName) + err = vc.VtctldClient.ExecuteCommand("RebuildKeyspaceGraph", ksName) require.NoError(t, err) return keyspace, nil } @@ -585,7 +570,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa log.Infof("Shard %s already exists, not adding", shardName) } else { log.Infof("Adding Shard %s", shardName) - if err := vc.VtctlClient.ExecuteCommand("CreateShard", keyspace.Name+"/"+shardName); err != nil { + if err := vc.VtctldClient.ExecuteCommand("CreateShard", keyspace.Name+"/"+shardName); err != nil { t.Fatalf("CreateShard command failed with %+v\n", err) } keyspace.Shards[shardName] = shard @@ -684,7 +669,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa } require.NotEqual(t, 0, primaryTabletUID, "Should have created a primary tablet") log.Infof("InitializeShard and make %d primary", primaryTabletUID) - require.NoError(t, vc.VtctlClient.InitializeShard(keyspace.Name, shardName, cells[0].Name, primaryTabletUID)) + require.NoError(t, vc.VtctldClient.InitializeShard(keyspace.Name, shardName, cells[0].Name, primaryTabletUID)) log.Infof("Finished creating shard %s", shard.Name) } @@ -721,7 +706,7 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa } } - err := vc.VtctlClient.ExecuteCommand("RebuildKeyspaceGraph", keyspace.Name) + err := vc.VtctldClient.ExecuteCommand("RebuildKeyspaceGraph", keyspace.Name) require.NoError(t, err) log.Infof("Waiting for throttler config to be applied on all shards") @@ -750,7 +735,7 @@ func (vc *VitessCluster) DeleteShard(t testing.TB, cellName string, ksName strin } log.Infof("Deleting Shard %s", shardName) // TODO how can we avoid the use of even_if_serving? - if output, err := vc.VtctlClient.ExecuteCommandWithOutput("DeleteShard", "--", "--recursive", "--even_if_serving", ksName+"/"+shardName); err != nil { + if output, err := vc.VtctldClient.ExecuteCommandWithOutput("DeleteShard", "--recursive", "--even-if-serving", ksName+"/"+shardName); err != nil { t.Fatalf("DeleteShard command failed with error %+v and output %s\n", err, output) } diff --git a/go/test/endtoend/vreplication/migrate_test.go b/go/test/endtoend/vreplication/migrate_test.go index 86b912738bc..ef20d953781 100644 --- a/go/test/endtoend/vreplication/migrate_test.go +++ b/go/test/endtoend/vreplication/migrate_test.go @@ -41,14 +41,17 @@ func insertInitialDataIntoExternalCluster(t *testing.T, conn *mysql.Conn) { }) } -// TestMigrate runs an e2e test for importing from an external cluster using the vtctldclient Mount and Migrate commands. -// We have an anti-pattern in Vitess: vt executables look for an environment variable VTDATAROOT for certain cluster parameters -// like the log directory when they are created. Until this test we just needed a single cluster for e2e tests. -// However now we need to create an external Vitess cluster. For this we need a different VTDATAROOT and -// hence the VTDATAROOT env variable gets overwritten. -// Each time we need to create vt processes in the "other" cluster we need to set the appropriate VTDATAROOT +// TestMigrateUnsharded runs an e2e test for importing from an external cluster using the +// vtctldclient Mount and Migrate commands.We have an anti-pattern in Vitess: vt executables +// look for an environment variable VTDATAROOT for certain cluster parameters like the log +// directory when they are created. Until this test we just needed a single cluster for e2e +// tests. However now we need to create an external Vitess cluster. For this we need a +// different VTDATAROOT and hence the VTDATAROOT env variable gets overwritten. Each time +// we need to create vt processes in the "other" cluster we need to set the appropriate +// VTDATAROOT. func TestMigrateUnsharded(t *testing.T) { vc = NewVitessCluster(t, nil) + defer vc.TearDown() oldDefaultReplicas := defaultReplicas oldDefaultRdonly := defaultRdonly @@ -59,8 +62,6 @@ func TestMigrateUnsharded(t *testing.T) { defaultRdonly = oldDefaultRdonly }() - defer vc.TearDown() - defaultCell := vc.Cells[vc.CellNames[0]] _, err := vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, nil) @@ -189,10 +190,10 @@ func TestMigrateUnsharded(t *testing.T) { }) } -// TestVtctldMigrate adds a test for a sharded cluster to validate a fix for a bug where the target keyspace name -// doesn't match that of the source cluster. The test migrates from a cluster with keyspace customer to an "external" -// cluster with keyspace rating. -func TestVtctldMigrateSharded(t *testing.T) { +// TestMigrateSharded adds a test for a sharded cluster to validate a fix for a bug where +// the target keyspace name doesn't match that of the source cluster. The test migrates +// from a cluster with keyspace customer to an "external" cluster with keyspace rating. +func TestMigrateSharded(t *testing.T) { setSidecarDBName("_vt") currentWorkflowType = binlogdatapb.VReplicationWorkflowType_MoveTables oldDefaultReplicas := defaultReplicas diff --git a/go/test/endtoend/vreplication/sidecardb_test.go b/go/test/endtoend/vreplication/sidecardb_test.go index 704742d305b..f908d66a2ec 100644 --- a/go/test/endtoend/vreplication/sidecardb_test.go +++ b/go/test/endtoend/vreplication/sidecardb_test.go @@ -51,7 +51,7 @@ func init() { } func prs(t *testing.T, keyspace, shard string) { - _, err := vc.VtctldClient.ExecuteCommandWithOutput("PlannedReparentShard", "--", fmt.Sprintf("%s/%s", keyspace, shard)) + _, err := vc.VtctldClient.ExecuteCommandWithOutput("PlannedReparentShard", fmt.Sprintf("%s/%s", keyspace, shard)) require.NoError(t, err) } diff --git a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go index 7a7247b39bf..39b23be8815 100644 --- a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go +++ b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go @@ -57,7 +57,7 @@ func TestVtctldclientCLI(t *testing.T) { vc = setupMinimalCluster(t) vttablet.InitVReplicationConfigDefaults() - err = vc.Vtctl.AddCellInfo("zone2") + err = vc.VtctldClient.AddCellInfo("zone2") require.NoError(t, err) zone2, err := vc.AddCell(t, "zone2") require.NoError(t, err) diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index 8079c968ebb..7009bade562 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -654,6 +654,8 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { // Confirm that we have shard GTIDs for the global shard and the old/original shards. require.Len(t, newVGTID.GetShardGtids(), 3) + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", ks, wf), binlogdatapb.VReplicationWorkflowState_Running.String()) + // Switch the traffic to the new shards. reshardAction(t, "SwitchTraffic", wf, ks, oldShards, newShards, defaultCellName, tabletType) diff --git a/go/test/endtoend/vtgate/queries/reference/main_test.go b/go/test/endtoend/vtgate/queries/reference/main_test.go index 03ee429e4c0..95e19ef596a 100644 --- a/go/test/endtoend/vtgate/queries/reference/main_test.go +++ b/go/test/endtoend/vtgate/queries/reference/main_test.go @@ -155,24 +155,14 @@ func TestMain(m *testing.M) { }() // Materialize zip_detail to sharded keyspace. - output, err := clusterInstance.VtctlProcess.ExecuteCommandWithOutput( + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( "Materialize", - "--", - "--tablet_types", - "PRIMARY", - `{ - "workflow": "copy_zip_detail", - "source_keyspace": "`+unshardedKeyspaceName+`", - "target_keyspace": "`+shardedKeyspaceName+`", - "tablet_types": "PRIMARY", - "table_settings": [ - { - "target_table": "zip_detail", - "source_expression": "select * from zip_detail", - "create_ddl": "copy" - } - ] - }`, + "--workflow", "copy_zip_detail", + "--target-keyspace", shardedKeyspaceName, + "create", + "--source-keyspace", unshardedKeyspaceName, + "--table-settings", `[{"target_table": "zip_detail", "source_expression": "select * from zip_detail", "create_ddl": "copy" }]`, + "--tablet-types", "PRIMARY", ) fmt.Fprintf(os.Stderr, "Output from materialize: %s\n", output) if err != nil { @@ -214,11 +204,12 @@ func TestMain(m *testing.M) { } // Stop materialize zip_detail to sharded keyspace. - err = clusterInstance.VtctlProcess.ExecuteCommand( + err = clusterInstance.VtctldClientProcess.ExecuteCommand( "Workflow", - "--", - shardedKeyspaceName+".copy_zip_detail", + "--keyspace", shardedKeyspaceName, "delete", + "--workflow", "copy_zip_detail", + "--keep-data", ) if err != nil { fmt.Fprintf(os.Stderr, "Failed to stop materialization workflow: %v", err) diff --git a/go/test/endtoend/vtgate/schema/schema_test.go b/go/test/endtoend/vtgate/schema/schema_test.go index 4c28e29ca0d..fd84b5b2793 100644 --- a/go/test/endtoend/vtgate/schema/schema_test.go +++ b/go/test/endtoend/vtgate/schema/schema_test.go @@ -294,7 +294,7 @@ func testCopySchemaShards(t *testing.T, source string, shard int) { checkTablesCount(t, clusterInstance.Keyspaces[0].Shards[shard].Vttablets[1], 0) // Run the command twice to make sure it's idempotent. for i := 0; i < 2; i++ { - err := clusterInstance.VtctlclientProcess.ExecuteCommand("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) + err := clusterInstance.VtctldClientProcess.ExecuteCommand("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) require.Nil(t, err) } // shard2 primary should look the same as the replica we copied from @@ -329,7 +329,7 @@ func testCopySchemaShardWithDifferentDB(t *testing.T, shard int) { err = clusterInstance.VtctldClientProcess.ExecuteCommand("ExecuteFetchAsDBA", "--json", tabletAlias, "ALTER DATABASE vt_ks CHARACTER SET latin1") require.Nil(t, err) - output, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("CopySchemaShard", source, fmt.Sprintf("%s/%d", keyspaceName, shard)) require.Error(t, err) assert.True(t, strings.Contains(output, "schemas are different")) diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index c58e8e9bb45..6a565ac046f 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -50,9 +50,9 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { // Change the args such that they match how we would invoke VTOrc os.Args = []string{"vtorc", - "--topo_global_server_address", clusterInfo.ClusterInstance.VtctlProcess.TopoGlobalAddress, - "--topo_implementation", clusterInfo.ClusterInstance.VtctlProcess.TopoImplementation, - "--topo_global_root", clusterInfo.ClusterInstance.VtctlProcess.TopoGlobalRoot, + "--topo_global_server_address", clusterInfo.ClusterInstance.VtctldClientProcess.TopoGlobalAddress, + "--topo_implementation", clusterInfo.ClusterInstance.VtctldClientProcess.TopoImplementation, + "--topo_global_root", clusterInfo.ClusterInstance.VtctldClientProcess.TopoGlobalRoot, } servenv.ParseFlags("vtorc") config.SetInstancePollTime(1 * time.Second) diff --git a/go/test/endtoend/vtorc/utils/utils.go b/go/test/endtoend/vtorc/utils/utils.go index 0a2d516fe63..b00e3897a61 100644 --- a/go/test/endtoend/vtorc/utils/utils.go +++ b/go/test/endtoend/vtorc/utils/utils.go @@ -90,7 +90,7 @@ func CreateClusterAndStartTopo(cellInfos []*CellInfo) (*VTOrcClusterInfo, error) if err != nil { return nil, err } - err = clusterInstance.VtctlProcess.AddCellInfo(Cell2) + err = clusterInstance.VtctldClientProcess.AddCellInfo(Cell2) if err != nil { return nil, err } @@ -102,7 +102,7 @@ func CreateClusterAndStartTopo(cellInfos []*CellInfo) (*VTOrcClusterInfo, error) } // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) return &VTOrcClusterInfo{ ClusterInstance: clusterInstance, Ts: ts, @@ -856,7 +856,7 @@ func SetupNewClusterSemiSync(t *testing.T) *VTOrcClusterInfo { require.NoError(t, err, out) // create topo server connection - ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctlProcess.TopoGlobalAddress, clusterInstance.VtctlProcess.TopoGlobalRoot) + ts, err := topo.OpenServer(*clusterInstance.TopoFlavorString(), clusterInstance.VtctldClientProcess.TopoGlobalAddress, clusterInstance.VtctldClientProcess.TopoGlobalRoot) require.NoError(t, err) clusterInfo := &VTOrcClusterInfo{ ClusterInstance: clusterInstance, @@ -927,7 +927,7 @@ func AddSemiSyncKeyspace(t *testing.T, clusterInfo *VTOrcClusterInfo) { require.NoError(t, err) } - vtctldClientProcess := cluster.VtctldClientProcessInstance("localhost", clusterInfo.ClusterInstance.VtctldProcess.GrpcPort, clusterInfo.ClusterInstance.TmpDirectory) + vtctldClientProcess := cluster.VtctldClientProcessInstance(clusterInfo.ClusterInstance.VtctldProcess.GrpcPort, clusterInfo.ClusterInstance.TopoPort, "localhost", clusterInfo.ClusterInstance.TmpDirectory) out, err := vtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceSemiSyncName, "--durability-policy=semi_sync") require.NoError(t, err, out) } diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index f675a190faa..98a791e9534 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -3222,6 +3222,143 @@ func (x *CompleteSchemaMigrationResponse) GetRowsAffectedByShard() map[string]ui return nil } +type CopySchemaShardRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SourceTabletAlias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=source_tablet_alias,json=sourceTabletAlias,proto3" json:"source_tablet_alias,omitempty"` + Tables []string `protobuf:"bytes,2,rep,name=tables,proto3" json:"tables,omitempty"` + ExcludeTables []string `protobuf:"bytes,3,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` + IncludeViews bool `protobuf:"varint,4,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` + SkipVerify bool `protobuf:"varint,5,opt,name=skip_verify,json=skipVerify,proto3" json:"skip_verify,omitempty"` + WaitReplicasTimeout *vttime.Duration `protobuf:"bytes,6,opt,name=wait_replicas_timeout,json=waitReplicasTimeout,proto3" json:"wait_replicas_timeout,omitempty"` + DestinationKeyspace string `protobuf:"bytes,7,opt,name=destination_keyspace,json=destinationKeyspace,proto3" json:"destination_keyspace,omitempty"` + DestinationShard string `protobuf:"bytes,8,opt,name=destination_shard,json=destinationShard,proto3" json:"destination_shard,omitempty"` +} + +func (x *CopySchemaShardRequest) Reset() { + *x = CopySchemaShardRequest{} + mi := &file_vtctldata_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CopySchemaShardRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopySchemaShardRequest) ProtoMessage() {} + +func (x *CopySchemaShardRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CopySchemaShardRequest.ProtoReflect.Descriptor instead. +func (*CopySchemaShardRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{38} +} + +func (x *CopySchemaShardRequest) GetSourceTabletAlias() *topodata.TabletAlias { + if x != nil { + return x.SourceTabletAlias + } + return nil +} + +func (x *CopySchemaShardRequest) GetTables() []string { + if x != nil { + return x.Tables + } + return nil +} + +func (x *CopySchemaShardRequest) GetExcludeTables() []string { + if x != nil { + return x.ExcludeTables + } + return nil +} + +func (x *CopySchemaShardRequest) GetIncludeViews() bool { + if x != nil { + return x.IncludeViews + } + return false +} + +func (x *CopySchemaShardRequest) GetSkipVerify() bool { + if x != nil { + return x.SkipVerify + } + return false +} + +func (x *CopySchemaShardRequest) GetWaitReplicasTimeout() *vttime.Duration { + if x != nil { + return x.WaitReplicasTimeout + } + return nil +} + +func (x *CopySchemaShardRequest) GetDestinationKeyspace() string { + if x != nil { + return x.DestinationKeyspace + } + return "" +} + +func (x *CopySchemaShardRequest) GetDestinationShard() string { + if x != nil { + return x.DestinationShard + } + return "" +} + +type CopySchemaShardResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CopySchemaShardResponse) Reset() { + *x = CopySchemaShardResponse{} + mi := &file_vtctldata_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CopySchemaShardResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CopySchemaShardResponse) ProtoMessage() {} + +func (x *CopySchemaShardResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CopySchemaShardResponse.ProtoReflect.Descriptor instead. +func (*CopySchemaShardResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{39} +} + type CreateKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3251,7 +3388,7 @@ type CreateKeyspaceRequest struct { func (x *CreateKeyspaceRequest) Reset() { *x = CreateKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3263,7 +3400,7 @@ func (x *CreateKeyspaceRequest) String() string { func (*CreateKeyspaceRequest) ProtoMessage() {} func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3276,7 +3413,7 @@ func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*CreateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{38} + return file_vtctldata_proto_rawDescGZIP(), []int{40} } func (x *CreateKeyspaceRequest) GetName() string { @@ -3346,7 +3483,7 @@ type CreateKeyspaceResponse struct { func (x *CreateKeyspaceResponse) Reset() { *x = CreateKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3358,7 +3495,7 @@ func (x *CreateKeyspaceResponse) String() string { func (*CreateKeyspaceResponse) ProtoMessage() {} func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3371,7 +3508,7 @@ func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*CreateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{39} + return file_vtctldata_proto_rawDescGZIP(), []int{41} } func (x *CreateKeyspaceResponse) GetKeyspace() *Keyspace { @@ -3400,7 +3537,7 @@ type CreateShardRequest struct { func (x *CreateShardRequest) Reset() { *x = CreateShardRequest{} - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3412,7 +3549,7 @@ func (x *CreateShardRequest) String() string { func (*CreateShardRequest) ProtoMessage() {} func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3425,7 +3562,7 @@ func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardRequest.ProtoReflect.Descriptor instead. func (*CreateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{40} + return file_vtctldata_proto_rawDescGZIP(), []int{42} } func (x *CreateShardRequest) GetKeyspace() string { @@ -3473,7 +3610,7 @@ type CreateShardResponse struct { func (x *CreateShardResponse) Reset() { *x = CreateShardResponse{} - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3485,7 +3622,7 @@ func (x *CreateShardResponse) String() string { func (*CreateShardResponse) ProtoMessage() {} func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3498,7 +3635,7 @@ func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardResponse.ProtoReflect.Descriptor instead. func (*CreateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{41} + return file_vtctldata_proto_rawDescGZIP(), []int{43} } func (x *CreateShardResponse) GetKeyspace() *Keyspace { @@ -3533,7 +3670,7 @@ type DeleteCellInfoRequest struct { func (x *DeleteCellInfoRequest) Reset() { *x = DeleteCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3545,7 +3682,7 @@ func (x *DeleteCellInfoRequest) String() string { func (*DeleteCellInfoRequest) ProtoMessage() {} func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3558,7 +3695,7 @@ func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoRequest.ProtoReflect.Descriptor instead. func (*DeleteCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{42} + return file_vtctldata_proto_rawDescGZIP(), []int{44} } func (x *DeleteCellInfoRequest) GetName() string { @@ -3583,7 +3720,7 @@ type DeleteCellInfoResponse struct { func (x *DeleteCellInfoResponse) Reset() { *x = DeleteCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3595,7 +3732,7 @@ func (x *DeleteCellInfoResponse) String() string { func (*DeleteCellInfoResponse) ProtoMessage() {} func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3608,7 +3745,7 @@ func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoResponse.ProtoReflect.Descriptor instead. func (*DeleteCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{43} + return file_vtctldata_proto_rawDescGZIP(), []int{45} } type DeleteCellsAliasRequest struct { @@ -3621,7 +3758,7 @@ type DeleteCellsAliasRequest struct { func (x *DeleteCellsAliasRequest) Reset() { *x = DeleteCellsAliasRequest{} - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3770,7 @@ func (x *DeleteCellsAliasRequest) String() string { func (*DeleteCellsAliasRequest) ProtoMessage() {} func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3783,7 @@ func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasRequest.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{44} + return file_vtctldata_proto_rawDescGZIP(), []int{46} } func (x *DeleteCellsAliasRequest) GetName() string { @@ -3664,7 +3801,7 @@ type DeleteCellsAliasResponse struct { func (x *DeleteCellsAliasResponse) Reset() { *x = DeleteCellsAliasResponse{} - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3676,7 +3813,7 @@ func (x *DeleteCellsAliasResponse) String() string { func (*DeleteCellsAliasResponse) ProtoMessage() {} func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3689,7 +3826,7 @@ func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasResponse.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{45} + return file_vtctldata_proto_rawDescGZIP(), []int{47} } type DeleteKeyspaceRequest struct { @@ -3710,7 +3847,7 @@ type DeleteKeyspaceRequest struct { func (x *DeleteKeyspaceRequest) Reset() { *x = DeleteKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3722,7 +3859,7 @@ func (x *DeleteKeyspaceRequest) String() string { func (*DeleteKeyspaceRequest) ProtoMessage() {} func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3735,7 +3872,7 @@ func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceRequest.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{46} + return file_vtctldata_proto_rawDescGZIP(), []int{48} } func (x *DeleteKeyspaceRequest) GetKeyspace() string { @@ -3767,7 +3904,7 @@ type DeleteKeyspaceResponse struct { func (x *DeleteKeyspaceResponse) Reset() { *x = DeleteKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3779,7 +3916,7 @@ func (x *DeleteKeyspaceResponse) String() string { func (*DeleteKeyspaceResponse) ProtoMessage() {} func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3792,7 +3929,7 @@ func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceResponse.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{47} + return file_vtctldata_proto_rawDescGZIP(), []int{49} } type DeleteShardsRequest struct { @@ -3817,7 +3954,7 @@ type DeleteShardsRequest struct { func (x *DeleteShardsRequest) Reset() { *x = DeleteShardsRequest{} - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +3966,7 @@ func (x *DeleteShardsRequest) String() string { func (*DeleteShardsRequest) ProtoMessage() {} func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +3979,7 @@ func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsRequest.ProtoReflect.Descriptor instead. func (*DeleteShardsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{48} + return file_vtctldata_proto_rawDescGZIP(), []int{50} } func (x *DeleteShardsRequest) GetShards() []*Shard { @@ -3881,7 +4018,7 @@ type DeleteShardsResponse struct { func (x *DeleteShardsResponse) Reset() { *x = DeleteShardsResponse{} - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3893,7 +4030,7 @@ func (x *DeleteShardsResponse) String() string { func (*DeleteShardsResponse) ProtoMessage() {} func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3906,7 +4043,7 @@ func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsResponse.ProtoReflect.Descriptor instead. func (*DeleteShardsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{49} + return file_vtctldata_proto_rawDescGZIP(), []int{51} } type DeleteSrvVSchemaRequest struct { @@ -3919,7 +4056,7 @@ type DeleteSrvVSchemaRequest struct { func (x *DeleteSrvVSchemaRequest) Reset() { *x = DeleteSrvVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3931,7 +4068,7 @@ func (x *DeleteSrvVSchemaRequest) String() string { func (*DeleteSrvVSchemaRequest) ProtoMessage() {} func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3944,7 +4081,7 @@ func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{50} + return file_vtctldata_proto_rawDescGZIP(), []int{52} } func (x *DeleteSrvVSchemaRequest) GetCell() string { @@ -3962,7 +4099,7 @@ type DeleteSrvVSchemaResponse struct { func (x *DeleteSrvVSchemaResponse) Reset() { *x = DeleteSrvVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3974,7 +4111,7 @@ func (x *DeleteSrvVSchemaResponse) String() string { func (*DeleteSrvVSchemaResponse) ProtoMessage() {} func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3987,7 +4124,7 @@ func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{51} + return file_vtctldata_proto_rawDescGZIP(), []int{53} } type DeleteTabletsRequest struct { @@ -4004,7 +4141,7 @@ type DeleteTabletsRequest struct { func (x *DeleteTabletsRequest) Reset() { *x = DeleteTabletsRequest{} - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4016,7 +4153,7 @@ func (x *DeleteTabletsRequest) String() string { func (*DeleteTabletsRequest) ProtoMessage() {} func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4029,7 +4166,7 @@ func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsRequest.ProtoReflect.Descriptor instead. func (*DeleteTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{52} + return file_vtctldata_proto_rawDescGZIP(), []int{54} } func (x *DeleteTabletsRequest) GetTabletAliases() []*topodata.TabletAlias { @@ -4054,7 +4191,7 @@ type DeleteTabletsResponse struct { func (x *DeleteTabletsResponse) Reset() { *x = DeleteTabletsResponse{} - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4066,7 +4203,7 @@ func (x *DeleteTabletsResponse) String() string { func (*DeleteTabletsResponse) ProtoMessage() {} func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4079,7 +4216,7 @@ func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsResponse.ProtoReflect.Descriptor instead. func (*DeleteTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{53} + return file_vtctldata_proto_rawDescGZIP(), []int{55} } type EmergencyReparentShardRequest struct { @@ -4115,7 +4252,7 @@ type EmergencyReparentShardRequest struct { func (x *EmergencyReparentShardRequest) Reset() { *x = EmergencyReparentShardRequest{} - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4127,7 +4264,7 @@ func (x *EmergencyReparentShardRequest) String() string { func (*EmergencyReparentShardRequest) ProtoMessage() {} func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4140,7 +4277,7 @@ func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardRequest.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{54} + return file_vtctldata_proto_rawDescGZIP(), []int{56} } func (x *EmergencyReparentShardRequest) GetKeyspace() string { @@ -4218,7 +4355,7 @@ type EmergencyReparentShardResponse struct { func (x *EmergencyReparentShardResponse) Reset() { *x = EmergencyReparentShardResponse{} - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4230,7 +4367,7 @@ func (x *EmergencyReparentShardResponse) String() string { func (*EmergencyReparentShardResponse) ProtoMessage() {} func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4243,7 +4380,7 @@ func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardResponse.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{55} + return file_vtctldata_proto_rawDescGZIP(), []int{57} } func (x *EmergencyReparentShardResponse) GetKeyspace() string { @@ -4294,7 +4431,7 @@ type ExecuteFetchAsAppRequest struct { func (x *ExecuteFetchAsAppRequest) Reset() { *x = ExecuteFetchAsAppRequest{} - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4306,7 +4443,7 @@ func (x *ExecuteFetchAsAppRequest) String() string { func (*ExecuteFetchAsAppRequest) ProtoMessage() {} func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4319,7 +4456,7 @@ func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppRequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{56} + return file_vtctldata_proto_rawDescGZIP(), []int{58} } func (x *ExecuteFetchAsAppRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4360,7 +4497,7 @@ type ExecuteFetchAsAppResponse struct { func (x *ExecuteFetchAsAppResponse) Reset() { *x = ExecuteFetchAsAppResponse{} - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4372,7 +4509,7 @@ func (x *ExecuteFetchAsAppResponse) String() string { func (*ExecuteFetchAsAppResponse) ProtoMessage() {} func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4385,7 +4522,7 @@ func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{57} + return file_vtctldata_proto_rawDescGZIP(), []int{59} } func (x *ExecuteFetchAsAppResponse) GetResult() *query.QueryResult { @@ -4419,7 +4556,7 @@ type ExecuteFetchAsDBARequest struct { func (x *ExecuteFetchAsDBARequest) Reset() { *x = ExecuteFetchAsDBARequest{} - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4431,7 +4568,7 @@ func (x *ExecuteFetchAsDBARequest) String() string { func (*ExecuteFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4444,7 +4581,7 @@ func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{58} + return file_vtctldata_proto_rawDescGZIP(), []int{60} } func (x *ExecuteFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4492,7 +4629,7 @@ type ExecuteFetchAsDBAResponse struct { func (x *ExecuteFetchAsDBAResponse) Reset() { *x = ExecuteFetchAsDBAResponse{} - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4504,7 +4641,7 @@ func (x *ExecuteFetchAsDBAResponse) String() string { func (*ExecuteFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4517,7 +4654,7 @@ func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{59} + return file_vtctldata_proto_rawDescGZIP(), []int{61} } func (x *ExecuteFetchAsDBAResponse) GetResult() *query.QueryResult { @@ -4538,7 +4675,7 @@ type ExecuteHookRequest struct { func (x *ExecuteHookRequest) Reset() { *x = ExecuteHookRequest{} - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4550,7 +4687,7 @@ func (x *ExecuteHookRequest) String() string { func (*ExecuteHookRequest) ProtoMessage() {} func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4563,7 +4700,7 @@ func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookRequest.ProtoReflect.Descriptor instead. func (*ExecuteHookRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{60} + return file_vtctldata_proto_rawDescGZIP(), []int{62} } func (x *ExecuteHookRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4590,7 +4727,7 @@ type ExecuteHookResponse struct { func (x *ExecuteHookResponse) Reset() { *x = ExecuteHookResponse{} - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4602,7 +4739,7 @@ func (x *ExecuteHookResponse) String() string { func (*ExecuteHookResponse) ProtoMessage() {} func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4615,7 +4752,7 @@ func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookResponse.ProtoReflect.Descriptor instead. func (*ExecuteHookResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{61} + return file_vtctldata_proto_rawDescGZIP(), []int{63} } func (x *ExecuteHookResponse) GetHookResult() *tabletmanagerdata.ExecuteHookResponse { @@ -4650,7 +4787,7 @@ type ExecuteMultiFetchAsDBARequest struct { func (x *ExecuteMultiFetchAsDBARequest) Reset() { *x = ExecuteMultiFetchAsDBARequest{} - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4662,7 +4799,7 @@ func (x *ExecuteMultiFetchAsDBARequest) String() string { func (*ExecuteMultiFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4675,7 +4812,7 @@ func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{62} + return file_vtctldata_proto_rawDescGZIP(), []int{64} } func (x *ExecuteMultiFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4723,7 +4860,7 @@ type ExecuteMultiFetchAsDBAResponse struct { func (x *ExecuteMultiFetchAsDBAResponse) Reset() { *x = ExecuteMultiFetchAsDBAResponse{} - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4735,7 +4872,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) String() string { func (*ExecuteMultiFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4748,7 +4885,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{63} + return file_vtctldata_proto_rawDescGZIP(), []int{65} } func (x *ExecuteMultiFetchAsDBAResponse) GetResults() []*query.QueryResult { @@ -4768,7 +4905,7 @@ type FindAllShardsInKeyspaceRequest struct { func (x *FindAllShardsInKeyspaceRequest) Reset() { *x = FindAllShardsInKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +4917,7 @@ func (x *FindAllShardsInKeyspaceRequest) String() string { func (*FindAllShardsInKeyspaceRequest) ProtoMessage() {} func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +4930,7 @@ func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceRequest.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{64} + return file_vtctldata_proto_rawDescGZIP(), []int{66} } func (x *FindAllShardsInKeyspaceRequest) GetKeyspace() string { @@ -4813,7 +4950,7 @@ type FindAllShardsInKeyspaceResponse struct { func (x *FindAllShardsInKeyspaceResponse) Reset() { *x = FindAllShardsInKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4825,7 +4962,7 @@ func (x *FindAllShardsInKeyspaceResponse) String() string { func (*FindAllShardsInKeyspaceResponse) ProtoMessage() {} func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4838,7 +4975,7 @@ func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceResponse.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{65} + return file_vtctldata_proto_rawDescGZIP(), []int{67} } func (x *FindAllShardsInKeyspaceResponse) GetShards() map[string]*Shard { @@ -4859,7 +4996,7 @@ type ForceCutOverSchemaMigrationRequest struct { func (x *ForceCutOverSchemaMigrationRequest) Reset() { *x = ForceCutOverSchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4871,7 +5008,7 @@ func (x *ForceCutOverSchemaMigrationRequest) String() string { func (*ForceCutOverSchemaMigrationRequest) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4884,7 +5021,7 @@ func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ForceCutOverSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{66} + return file_vtctldata_proto_rawDescGZIP(), []int{68} } func (x *ForceCutOverSchemaMigrationRequest) GetKeyspace() string { @@ -4911,7 +5048,7 @@ type ForceCutOverSchemaMigrationResponse struct { func (x *ForceCutOverSchemaMigrationResponse) Reset() { *x = ForceCutOverSchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4923,7 +5060,7 @@ func (x *ForceCutOverSchemaMigrationResponse) String() string { func (*ForceCutOverSchemaMigrationResponse) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4936,7 +5073,7 @@ func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ForceCutOverSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{67} + return file_vtctldata_proto_rawDescGZIP(), []int{69} } func (x *ForceCutOverSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -4971,7 +5108,7 @@ type GetBackupsRequest struct { func (x *GetBackupsRequest) Reset() { *x = GetBackupsRequest{} - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4983,7 +5120,7 @@ func (x *GetBackupsRequest) String() string { func (*GetBackupsRequest) ProtoMessage() {} func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4996,7 +5133,7 @@ func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsRequest.ProtoReflect.Descriptor instead. func (*GetBackupsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{68} + return file_vtctldata_proto_rawDescGZIP(), []int{70} } func (x *GetBackupsRequest) GetKeyspace() string { @@ -5044,7 +5181,7 @@ type GetBackupsResponse struct { func (x *GetBackupsResponse) Reset() { *x = GetBackupsResponse{} - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5056,7 +5193,7 @@ func (x *GetBackupsResponse) String() string { func (*GetBackupsResponse) ProtoMessage() {} func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5069,7 +5206,7 @@ func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsResponse.ProtoReflect.Descriptor instead. func (*GetBackupsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{69} + return file_vtctldata_proto_rawDescGZIP(), []int{71} } func (x *GetBackupsResponse) GetBackups() []*mysqlctl.BackupInfo { @@ -5089,7 +5226,7 @@ type GetCellInfoRequest struct { func (x *GetCellInfoRequest) Reset() { *x = GetCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5101,7 +5238,7 @@ func (x *GetCellInfoRequest) String() string { func (*GetCellInfoRequest) ProtoMessage() {} func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5114,7 +5251,7 @@ func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{70} + return file_vtctldata_proto_rawDescGZIP(), []int{72} } func (x *GetCellInfoRequest) GetCell() string { @@ -5134,7 +5271,7 @@ type GetCellInfoResponse struct { func (x *GetCellInfoResponse) Reset() { *x = GetCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5146,7 +5283,7 @@ func (x *GetCellInfoResponse) String() string { func (*GetCellInfoResponse) ProtoMessage() {} func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5159,7 +5296,7 @@ func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{71} + return file_vtctldata_proto_rawDescGZIP(), []int{73} } func (x *GetCellInfoResponse) GetCellInfo() *topodata.CellInfo { @@ -5177,7 +5314,7 @@ type GetCellInfoNamesRequest struct { func (x *GetCellInfoNamesRequest) Reset() { *x = GetCellInfoNamesRequest{} - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5189,7 +5326,7 @@ func (x *GetCellInfoNamesRequest) String() string { func (*GetCellInfoNamesRequest) ProtoMessage() {} func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5202,7 +5339,7 @@ func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{72} + return file_vtctldata_proto_rawDescGZIP(), []int{74} } type GetCellInfoNamesResponse struct { @@ -5215,7 +5352,7 @@ type GetCellInfoNamesResponse struct { func (x *GetCellInfoNamesResponse) Reset() { *x = GetCellInfoNamesResponse{} - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5227,7 +5364,7 @@ func (x *GetCellInfoNamesResponse) String() string { func (*GetCellInfoNamesResponse) ProtoMessage() {} func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5240,7 +5377,7 @@ func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{73} + return file_vtctldata_proto_rawDescGZIP(), []int{75} } func (x *GetCellInfoNamesResponse) GetNames() []string { @@ -5258,7 +5395,7 @@ type GetCellsAliasesRequest struct { func (x *GetCellsAliasesRequest) Reset() { *x = GetCellsAliasesRequest{} - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5270,7 +5407,7 @@ func (x *GetCellsAliasesRequest) String() string { func (*GetCellsAliasesRequest) ProtoMessage() {} func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5283,7 +5420,7 @@ func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesRequest.ProtoReflect.Descriptor instead. func (*GetCellsAliasesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{74} + return file_vtctldata_proto_rawDescGZIP(), []int{76} } type GetCellsAliasesResponse struct { @@ -5296,7 +5433,7 @@ type GetCellsAliasesResponse struct { func (x *GetCellsAliasesResponse) Reset() { *x = GetCellsAliasesResponse{} - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5308,7 +5445,7 @@ func (x *GetCellsAliasesResponse) String() string { func (*GetCellsAliasesResponse) ProtoMessage() {} func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5321,7 +5458,7 @@ func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesResponse.ProtoReflect.Descriptor instead. func (*GetCellsAliasesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{75} + return file_vtctldata_proto_rawDescGZIP(), []int{77} } func (x *GetCellsAliasesResponse) GetAliases() map[string]*topodata.CellsAlias { @@ -5341,7 +5478,7 @@ type GetFullStatusRequest struct { func (x *GetFullStatusRequest) Reset() { *x = GetFullStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5353,7 +5490,7 @@ func (x *GetFullStatusRequest) String() string { func (*GetFullStatusRequest) ProtoMessage() {} func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5366,7 +5503,7 @@ func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusRequest.ProtoReflect.Descriptor instead. func (*GetFullStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{76} + return file_vtctldata_proto_rawDescGZIP(), []int{78} } func (x *GetFullStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5386,7 +5523,7 @@ type GetFullStatusResponse struct { func (x *GetFullStatusResponse) Reset() { *x = GetFullStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5398,7 +5535,7 @@ func (x *GetFullStatusResponse) String() string { func (*GetFullStatusResponse) ProtoMessage() {} func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5411,7 +5548,7 @@ func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusResponse.ProtoReflect.Descriptor instead. func (*GetFullStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{77} + return file_vtctldata_proto_rawDescGZIP(), []int{79} } func (x *GetFullStatusResponse) GetStatus() *replicationdata.FullStatus { @@ -5429,7 +5566,7 @@ type GetKeyspacesRequest struct { func (x *GetKeyspacesRequest) Reset() { *x = GetKeyspacesRequest{} - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5441,7 +5578,7 @@ func (x *GetKeyspacesRequest) String() string { func (*GetKeyspacesRequest) ProtoMessage() {} func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5454,7 +5591,7 @@ func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{78} + return file_vtctldata_proto_rawDescGZIP(), []int{80} } type GetKeyspacesResponse struct { @@ -5467,7 +5604,7 @@ type GetKeyspacesResponse struct { func (x *GetKeyspacesResponse) Reset() { *x = GetKeyspacesResponse{} - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5479,7 +5616,7 @@ func (x *GetKeyspacesResponse) String() string { func (*GetKeyspacesResponse) ProtoMessage() {} func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5492,7 +5629,7 @@ func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{79} + return file_vtctldata_proto_rawDescGZIP(), []int{81} } func (x *GetKeyspacesResponse) GetKeyspaces() []*Keyspace { @@ -5512,7 +5649,7 @@ type GetKeyspaceRequest struct { func (x *GetKeyspaceRequest) Reset() { *x = GetKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5524,7 +5661,7 @@ func (x *GetKeyspaceRequest) String() string { func (*GetKeyspaceRequest) ProtoMessage() {} func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5537,7 +5674,7 @@ func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{80} + return file_vtctldata_proto_rawDescGZIP(), []int{82} } func (x *GetKeyspaceRequest) GetKeyspace() string { @@ -5557,7 +5694,7 @@ type GetKeyspaceResponse struct { func (x *GetKeyspaceResponse) Reset() { *x = GetKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5569,7 +5706,7 @@ func (x *GetKeyspaceResponse) String() string { func (*GetKeyspaceResponse) ProtoMessage() {} func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5582,7 +5719,7 @@ func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{81} + return file_vtctldata_proto_rawDescGZIP(), []int{83} } func (x *GetKeyspaceResponse) GetKeyspace() *Keyspace { @@ -5602,7 +5739,7 @@ type GetPermissionsRequest struct { func (x *GetPermissionsRequest) Reset() { *x = GetPermissionsRequest{} - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5614,7 +5751,7 @@ func (x *GetPermissionsRequest) String() string { func (*GetPermissionsRequest) ProtoMessage() {} func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5627,7 +5764,7 @@ func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsRequest.ProtoReflect.Descriptor instead. func (*GetPermissionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{82} + return file_vtctldata_proto_rawDescGZIP(), []int{84} } func (x *GetPermissionsRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5647,7 +5784,7 @@ type GetPermissionsResponse struct { func (x *GetPermissionsResponse) Reset() { *x = GetPermissionsResponse{} - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5659,7 +5796,7 @@ func (x *GetPermissionsResponse) String() string { func (*GetPermissionsResponse) ProtoMessage() {} func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5672,7 +5809,7 @@ func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsResponse.ProtoReflect.Descriptor instead. func (*GetPermissionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{83} + return file_vtctldata_proto_rawDescGZIP(), []int{85} } func (x *GetPermissionsResponse) GetPermissions() *tabletmanagerdata.Permissions { @@ -5690,7 +5827,7 @@ type GetKeyspaceRoutingRulesRequest struct { func (x *GetKeyspaceRoutingRulesRequest) Reset() { *x = GetKeyspaceRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5702,7 +5839,7 @@ func (x *GetKeyspaceRoutingRulesRequest) String() string { func (*GetKeyspaceRoutingRulesRequest) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5715,7 +5852,7 @@ func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{84} + return file_vtctldata_proto_rawDescGZIP(), []int{86} } type GetKeyspaceRoutingRulesResponse struct { @@ -5728,7 +5865,7 @@ type GetKeyspaceRoutingRulesResponse struct { func (x *GetKeyspaceRoutingRulesResponse) Reset() { *x = GetKeyspaceRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5740,7 +5877,7 @@ func (x *GetKeyspaceRoutingRulesResponse) String() string { func (*GetKeyspaceRoutingRulesResponse) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5753,7 +5890,7 @@ func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{85} + return file_vtctldata_proto_rawDescGZIP(), []int{87} } func (x *GetKeyspaceRoutingRulesResponse) GetKeyspaceRoutingRules() *vschema.KeyspaceRoutingRules { @@ -5771,7 +5908,7 @@ type GetRoutingRulesRequest struct { func (x *GetRoutingRulesRequest) Reset() { *x = GetRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5783,7 +5920,7 @@ func (x *GetRoutingRulesRequest) String() string { func (*GetRoutingRulesRequest) ProtoMessage() {} func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5796,7 +5933,7 @@ func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{86} + return file_vtctldata_proto_rawDescGZIP(), []int{88} } type GetRoutingRulesResponse struct { @@ -5809,7 +5946,7 @@ type GetRoutingRulesResponse struct { func (x *GetRoutingRulesResponse) Reset() { *x = GetRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5821,7 +5958,7 @@ func (x *GetRoutingRulesResponse) String() string { func (*GetRoutingRulesResponse) ProtoMessage() {} func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5834,7 +5971,7 @@ func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{87} + return file_vtctldata_proto_rawDescGZIP(), []int{89} } func (x *GetRoutingRulesResponse) GetRoutingRules() *vschema.RoutingRules { @@ -5872,7 +6009,7 @@ type GetSchemaRequest struct { func (x *GetSchemaRequest) Reset() { *x = GetSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5884,7 +6021,7 @@ func (x *GetSchemaRequest) String() string { func (*GetSchemaRequest) ProtoMessage() {} func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5897,7 +6034,7 @@ func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{88} + return file_vtctldata_proto_rawDescGZIP(), []int{90} } func (x *GetSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5959,7 +6096,7 @@ type GetSchemaResponse struct { func (x *GetSchemaResponse) Reset() { *x = GetSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5971,7 +6108,7 @@ func (x *GetSchemaResponse) String() string { func (*GetSchemaResponse) ProtoMessage() {} func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5984,7 +6121,7 @@ func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{89} + return file_vtctldata_proto_rawDescGZIP(), []int{91} } func (x *GetSchemaResponse) GetSchema() *tabletmanagerdata.SchemaDefinition { @@ -6029,7 +6166,7 @@ type GetSchemaMigrationsRequest struct { func (x *GetSchemaMigrationsRequest) Reset() { *x = GetSchemaMigrationsRequest{} - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6041,7 +6178,7 @@ func (x *GetSchemaMigrationsRequest) String() string { func (*GetSchemaMigrationsRequest) ProtoMessage() {} func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6054,7 +6191,7 @@ func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsRequest.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{90} + return file_vtctldata_proto_rawDescGZIP(), []int{92} } func (x *GetSchemaMigrationsRequest) GetKeyspace() string { @@ -6123,7 +6260,7 @@ type GetSchemaMigrationsResponse struct { func (x *GetSchemaMigrationsResponse) Reset() { *x = GetSchemaMigrationsResponse{} - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6135,7 +6272,7 @@ func (x *GetSchemaMigrationsResponse) String() string { func (*GetSchemaMigrationsResponse) ProtoMessage() {} func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6148,7 +6285,7 @@ func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsResponse.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{91} + return file_vtctldata_proto_rawDescGZIP(), []int{93} } func (x *GetSchemaMigrationsResponse) GetMigrations() []*SchemaMigration { @@ -6172,7 +6309,7 @@ type GetShardReplicationRequest struct { func (x *GetShardReplicationRequest) Reset() { *x = GetShardReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6184,7 +6321,7 @@ func (x *GetShardReplicationRequest) String() string { func (*GetShardReplicationRequest) ProtoMessage() {} func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6197,7 +6334,7 @@ func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationRequest.ProtoReflect.Descriptor instead. func (*GetShardReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{92} + return file_vtctldata_proto_rawDescGZIP(), []int{94} } func (x *GetShardReplicationRequest) GetKeyspace() string { @@ -6231,7 +6368,7 @@ type GetShardReplicationResponse struct { func (x *GetShardReplicationResponse) Reset() { *x = GetShardReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6243,7 +6380,7 @@ func (x *GetShardReplicationResponse) String() string { func (*GetShardReplicationResponse) ProtoMessage() {} func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6256,7 +6393,7 @@ func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationResponse.ProtoReflect.Descriptor instead. func (*GetShardReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{93} + return file_vtctldata_proto_rawDescGZIP(), []int{95} } func (x *GetShardReplicationResponse) GetShardReplicationByCell() map[string]*topodata.ShardReplication { @@ -6277,7 +6414,7 @@ type GetShardRequest struct { func (x *GetShardRequest) Reset() { *x = GetShardRequest{} - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6289,7 +6426,7 @@ func (x *GetShardRequest) String() string { func (*GetShardRequest) ProtoMessage() {} func (x *GetShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6302,7 +6439,7 @@ func (x *GetShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRequest.ProtoReflect.Descriptor instead. func (*GetShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{94} + return file_vtctldata_proto_rawDescGZIP(), []int{96} } func (x *GetShardRequest) GetKeyspace() string { @@ -6329,7 +6466,7 @@ type GetShardResponse struct { func (x *GetShardResponse) Reset() { *x = GetShardResponse{} - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6341,7 +6478,7 @@ func (x *GetShardResponse) String() string { func (*GetShardResponse) ProtoMessage() {} func (x *GetShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6354,7 +6491,7 @@ func (x *GetShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardResponse.ProtoReflect.Descriptor instead. func (*GetShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{95} + return file_vtctldata_proto_rawDescGZIP(), []int{97} } func (x *GetShardResponse) GetShard() *Shard { @@ -6372,7 +6509,7 @@ type GetShardRoutingRulesRequest struct { func (x *GetShardRoutingRulesRequest) Reset() { *x = GetShardRoutingRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6384,7 +6521,7 @@ func (x *GetShardRoutingRulesRequest) String() string { func (*GetShardRoutingRulesRequest) ProtoMessage() {} func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6397,7 +6534,7 @@ func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{96} + return file_vtctldata_proto_rawDescGZIP(), []int{98} } type GetShardRoutingRulesResponse struct { @@ -6410,7 +6547,7 @@ type GetShardRoutingRulesResponse struct { func (x *GetShardRoutingRulesResponse) Reset() { *x = GetShardRoutingRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6422,7 +6559,7 @@ func (x *GetShardRoutingRulesResponse) String() string { func (*GetShardRoutingRulesResponse) ProtoMessage() {} func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6435,7 +6572,7 @@ func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{97} + return file_vtctldata_proto_rawDescGZIP(), []int{99} } func (x *GetShardRoutingRulesResponse) GetShardRoutingRules() *vschema.ShardRoutingRules { @@ -6455,7 +6592,7 @@ type GetSrvKeyspaceNamesRequest struct { func (x *GetSrvKeyspaceNamesRequest) Reset() { *x = GetSrvKeyspaceNamesRequest{} - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6467,7 +6604,7 @@ func (x *GetSrvKeyspaceNamesRequest) String() string { func (*GetSrvKeyspaceNamesRequest) ProtoMessage() {} func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6480,7 +6617,7 @@ func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{98} + return file_vtctldata_proto_rawDescGZIP(), []int{100} } func (x *GetSrvKeyspaceNamesRequest) GetCells() []string { @@ -6501,7 +6638,7 @@ type GetSrvKeyspaceNamesResponse struct { func (x *GetSrvKeyspaceNamesResponse) Reset() { *x = GetSrvKeyspaceNamesResponse{} - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6513,7 +6650,7 @@ func (x *GetSrvKeyspaceNamesResponse) String() string { func (*GetSrvKeyspaceNamesResponse) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6526,7 +6663,7 @@ func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{99} + return file_vtctldata_proto_rawDescGZIP(), []int{101} } func (x *GetSrvKeyspaceNamesResponse) GetNames() map[string]*GetSrvKeyspaceNamesResponse_NameList { @@ -6549,7 +6686,7 @@ type GetSrvKeyspacesRequest struct { func (x *GetSrvKeyspacesRequest) Reset() { *x = GetSrvKeyspacesRequest{} - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6561,7 +6698,7 @@ func (x *GetSrvKeyspacesRequest) String() string { func (*GetSrvKeyspacesRequest) ProtoMessage() {} func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6574,7 +6711,7 @@ func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{100} + return file_vtctldata_proto_rawDescGZIP(), []int{102} } func (x *GetSrvKeyspacesRequest) GetKeyspace() string { @@ -6602,7 +6739,7 @@ type GetSrvKeyspacesResponse struct { func (x *GetSrvKeyspacesResponse) Reset() { *x = GetSrvKeyspacesResponse{} - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6614,7 +6751,7 @@ func (x *GetSrvKeyspacesResponse) String() string { func (*GetSrvKeyspacesResponse) ProtoMessage() {} func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6627,7 +6764,7 @@ func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{101} + return file_vtctldata_proto_rawDescGZIP(), []int{103} } func (x *GetSrvKeyspacesResponse) GetSrvKeyspaces() map[string]*topodata.SrvKeyspace { @@ -6670,7 +6807,7 @@ type UpdateThrottlerConfigRequest struct { func (x *UpdateThrottlerConfigRequest) Reset() { *x = UpdateThrottlerConfigRequest{} - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6682,7 +6819,7 @@ func (x *UpdateThrottlerConfigRequest) String() string { func (*UpdateThrottlerConfigRequest) ProtoMessage() {} func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6695,7 +6832,7 @@ func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigRequest.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{102} + return file_vtctldata_proto_rawDescGZIP(), []int{104} } func (x *UpdateThrottlerConfigRequest) GetKeyspace() string { @@ -6790,7 +6927,7 @@ type UpdateThrottlerConfigResponse struct { func (x *UpdateThrottlerConfigResponse) Reset() { *x = UpdateThrottlerConfigResponse{} - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6802,7 +6939,7 @@ func (x *UpdateThrottlerConfigResponse) String() string { func (*UpdateThrottlerConfigResponse) ProtoMessage() {} func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6815,7 +6952,7 @@ func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigResponse.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{103} + return file_vtctldata_proto_rawDescGZIP(), []int{105} } type GetSrvVSchemaRequest struct { @@ -6828,7 +6965,7 @@ type GetSrvVSchemaRequest struct { func (x *GetSrvVSchemaRequest) Reset() { *x = GetSrvVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6840,7 +6977,7 @@ func (x *GetSrvVSchemaRequest) String() string { func (*GetSrvVSchemaRequest) ProtoMessage() {} func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6853,7 +6990,7 @@ func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{104} + return file_vtctldata_proto_rawDescGZIP(), []int{106} } func (x *GetSrvVSchemaRequest) GetCell() string { @@ -6873,7 +7010,7 @@ type GetSrvVSchemaResponse struct { func (x *GetSrvVSchemaResponse) Reset() { *x = GetSrvVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6885,7 +7022,7 @@ func (x *GetSrvVSchemaResponse) String() string { func (*GetSrvVSchemaResponse) ProtoMessage() {} func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6898,7 +7035,7 @@ func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{105} + return file_vtctldata_proto_rawDescGZIP(), []int{107} } func (x *GetSrvVSchemaResponse) GetSrvVSchema() *vschema.SrvVSchema { @@ -6918,7 +7055,7 @@ type GetSrvVSchemasRequest struct { func (x *GetSrvVSchemasRequest) Reset() { *x = GetSrvVSchemasRequest{} - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6930,7 +7067,7 @@ func (x *GetSrvVSchemasRequest) String() string { func (*GetSrvVSchemasRequest) ProtoMessage() {} func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6943,7 +7080,7 @@ func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{106} + return file_vtctldata_proto_rawDescGZIP(), []int{108} } func (x *GetSrvVSchemasRequest) GetCells() []string { @@ -6964,7 +7101,7 @@ type GetSrvVSchemasResponse struct { func (x *GetSrvVSchemasResponse) Reset() { *x = GetSrvVSchemasResponse{} - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6976,7 +7113,7 @@ func (x *GetSrvVSchemasResponse) String() string { func (*GetSrvVSchemasResponse) ProtoMessage() {} func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6989,7 +7126,7 @@ func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{107} + return file_vtctldata_proto_rawDescGZIP(), []int{109} } func (x *GetSrvVSchemasResponse) GetSrvVSchemas() map[string]*vschema.SrvVSchema { @@ -7009,7 +7146,7 @@ type GetTabletRequest struct { func (x *GetTabletRequest) Reset() { *x = GetTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7021,7 +7158,7 @@ func (x *GetTabletRequest) String() string { func (*GetTabletRequest) ProtoMessage() {} func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7034,7 +7171,7 @@ func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletRequest.ProtoReflect.Descriptor instead. func (*GetTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{108} + return file_vtctldata_proto_rawDescGZIP(), []int{110} } func (x *GetTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7054,7 +7191,7 @@ type GetTabletResponse struct { func (x *GetTabletResponse) Reset() { *x = GetTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7066,7 +7203,7 @@ func (x *GetTabletResponse) String() string { func (*GetTabletResponse) ProtoMessage() {} func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7079,7 +7216,7 @@ func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletResponse.ProtoReflect.Descriptor instead. func (*GetTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{109} + return file_vtctldata_proto_rawDescGZIP(), []int{111} } func (x *GetTabletResponse) GetTablet() *topodata.Tablet { @@ -7120,7 +7257,7 @@ type GetTabletsRequest struct { func (x *GetTabletsRequest) Reset() { *x = GetTabletsRequest{} - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7132,7 +7269,7 @@ func (x *GetTabletsRequest) String() string { func (*GetTabletsRequest) ProtoMessage() {} func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7145,7 +7282,7 @@ func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsRequest.ProtoReflect.Descriptor instead. func (*GetTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{110} + return file_vtctldata_proto_rawDescGZIP(), []int{112} } func (x *GetTabletsRequest) GetKeyspace() string { @@ -7200,7 +7337,7 @@ type GetTabletsResponse struct { func (x *GetTabletsResponse) Reset() { *x = GetTabletsResponse{} - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7212,7 +7349,7 @@ func (x *GetTabletsResponse) String() string { func (*GetTabletsResponse) ProtoMessage() {} func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7225,7 +7362,7 @@ func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsResponse.ProtoReflect.Descriptor instead. func (*GetTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{111} + return file_vtctldata_proto_rawDescGZIP(), []int{113} } func (x *GetTabletsResponse) GetTablets() []*topodata.Tablet { @@ -7246,7 +7383,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7258,7 +7395,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7271,7 +7408,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{112} + return file_vtctldata_proto_rawDescGZIP(), []int{114} } func (x *GetThrottlerStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7291,7 +7428,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7303,7 +7440,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7316,7 +7453,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{113} + return file_vtctldata_proto_rawDescGZIP(), []int{115} } func (x *GetThrottlerStatusResponse) GetStatus() *tabletmanagerdata.GetThrottlerStatusResponse { @@ -7338,7 +7475,7 @@ type GetTopologyPathRequest struct { func (x *GetTopologyPathRequest) Reset() { *x = GetTopologyPathRequest{} - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7350,7 +7487,7 @@ func (x *GetTopologyPathRequest) String() string { func (*GetTopologyPathRequest) ProtoMessage() {} func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7363,7 +7500,7 @@ func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathRequest.ProtoReflect.Descriptor instead. func (*GetTopologyPathRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{114} + return file_vtctldata_proto_rawDescGZIP(), []int{116} } func (x *GetTopologyPathRequest) GetPath() string { @@ -7397,7 +7534,7 @@ type GetTopologyPathResponse struct { func (x *GetTopologyPathResponse) Reset() { *x = GetTopologyPathResponse{} - mi := &file_vtctldata_proto_msgTypes[115] + mi := &file_vtctldata_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7409,7 +7546,7 @@ func (x *GetTopologyPathResponse) String() string { func (*GetTopologyPathResponse) ProtoMessage() {} func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[115] + mi := &file_vtctldata_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7422,7 +7559,7 @@ func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathResponse.ProtoReflect.Descriptor instead. func (*GetTopologyPathResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{115} + return file_vtctldata_proto_rawDescGZIP(), []int{117} } func (x *GetTopologyPathResponse) GetCell() *TopologyCell { @@ -7448,7 +7585,7 @@ type TopologyCell struct { func (x *TopologyCell) Reset() { *x = TopologyCell{} - mi := &file_vtctldata_proto_msgTypes[116] + mi := &file_vtctldata_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7460,7 +7597,7 @@ func (x *TopologyCell) String() string { func (*TopologyCell) ProtoMessage() {} func (x *TopologyCell) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[116] + mi := &file_vtctldata_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7473,7 +7610,7 @@ func (x *TopologyCell) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyCell.ProtoReflect.Descriptor instead. func (*TopologyCell) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{116} + return file_vtctldata_proto_rawDescGZIP(), []int{118} } func (x *TopologyCell) GetName() string { @@ -7522,7 +7659,7 @@ type GetUnresolvedTransactionsRequest struct { func (x *GetUnresolvedTransactionsRequest) Reset() { *x = GetUnresolvedTransactionsRequest{} - mi := &file_vtctldata_proto_msgTypes[117] + mi := &file_vtctldata_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7534,7 +7671,7 @@ func (x *GetUnresolvedTransactionsRequest) String() string { func (*GetUnresolvedTransactionsRequest) ProtoMessage() {} func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[117] + mi := &file_vtctldata_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7547,7 +7684,7 @@ func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUnresolvedTransactionsRequest.ProtoReflect.Descriptor instead. func (*GetUnresolvedTransactionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{117} + return file_vtctldata_proto_rawDescGZIP(), []int{119} } func (x *GetUnresolvedTransactionsRequest) GetKeyspace() string { @@ -7574,7 +7711,7 @@ type GetUnresolvedTransactionsResponse struct { func (x *GetUnresolvedTransactionsResponse) Reset() { *x = GetUnresolvedTransactionsResponse{} - mi := &file_vtctldata_proto_msgTypes[118] + mi := &file_vtctldata_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7586,7 +7723,7 @@ func (x *GetUnresolvedTransactionsResponse) String() string { func (*GetUnresolvedTransactionsResponse) ProtoMessage() {} func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[118] + mi := &file_vtctldata_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7599,7 +7736,7 @@ func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetUnresolvedTransactionsResponse.ProtoReflect.Descriptor instead. func (*GetUnresolvedTransactionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{118} + return file_vtctldata_proto_rawDescGZIP(), []int{120} } func (x *GetUnresolvedTransactionsResponse) GetTransactions() []*query.TransactionMetadata { @@ -7619,7 +7756,7 @@ type GetTransactionInfoRequest struct { func (x *GetTransactionInfoRequest) Reset() { *x = GetTransactionInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7631,7 +7768,7 @@ func (x *GetTransactionInfoRequest) String() string { func (*GetTransactionInfoRequest) ProtoMessage() {} func (x *GetTransactionInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7644,7 +7781,7 @@ func (x *GetTransactionInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionInfoRequest.ProtoReflect.Descriptor instead. func (*GetTransactionInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{119} + return file_vtctldata_proto_rawDescGZIP(), []int{121} } func (x *GetTransactionInfoRequest) GetDtid() string { @@ -7668,7 +7805,7 @@ type ShardTransactionState struct { func (x *ShardTransactionState) Reset() { *x = ShardTransactionState{} - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7680,7 +7817,7 @@ func (x *ShardTransactionState) String() string { func (*ShardTransactionState) ProtoMessage() {} func (x *ShardTransactionState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7693,7 +7830,7 @@ func (x *ShardTransactionState) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardTransactionState.ProtoReflect.Descriptor instead. func (*ShardTransactionState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{120} + return file_vtctldata_proto_rawDescGZIP(), []int{122} } func (x *ShardTransactionState) GetShard() string { @@ -7742,7 +7879,7 @@ type GetTransactionInfoResponse struct { func (x *GetTransactionInfoResponse) Reset() { *x = GetTransactionInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7754,7 +7891,7 @@ func (x *GetTransactionInfoResponse) String() string { func (*GetTransactionInfoResponse) ProtoMessage() {} func (x *GetTransactionInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7767,7 +7904,7 @@ func (x *GetTransactionInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransactionInfoResponse.ProtoReflect.Descriptor instead. func (*GetTransactionInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{121} + return file_vtctldata_proto_rawDescGZIP(), []int{123} } func (x *GetTransactionInfoResponse) GetMetadata() *query.TransactionMetadata { @@ -7795,7 +7932,7 @@ type ConcludeTransactionRequest struct { func (x *ConcludeTransactionRequest) Reset() { *x = ConcludeTransactionRequest{} - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7807,7 +7944,7 @@ func (x *ConcludeTransactionRequest) String() string { func (*ConcludeTransactionRequest) ProtoMessage() {} func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,7 +7957,7 @@ func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConcludeTransactionRequest.ProtoReflect.Descriptor instead. func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{122} + return file_vtctldata_proto_rawDescGZIP(), []int{124} } func (x *ConcludeTransactionRequest) GetDtid() string { @@ -7845,7 +7982,7 @@ type ConcludeTransactionResponse struct { func (x *ConcludeTransactionResponse) Reset() { *x = ConcludeTransactionResponse{} - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7857,7 +7994,7 @@ func (x *ConcludeTransactionResponse) String() string { func (*ConcludeTransactionResponse) ProtoMessage() {} func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7870,7 +8007,7 @@ func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConcludeTransactionResponse.ProtoReflect.Descriptor instead. func (*ConcludeTransactionResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{123} + return file_vtctldata_proto_rawDescGZIP(), []int{125} } type GetVSchemaRequest struct { @@ -7883,7 +8020,7 @@ type GetVSchemaRequest struct { func (x *GetVSchemaRequest) Reset() { *x = GetVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7895,7 +8032,7 @@ func (x *GetVSchemaRequest) String() string { func (*GetVSchemaRequest) ProtoMessage() {} func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7908,7 +8045,7 @@ func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{124} + return file_vtctldata_proto_rawDescGZIP(), []int{126} } func (x *GetVSchemaRequest) GetKeyspace() string { @@ -7928,7 +8065,7 @@ type GetVersionRequest struct { func (x *GetVersionRequest) Reset() { *x = GetVersionRequest{} - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7940,7 +8077,7 @@ func (x *GetVersionRequest) String() string { func (*GetVersionRequest) ProtoMessage() {} func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7953,7 +8090,7 @@ func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionRequest.ProtoReflect.Descriptor instead. func (*GetVersionRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{125} + return file_vtctldata_proto_rawDescGZIP(), []int{127} } func (x *GetVersionRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7973,7 +8110,7 @@ type GetVersionResponse struct { func (x *GetVersionResponse) Reset() { *x = GetVersionResponse{} - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7985,7 +8122,7 @@ func (x *GetVersionResponse) String() string { func (*GetVersionResponse) ProtoMessage() {} func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7998,7 +8135,7 @@ func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionResponse.ProtoReflect.Descriptor instead. func (*GetVersionResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{126} + return file_vtctldata_proto_rawDescGZIP(), []int{128} } func (x *GetVersionResponse) GetVersion() string { @@ -8018,7 +8155,7 @@ type GetVSchemaResponse struct { func (x *GetVSchemaResponse) Reset() { *x = GetVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8030,7 +8167,7 @@ func (x *GetVSchemaResponse) String() string { func (*GetVSchemaResponse) ProtoMessage() {} func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8043,7 +8180,7 @@ func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemaResponse.ProtoReflect.Descriptor instead. func (*GetVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{127} + return file_vtctldata_proto_rawDescGZIP(), []int{129} } func (x *GetVSchemaResponse) GetVSchema() *vschema.Keyspace { @@ -8069,7 +8206,7 @@ type GetWorkflowsRequest struct { func (x *GetWorkflowsRequest) Reset() { *x = GetWorkflowsRequest{} - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8081,7 +8218,7 @@ func (x *GetWorkflowsRequest) String() string { func (*GetWorkflowsRequest) ProtoMessage() {} func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8094,7 +8231,7 @@ func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{128} + return file_vtctldata_proto_rawDescGZIP(), []int{130} } func (x *GetWorkflowsRequest) GetKeyspace() string { @@ -8149,7 +8286,7 @@ type GetWorkflowsResponse struct { func (x *GetWorkflowsResponse) Reset() { *x = GetWorkflowsResponse{} - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8161,7 +8298,7 @@ func (x *GetWorkflowsResponse) String() string { func (*GetWorkflowsResponse) ProtoMessage() {} func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8174,7 +8311,7 @@ func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsResponse.ProtoReflect.Descriptor instead. func (*GetWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{129} + return file_vtctldata_proto_rawDescGZIP(), []int{131} } func (x *GetWorkflowsResponse) GetWorkflows() []*Workflow { @@ -8198,7 +8335,7 @@ type InitShardPrimaryRequest struct { func (x *InitShardPrimaryRequest) Reset() { *x = InitShardPrimaryRequest{} - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8210,7 +8347,7 @@ func (x *InitShardPrimaryRequest) String() string { func (*InitShardPrimaryRequest) ProtoMessage() {} func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8223,7 +8360,7 @@ func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryRequest.ProtoReflect.Descriptor instead. func (*InitShardPrimaryRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{130} + return file_vtctldata_proto_rawDescGZIP(), []int{132} } func (x *InitShardPrimaryRequest) GetKeyspace() string { @@ -8271,7 +8408,7 @@ type InitShardPrimaryResponse struct { func (x *InitShardPrimaryResponse) Reset() { *x = InitShardPrimaryResponse{} - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8283,7 +8420,7 @@ func (x *InitShardPrimaryResponse) String() string { func (*InitShardPrimaryResponse) ProtoMessage() {} func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8296,7 +8433,7 @@ func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryResponse.ProtoReflect.Descriptor instead. func (*InitShardPrimaryResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{131} + return file_vtctldata_proto_rawDescGZIP(), []int{133} } func (x *InitShardPrimaryResponse) GetEvents() []*logutil.Event { @@ -8317,7 +8454,7 @@ type LaunchSchemaMigrationRequest struct { func (x *LaunchSchemaMigrationRequest) Reset() { *x = LaunchSchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8329,7 +8466,7 @@ func (x *LaunchSchemaMigrationRequest) String() string { func (*LaunchSchemaMigrationRequest) ProtoMessage() {} func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8342,7 +8479,7 @@ func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{132} + return file_vtctldata_proto_rawDescGZIP(), []int{134} } func (x *LaunchSchemaMigrationRequest) GetKeyspace() string { @@ -8369,7 +8506,7 @@ type LaunchSchemaMigrationResponse struct { func (x *LaunchSchemaMigrationResponse) Reset() { *x = LaunchSchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8381,7 +8518,7 @@ func (x *LaunchSchemaMigrationResponse) String() string { func (*LaunchSchemaMigrationResponse) ProtoMessage() {} func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8394,7 +8531,7 @@ func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{133} + return file_vtctldata_proto_rawDescGZIP(), []int{135} } func (x *LaunchSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -8420,7 +8557,7 @@ type LookupVindexCreateRequest struct { func (x *LookupVindexCreateRequest) Reset() { *x = LookupVindexCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8432,7 +8569,7 @@ func (x *LookupVindexCreateRequest) String() string { func (*LookupVindexCreateRequest) ProtoMessage() {} func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8445,7 +8582,7 @@ func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateRequest.ProtoReflect.Descriptor instead. func (*LookupVindexCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{134} + return file_vtctldata_proto_rawDescGZIP(), []int{136} } func (x *LookupVindexCreateRequest) GetKeyspace() string { @@ -8505,7 +8642,7 @@ type LookupVindexCreateResponse struct { func (x *LookupVindexCreateResponse) Reset() { *x = LookupVindexCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8517,7 +8654,7 @@ func (x *LookupVindexCreateResponse) String() string { func (*LookupVindexCreateResponse) ProtoMessage() {} func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8530,7 +8667,7 @@ func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateResponse.ProtoReflect.Descriptor instead. func (*LookupVindexCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{135} + return file_vtctldata_proto_rawDescGZIP(), []int{137} } type LookupVindexExternalizeRequest struct { @@ -8548,7 +8685,7 @@ type LookupVindexExternalizeRequest struct { func (x *LookupVindexExternalizeRequest) Reset() { *x = LookupVindexExternalizeRequest{} - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8560,7 +8697,7 @@ func (x *LookupVindexExternalizeRequest) String() string { func (*LookupVindexExternalizeRequest) ProtoMessage() {} func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8573,7 +8710,7 @@ func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeRequest.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{136} + return file_vtctldata_proto_rawDescGZIP(), []int{138} } func (x *LookupVindexExternalizeRequest) GetKeyspace() string { @@ -8608,7 +8745,7 @@ type LookupVindexExternalizeResponse struct { func (x *LookupVindexExternalizeResponse) Reset() { *x = LookupVindexExternalizeResponse{} - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8620,7 +8757,7 @@ func (x *LookupVindexExternalizeResponse) String() string { func (*LookupVindexExternalizeResponse) ProtoMessage() {} func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8633,7 +8770,7 @@ func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeResponse.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{137} + return file_vtctldata_proto_rawDescGZIP(), []int{139} } func (x *LookupVindexExternalizeResponse) GetWorkflowDeleted() bool { @@ -8653,7 +8790,7 @@ type MaterializeCreateRequest struct { func (x *MaterializeCreateRequest) Reset() { *x = MaterializeCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8665,7 +8802,7 @@ func (x *MaterializeCreateRequest) String() string { func (*MaterializeCreateRequest) ProtoMessage() {} func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8678,7 +8815,7 @@ func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateRequest.ProtoReflect.Descriptor instead. func (*MaterializeCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{138} + return file_vtctldata_proto_rawDescGZIP(), []int{140} } func (x *MaterializeCreateRequest) GetSettings() *MaterializeSettings { @@ -8696,7 +8833,7 @@ type MaterializeCreateResponse struct { func (x *MaterializeCreateResponse) Reset() { *x = MaterializeCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8708,7 +8845,7 @@ func (x *MaterializeCreateResponse) String() string { func (*MaterializeCreateResponse) ProtoMessage() {} func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8721,7 +8858,7 @@ func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateResponse.ProtoReflect.Descriptor instead. func (*MaterializeCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{139} + return file_vtctldata_proto_rawDescGZIP(), []int{141} } type MigrateCreateRequest struct { @@ -8759,7 +8896,7 @@ type MigrateCreateRequest struct { func (x *MigrateCreateRequest) Reset() { *x = MigrateCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8771,7 +8908,7 @@ func (x *MigrateCreateRequest) String() string { func (*MigrateCreateRequest) ProtoMessage() {} func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8784,7 +8921,7 @@ func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCreateRequest.ProtoReflect.Descriptor instead. func (*MigrateCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{140} + return file_vtctldata_proto_rawDescGZIP(), []int{142} } func (x *MigrateCreateRequest) GetWorkflow() string { @@ -8921,7 +9058,7 @@ type MigrateCompleteRequest struct { func (x *MigrateCompleteRequest) Reset() { *x = MigrateCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8933,7 +9070,7 @@ func (x *MigrateCompleteRequest) String() string { func (*MigrateCompleteRequest) ProtoMessage() {} func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8946,7 +9083,7 @@ func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteRequest.ProtoReflect.Descriptor instead. func (*MigrateCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{141} + return file_vtctldata_proto_rawDescGZIP(), []int{143} } func (x *MigrateCompleteRequest) GetWorkflow() string { @@ -9002,7 +9139,7 @@ type MigrateCompleteResponse struct { func (x *MigrateCompleteResponse) Reset() { *x = MigrateCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9014,7 +9151,7 @@ func (x *MigrateCompleteResponse) String() string { func (*MigrateCompleteResponse) ProtoMessage() {} func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9027,7 +9164,7 @@ func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteResponse.ProtoReflect.Descriptor instead. func (*MigrateCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{142} + return file_vtctldata_proto_rawDescGZIP(), []int{144} } func (x *MigrateCompleteResponse) GetSummary() string { @@ -9057,7 +9194,7 @@ type MountRegisterRequest struct { func (x *MountRegisterRequest) Reset() { *x = MountRegisterRequest{} - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9069,7 +9206,7 @@ func (x *MountRegisterRequest) String() string { func (*MountRegisterRequest) ProtoMessage() {} func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9082,7 +9219,7 @@ func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterRequest.ProtoReflect.Descriptor instead. func (*MountRegisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{143} + return file_vtctldata_proto_rawDescGZIP(), []int{145} } func (x *MountRegisterRequest) GetTopoType() string { @@ -9121,7 +9258,7 @@ type MountRegisterResponse struct { func (x *MountRegisterResponse) Reset() { *x = MountRegisterResponse{} - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9133,7 +9270,7 @@ func (x *MountRegisterResponse) String() string { func (*MountRegisterResponse) ProtoMessage() {} func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9146,7 +9283,7 @@ func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterResponse.ProtoReflect.Descriptor instead. func (*MountRegisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{144} + return file_vtctldata_proto_rawDescGZIP(), []int{146} } type MountUnregisterRequest struct { @@ -9159,7 +9296,7 @@ type MountUnregisterRequest struct { func (x *MountUnregisterRequest) Reset() { *x = MountUnregisterRequest{} - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9171,7 +9308,7 @@ func (x *MountUnregisterRequest) String() string { func (*MountUnregisterRequest) ProtoMessage() {} func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9184,7 +9321,7 @@ func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterRequest.ProtoReflect.Descriptor instead. func (*MountUnregisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{145} + return file_vtctldata_proto_rawDescGZIP(), []int{147} } func (x *MountUnregisterRequest) GetName() string { @@ -9202,7 +9339,7 @@ type MountUnregisterResponse struct { func (x *MountUnregisterResponse) Reset() { *x = MountUnregisterResponse{} - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9214,7 +9351,7 @@ func (x *MountUnregisterResponse) String() string { func (*MountUnregisterResponse) ProtoMessage() {} func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9227,7 +9364,7 @@ func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterResponse.ProtoReflect.Descriptor instead. func (*MountUnregisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{146} + return file_vtctldata_proto_rawDescGZIP(), []int{148} } type MountShowRequest struct { @@ -9240,7 +9377,7 @@ type MountShowRequest struct { func (x *MountShowRequest) Reset() { *x = MountShowRequest{} - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9252,7 +9389,7 @@ func (x *MountShowRequest) String() string { func (*MountShowRequest) ProtoMessage() {} func (x *MountShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9265,7 +9402,7 @@ func (x *MountShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowRequest.ProtoReflect.Descriptor instead. func (*MountShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{147} + return file_vtctldata_proto_rawDescGZIP(), []int{149} } func (x *MountShowRequest) GetName() string { @@ -9288,7 +9425,7 @@ type MountShowResponse struct { func (x *MountShowResponse) Reset() { *x = MountShowResponse{} - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9300,7 +9437,7 @@ func (x *MountShowResponse) String() string { func (*MountShowResponse) ProtoMessage() {} func (x *MountShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9313,7 +9450,7 @@ func (x *MountShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowResponse.ProtoReflect.Descriptor instead. func (*MountShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{148} + return file_vtctldata_proto_rawDescGZIP(), []int{150} } func (x *MountShowResponse) GetTopoType() string { @@ -9352,7 +9489,7 @@ type MountListRequest struct { func (x *MountListRequest) Reset() { *x = MountListRequest{} - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9364,7 +9501,7 @@ func (x *MountListRequest) String() string { func (*MountListRequest) ProtoMessage() {} func (x *MountListRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9377,7 +9514,7 @@ func (x *MountListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListRequest.ProtoReflect.Descriptor instead. func (*MountListRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{149} + return file_vtctldata_proto_rawDescGZIP(), []int{151} } type MountListResponse struct { @@ -9390,7 +9527,7 @@ type MountListResponse struct { func (x *MountListResponse) Reset() { *x = MountListResponse{} - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9402,7 +9539,7 @@ func (x *MountListResponse) String() string { func (*MountListResponse) ProtoMessage() {} func (x *MountListResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9415,7 +9552,7 @@ func (x *MountListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListResponse.ProtoReflect.Descriptor instead. func (*MountListResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{150} + return file_vtctldata_proto_rawDescGZIP(), []int{152} } func (x *MountListResponse) GetNames() []string { @@ -9465,7 +9602,7 @@ type MoveTablesCreateRequest struct { func (x *MoveTablesCreateRequest) Reset() { *x = MoveTablesCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9477,7 +9614,7 @@ func (x *MoveTablesCreateRequest) String() string { func (*MoveTablesCreateRequest) ProtoMessage() {} func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9490,7 +9627,7 @@ func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{151} + return file_vtctldata_proto_rawDescGZIP(), []int{153} } func (x *MoveTablesCreateRequest) GetWorkflow() string { @@ -9644,7 +9781,7 @@ type MoveTablesCreateResponse struct { func (x *MoveTablesCreateResponse) Reset() { *x = MoveTablesCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9656,7 +9793,7 @@ func (x *MoveTablesCreateResponse) String() string { func (*MoveTablesCreateResponse) ProtoMessage() {} func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9669,7 +9806,7 @@ func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152} + return file_vtctldata_proto_rawDescGZIP(), []int{154} } func (x *MoveTablesCreateResponse) GetSummary() string { @@ -9702,7 +9839,7 @@ type MoveTablesCompleteRequest struct { func (x *MoveTablesCompleteRequest) Reset() { *x = MoveTablesCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9714,7 +9851,7 @@ func (x *MoveTablesCompleteRequest) String() string { func (*MoveTablesCompleteRequest) ProtoMessage() {} func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9727,7 +9864,7 @@ func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{153} + return file_vtctldata_proto_rawDescGZIP(), []int{155} } func (x *MoveTablesCompleteRequest) GetWorkflow() string { @@ -9790,7 +9927,7 @@ type MoveTablesCompleteResponse struct { func (x *MoveTablesCompleteResponse) Reset() { *x = MoveTablesCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9802,7 +9939,7 @@ func (x *MoveTablesCompleteResponse) String() string { func (*MoveTablesCompleteResponse) ProtoMessage() {} func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9815,7 +9952,7 @@ func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{154} + return file_vtctldata_proto_rawDescGZIP(), []int{156} } func (x *MoveTablesCompleteResponse) GetSummary() string { @@ -9842,7 +9979,7 @@ type PingTabletRequest struct { func (x *PingTabletRequest) Reset() { *x = PingTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9854,7 +9991,7 @@ func (x *PingTabletRequest) String() string { func (*PingTabletRequest) ProtoMessage() {} func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9867,7 +10004,7 @@ func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. func (*PingTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{155} + return file_vtctldata_proto_rawDescGZIP(), []int{157} } func (x *PingTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -9885,7 +10022,7 @@ type PingTabletResponse struct { func (x *PingTabletResponse) Reset() { *x = PingTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9897,7 +10034,7 @@ func (x *PingTabletResponse) String() string { func (*PingTabletResponse) ProtoMessage() {} func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9910,7 +10047,7 @@ func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. func (*PingTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{156} + return file_vtctldata_proto_rawDescGZIP(), []int{158} } type PlannedReparentShardRequest struct { @@ -9953,7 +10090,7 @@ type PlannedReparentShardRequest struct { func (x *PlannedReparentShardRequest) Reset() { *x = PlannedReparentShardRequest{} - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9965,7 +10102,7 @@ func (x *PlannedReparentShardRequest) String() string { func (*PlannedReparentShardRequest) ProtoMessage() {} func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9978,7 +10115,7 @@ func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardRequest.ProtoReflect.Descriptor instead. func (*PlannedReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{157} + return file_vtctldata_proto_rawDescGZIP(), []int{159} } func (x *PlannedReparentShardRequest) GetKeyspace() string { @@ -10056,7 +10193,7 @@ type PlannedReparentShardResponse struct { func (x *PlannedReparentShardResponse) Reset() { *x = PlannedReparentShardResponse{} - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10068,7 +10205,7 @@ func (x *PlannedReparentShardResponse) String() string { func (*PlannedReparentShardResponse) ProtoMessage() {} func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10081,7 +10218,7 @@ func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardResponse.ProtoReflect.Descriptor instead. func (*PlannedReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{158} + return file_vtctldata_proto_rawDescGZIP(), []int{160} } func (x *PlannedReparentShardResponse) GetKeyspace() string { @@ -10126,7 +10263,7 @@ type RebuildKeyspaceGraphRequest struct { func (x *RebuildKeyspaceGraphRequest) Reset() { *x = RebuildKeyspaceGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10138,7 +10275,7 @@ func (x *RebuildKeyspaceGraphRequest) String() string { func (*RebuildKeyspaceGraphRequest) ProtoMessage() {} func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10151,7 +10288,7 @@ func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{159} + return file_vtctldata_proto_rawDescGZIP(), []int{161} } func (x *RebuildKeyspaceGraphRequest) GetKeyspace() string { @@ -10183,7 +10320,7 @@ type RebuildKeyspaceGraphResponse struct { func (x *RebuildKeyspaceGraphResponse) Reset() { *x = RebuildKeyspaceGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10195,7 +10332,7 @@ func (x *RebuildKeyspaceGraphResponse) String() string { func (*RebuildKeyspaceGraphResponse) ProtoMessage() {} func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10208,7 +10345,7 @@ func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{160} + return file_vtctldata_proto_rawDescGZIP(), []int{162} } type RebuildVSchemaGraphRequest struct { @@ -10223,7 +10360,7 @@ type RebuildVSchemaGraphRequest struct { func (x *RebuildVSchemaGraphRequest) Reset() { *x = RebuildVSchemaGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10235,7 +10372,7 @@ func (x *RebuildVSchemaGraphRequest) String() string { func (*RebuildVSchemaGraphRequest) ProtoMessage() {} func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10248,7 +10385,7 @@ func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{161} + return file_vtctldata_proto_rawDescGZIP(), []int{163} } func (x *RebuildVSchemaGraphRequest) GetCells() []string { @@ -10266,7 +10403,7 @@ type RebuildVSchemaGraphResponse struct { func (x *RebuildVSchemaGraphResponse) Reset() { *x = RebuildVSchemaGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10278,7 +10415,7 @@ func (x *RebuildVSchemaGraphResponse) String() string { func (*RebuildVSchemaGraphResponse) ProtoMessage() {} func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10291,7 +10428,7 @@ func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{162} + return file_vtctldata_proto_rawDescGZIP(), []int{164} } type RefreshStateRequest struct { @@ -10304,7 +10441,7 @@ type RefreshStateRequest struct { func (x *RefreshStateRequest) Reset() { *x = RefreshStateRequest{} - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10316,7 +10453,7 @@ func (x *RefreshStateRequest) String() string { func (*RefreshStateRequest) ProtoMessage() {} func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10329,7 +10466,7 @@ func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateRequest.ProtoReflect.Descriptor instead. func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{163} + return file_vtctldata_proto_rawDescGZIP(), []int{165} } func (x *RefreshStateRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10347,7 +10484,7 @@ type RefreshStateResponse struct { func (x *RefreshStateResponse) Reset() { *x = RefreshStateResponse{} - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10359,7 +10496,7 @@ func (x *RefreshStateResponse) String() string { func (*RefreshStateResponse) ProtoMessage() {} func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10372,7 +10509,7 @@ func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateResponse.ProtoReflect.Descriptor instead. func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{164} + return file_vtctldata_proto_rawDescGZIP(), []int{166} } type RefreshStateByShardRequest struct { @@ -10387,7 +10524,7 @@ type RefreshStateByShardRequest struct { func (x *RefreshStateByShardRequest) Reset() { *x = RefreshStateByShardRequest{} - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10399,7 +10536,7 @@ func (x *RefreshStateByShardRequest) String() string { func (*RefreshStateByShardRequest) ProtoMessage() {} func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10412,7 +10549,7 @@ func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardRequest.ProtoReflect.Descriptor instead. func (*RefreshStateByShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{165} + return file_vtctldata_proto_rawDescGZIP(), []int{167} } func (x *RefreshStateByShardRequest) GetKeyspace() string { @@ -10448,7 +10585,7 @@ type RefreshStateByShardResponse struct { func (x *RefreshStateByShardResponse) Reset() { *x = RefreshStateByShardResponse{} - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10460,7 +10597,7 @@ func (x *RefreshStateByShardResponse) String() string { func (*RefreshStateByShardResponse) ProtoMessage() {} func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[168] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10473,7 +10610,7 @@ func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardResponse.ProtoReflect.Descriptor instead. func (*RefreshStateByShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{166} + return file_vtctldata_proto_rawDescGZIP(), []int{168} } func (x *RefreshStateByShardResponse) GetIsPartialRefresh() bool { @@ -10500,7 +10637,7 @@ type ReloadSchemaRequest struct { func (x *ReloadSchemaRequest) Reset() { *x = ReloadSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10512,7 +10649,7 @@ func (x *ReloadSchemaRequest) String() string { func (*ReloadSchemaRequest) ProtoMessage() {} func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10525,7 +10662,7 @@ func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{167} + return file_vtctldata_proto_rawDescGZIP(), []int{169} } func (x *ReloadSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10543,7 +10680,7 @@ type ReloadSchemaResponse struct { func (x *ReloadSchemaResponse) Reset() { *x = ReloadSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10555,7 +10692,7 @@ func (x *ReloadSchemaResponse) String() string { func (*ReloadSchemaResponse) ProtoMessage() {} func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[170] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10568,7 +10705,7 @@ func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{168} + return file_vtctldata_proto_rawDescGZIP(), []int{170} } type ReloadSchemaKeyspaceRequest struct { @@ -10587,7 +10724,7 @@ type ReloadSchemaKeyspaceRequest struct { func (x *ReloadSchemaKeyspaceRequest) Reset() { *x = ReloadSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10599,7 +10736,7 @@ func (x *ReloadSchemaKeyspaceRequest) String() string { func (*ReloadSchemaKeyspaceRequest) ProtoMessage() {} func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[171] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10612,7 +10749,7 @@ func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{169} + return file_vtctldata_proto_rawDescGZIP(), []int{171} } func (x *ReloadSchemaKeyspaceRequest) GetKeyspace() string { @@ -10653,7 +10790,7 @@ type ReloadSchemaKeyspaceResponse struct { func (x *ReloadSchemaKeyspaceResponse) Reset() { *x = ReloadSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10665,7 +10802,7 @@ func (x *ReloadSchemaKeyspaceResponse) String() string { func (*ReloadSchemaKeyspaceResponse) ProtoMessage() {} func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10678,7 +10815,7 @@ func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{170} + return file_vtctldata_proto_rawDescGZIP(), []int{172} } func (x *ReloadSchemaKeyspaceResponse) GetEvents() []*logutil.Event { @@ -10703,7 +10840,7 @@ type ReloadSchemaShardRequest struct { func (x *ReloadSchemaShardRequest) Reset() { *x = ReloadSchemaShardRequest{} - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10715,7 +10852,7 @@ func (x *ReloadSchemaShardRequest) String() string { func (*ReloadSchemaShardRequest) ProtoMessage() {} func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10728,7 +10865,7 @@ func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{171} + return file_vtctldata_proto_rawDescGZIP(), []int{173} } func (x *ReloadSchemaShardRequest) GetKeyspace() string { @@ -10776,7 +10913,7 @@ type ReloadSchemaShardResponse struct { func (x *ReloadSchemaShardResponse) Reset() { *x = ReloadSchemaShardResponse{} - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10788,7 +10925,7 @@ func (x *ReloadSchemaShardResponse) String() string { func (*ReloadSchemaShardResponse) ProtoMessage() {} func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[174] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10801,7 +10938,7 @@ func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{172} + return file_vtctldata_proto_rawDescGZIP(), []int{174} } func (x *ReloadSchemaShardResponse) GetEvents() []*logutil.Event { @@ -10823,7 +10960,7 @@ type RemoveBackupRequest struct { func (x *RemoveBackupRequest) Reset() { *x = RemoveBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10835,7 +10972,7 @@ func (x *RemoveBackupRequest) String() string { func (*RemoveBackupRequest) ProtoMessage() {} func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10848,7 +10985,7 @@ func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupRequest.ProtoReflect.Descriptor instead. func (*RemoveBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{173} + return file_vtctldata_proto_rawDescGZIP(), []int{175} } func (x *RemoveBackupRequest) GetKeyspace() string { @@ -10880,7 +11017,7 @@ type RemoveBackupResponse struct { func (x *RemoveBackupResponse) Reset() { *x = RemoveBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10892,7 +11029,7 @@ func (x *RemoveBackupResponse) String() string { func (*RemoveBackupResponse) ProtoMessage() {} func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10905,7 +11042,7 @@ func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupResponse.ProtoReflect.Descriptor instead. func (*RemoveBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{174} + return file_vtctldata_proto_rawDescGZIP(), []int{176} } type RemoveKeyspaceCellRequest struct { @@ -10926,7 +11063,7 @@ type RemoveKeyspaceCellRequest struct { func (x *RemoveKeyspaceCellRequest) Reset() { *x = RemoveKeyspaceCellRequest{} - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10938,7 +11075,7 @@ func (x *RemoveKeyspaceCellRequest) String() string { func (*RemoveKeyspaceCellRequest) ProtoMessage() {} func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10951,7 +11088,7 @@ func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellRequest.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{175} + return file_vtctldata_proto_rawDescGZIP(), []int{177} } func (x *RemoveKeyspaceCellRequest) GetKeyspace() string { @@ -10990,7 +11127,7 @@ type RemoveKeyspaceCellResponse struct { func (x *RemoveKeyspaceCellResponse) Reset() { *x = RemoveKeyspaceCellResponse{} - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11002,7 +11139,7 @@ func (x *RemoveKeyspaceCellResponse) String() string { func (*RemoveKeyspaceCellResponse) ProtoMessage() {} func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11015,7 +11152,7 @@ func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellResponse.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{176} + return file_vtctldata_proto_rawDescGZIP(), []int{178} } type RemoveShardCellRequest struct { @@ -11037,7 +11174,7 @@ type RemoveShardCellRequest struct { func (x *RemoveShardCellRequest) Reset() { *x = RemoveShardCellRequest{} - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11049,7 +11186,7 @@ func (x *RemoveShardCellRequest) String() string { func (*RemoveShardCellRequest) ProtoMessage() {} func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11062,7 +11199,7 @@ func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellRequest.ProtoReflect.Descriptor instead. func (*RemoveShardCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{177} + return file_vtctldata_proto_rawDescGZIP(), []int{179} } func (x *RemoveShardCellRequest) GetKeyspace() string { @@ -11108,7 +11245,7 @@ type RemoveShardCellResponse struct { func (x *RemoveShardCellResponse) Reset() { *x = RemoveShardCellResponse{} - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11120,7 +11257,7 @@ func (x *RemoveShardCellResponse) String() string { func (*RemoveShardCellResponse) ProtoMessage() {} func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11133,7 +11270,7 @@ func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellResponse.ProtoReflect.Descriptor instead. func (*RemoveShardCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{178} + return file_vtctldata_proto_rawDescGZIP(), []int{180} } type ReparentTabletRequest struct { @@ -11148,7 +11285,7 @@ type ReparentTabletRequest struct { func (x *ReparentTabletRequest) Reset() { *x = ReparentTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11160,7 +11297,7 @@ func (x *ReparentTabletRequest) String() string { func (*ReparentTabletRequest) ProtoMessage() {} func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11173,7 +11310,7 @@ func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletRequest.ProtoReflect.Descriptor instead. func (*ReparentTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{179} + return file_vtctldata_proto_rawDescGZIP(), []int{181} } func (x *ReparentTabletRequest) GetTablet() *topodata.TabletAlias { @@ -11198,7 +11335,7 @@ type ReparentTabletResponse struct { func (x *ReparentTabletResponse) Reset() { *x = ReparentTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11210,7 +11347,7 @@ func (x *ReparentTabletResponse) String() string { func (*ReparentTabletResponse) ProtoMessage() {} func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11223,7 +11360,7 @@ func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletResponse.ProtoReflect.Descriptor instead. func (*ReparentTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{180} + return file_vtctldata_proto_rawDescGZIP(), []int{182} } func (x *ReparentTabletResponse) GetKeyspace() string { @@ -11275,7 +11412,7 @@ type ReshardCreateRequest struct { func (x *ReshardCreateRequest) Reset() { *x = ReshardCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11287,7 +11424,7 @@ func (x *ReshardCreateRequest) String() string { func (*ReshardCreateRequest) ProtoMessage() {} func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11300,7 +11437,7 @@ func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReshardCreateRequest.ProtoReflect.Descriptor instead. func (*ReshardCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{181} + return file_vtctldata_proto_rawDescGZIP(), []int{183} } func (x *ReshardCreateRequest) GetWorkflow() string { @@ -11418,7 +11555,7 @@ type RestoreFromBackupRequest struct { func (x *RestoreFromBackupRequest) Reset() { *x = RestoreFromBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11430,7 +11567,7 @@ func (x *RestoreFromBackupRequest) String() string { func (*RestoreFromBackupRequest) ProtoMessage() {} func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11443,7 +11580,7 @@ func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupRequest.ProtoReflect.Descriptor instead. func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{182} + return file_vtctldata_proto_rawDescGZIP(), []int{184} } func (x *RestoreFromBackupRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11502,7 +11639,7 @@ type RestoreFromBackupResponse struct { func (x *RestoreFromBackupResponse) Reset() { *x = RestoreFromBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11514,7 +11651,7 @@ func (x *RestoreFromBackupResponse) String() string { func (*RestoreFromBackupResponse) ProtoMessage() {} func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11527,7 +11664,7 @@ func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupResponse.ProtoReflect.Descriptor instead. func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{183} + return file_vtctldata_proto_rawDescGZIP(), []int{185} } func (x *RestoreFromBackupResponse) GetTabletAlias() *topodata.TabletAlias { @@ -11569,7 +11706,7 @@ type RetrySchemaMigrationRequest struct { func (x *RetrySchemaMigrationRequest) Reset() { *x = RetrySchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11581,7 +11718,7 @@ func (x *RetrySchemaMigrationRequest) String() string { func (*RetrySchemaMigrationRequest) ProtoMessage() {} func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11594,7 +11731,7 @@ func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{184} + return file_vtctldata_proto_rawDescGZIP(), []int{186} } func (x *RetrySchemaMigrationRequest) GetKeyspace() string { @@ -11621,7 +11758,7 @@ type RetrySchemaMigrationResponse struct { func (x *RetrySchemaMigrationResponse) Reset() { *x = RetrySchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11633,7 +11770,7 @@ func (x *RetrySchemaMigrationResponse) String() string { func (*RetrySchemaMigrationResponse) ProtoMessage() {} func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11646,7 +11783,7 @@ func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{185} + return file_vtctldata_proto_rawDescGZIP(), []int{187} } func (x *RetrySchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -11666,7 +11803,7 @@ type RunHealthCheckRequest struct { func (x *RunHealthCheckRequest) Reset() { *x = RunHealthCheckRequest{} - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11678,7 +11815,7 @@ func (x *RunHealthCheckRequest) String() string { func (*RunHealthCheckRequest) ProtoMessage() {} func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11691,7 +11828,7 @@ func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckRequest.ProtoReflect.Descriptor instead. func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{186} + return file_vtctldata_proto_rawDescGZIP(), []int{188} } func (x *RunHealthCheckRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11709,7 +11846,7 @@ type RunHealthCheckResponse struct { func (x *RunHealthCheckResponse) Reset() { *x = RunHealthCheckResponse{} - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11721,7 +11858,7 @@ func (x *RunHealthCheckResponse) String() string { func (*RunHealthCheckResponse) ProtoMessage() {} func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[189] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11734,7 +11871,7 @@ func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckResponse.ProtoReflect.Descriptor instead. func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{187} + return file_vtctldata_proto_rawDescGZIP(), []int{189} } type SetKeyspaceDurabilityPolicyRequest struct { @@ -11748,7 +11885,7 @@ type SetKeyspaceDurabilityPolicyRequest struct { func (x *SetKeyspaceDurabilityPolicyRequest) Reset() { *x = SetKeyspaceDurabilityPolicyRequest{} - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11760,7 +11897,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) String() string { func (*SetKeyspaceDurabilityPolicyRequest) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11773,7 +11910,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message // Deprecated: Use SetKeyspaceDurabilityPolicyRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{188} + return file_vtctldata_proto_rawDescGZIP(), []int{190} } func (x *SetKeyspaceDurabilityPolicyRequest) GetKeyspace() string { @@ -11801,7 +11938,7 @@ type SetKeyspaceDurabilityPolicyResponse struct { func (x *SetKeyspaceDurabilityPolicyResponse) Reset() { *x = SetKeyspaceDurabilityPolicyResponse{} - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11813,7 +11950,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) String() string { func (*SetKeyspaceDurabilityPolicyResponse) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11826,7 +11963,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use SetKeyspaceDurabilityPolicyResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{189} + return file_vtctldata_proto_rawDescGZIP(), []int{191} } func (x *SetKeyspaceDurabilityPolicyResponse) GetKeyspace() *topodata.Keyspace { @@ -11847,7 +11984,7 @@ type SetKeyspaceShardingInfoRequest struct { func (x *SetKeyspaceShardingInfoRequest) Reset() { *x = SetKeyspaceShardingInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11859,7 +11996,7 @@ func (x *SetKeyspaceShardingInfoRequest) String() string { func (*SetKeyspaceShardingInfoRequest) ProtoMessage() {} func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11872,7 +12009,7 @@ func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{190} + return file_vtctldata_proto_rawDescGZIP(), []int{192} } func (x *SetKeyspaceShardingInfoRequest) GetKeyspace() string { @@ -11900,7 +12037,7 @@ type SetKeyspaceShardingInfoResponse struct { func (x *SetKeyspaceShardingInfoResponse) Reset() { *x = SetKeyspaceShardingInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11912,7 +12049,7 @@ func (x *SetKeyspaceShardingInfoResponse) String() string { func (*SetKeyspaceShardingInfoResponse) ProtoMessage() {} func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[193] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11925,7 +12062,7 @@ func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{191} + return file_vtctldata_proto_rawDescGZIP(), []int{193} } func (x *SetKeyspaceShardingInfoResponse) GetKeyspace() *topodata.Keyspace { @@ -11947,7 +12084,7 @@ type SetShardIsPrimaryServingRequest struct { func (x *SetShardIsPrimaryServingRequest) Reset() { *x = SetShardIsPrimaryServingRequest{} - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11959,7 +12096,7 @@ func (x *SetShardIsPrimaryServingRequest) String() string { func (*SetShardIsPrimaryServingRequest) ProtoMessage() {} func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[194] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11972,7 +12109,7 @@ func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingRequest.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{192} + return file_vtctldata_proto_rawDescGZIP(), []int{194} } func (x *SetShardIsPrimaryServingRequest) GetKeyspace() string { @@ -12007,7 +12144,7 @@ type SetShardIsPrimaryServingResponse struct { func (x *SetShardIsPrimaryServingResponse) Reset() { *x = SetShardIsPrimaryServingResponse{} - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12019,7 +12156,7 @@ func (x *SetShardIsPrimaryServingResponse) String() string { func (*SetShardIsPrimaryServingResponse) ProtoMessage() {} func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[195] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12032,7 +12169,7 @@ func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingResponse.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{193} + return file_vtctldata_proto_rawDescGZIP(), []int{195} } func (x *SetShardIsPrimaryServingResponse) GetShard() *topodata.Shard { @@ -12072,7 +12209,7 @@ type SetShardTabletControlRequest struct { func (x *SetShardTabletControlRequest) Reset() { *x = SetShardTabletControlRequest{} - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12084,7 +12221,7 @@ func (x *SetShardTabletControlRequest) String() string { func (*SetShardTabletControlRequest) ProtoMessage() {} func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[196] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12097,7 +12234,7 @@ func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlRequest.ProtoReflect.Descriptor instead. func (*SetShardTabletControlRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{194} + return file_vtctldata_proto_rawDescGZIP(), []int{196} } func (x *SetShardTabletControlRequest) GetKeyspace() string { @@ -12160,7 +12297,7 @@ type SetShardTabletControlResponse struct { func (x *SetShardTabletControlResponse) Reset() { *x = SetShardTabletControlResponse{} - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12172,7 +12309,7 @@ func (x *SetShardTabletControlResponse) String() string { func (*SetShardTabletControlResponse) ProtoMessage() {} func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[197] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12185,7 +12322,7 @@ func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlResponse.ProtoReflect.Descriptor instead. func (*SetShardTabletControlResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{195} + return file_vtctldata_proto_rawDescGZIP(), []int{197} } func (x *SetShardTabletControlResponse) GetShard() *topodata.Shard { @@ -12206,7 +12343,7 @@ type SetWritableRequest struct { func (x *SetWritableRequest) Reset() { *x = SetWritableRequest{} - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12218,7 +12355,7 @@ func (x *SetWritableRequest) String() string { func (*SetWritableRequest) ProtoMessage() {} func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[198] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12231,7 +12368,7 @@ func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableRequest.ProtoReflect.Descriptor instead. func (*SetWritableRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{196} + return file_vtctldata_proto_rawDescGZIP(), []int{198} } func (x *SetWritableRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12256,7 +12393,7 @@ type SetWritableResponse struct { func (x *SetWritableResponse) Reset() { *x = SetWritableResponse{} - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12268,7 +12405,7 @@ func (x *SetWritableResponse) String() string { func (*SetWritableResponse) ProtoMessage() {} func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[199] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12281,7 +12418,7 @@ func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableResponse.ProtoReflect.Descriptor instead. func (*SetWritableResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{197} + return file_vtctldata_proto_rawDescGZIP(), []int{199} } type ShardReplicationAddRequest struct { @@ -12296,7 +12433,7 @@ type ShardReplicationAddRequest struct { func (x *ShardReplicationAddRequest) Reset() { *x = ShardReplicationAddRequest{} - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12308,7 +12445,7 @@ func (x *ShardReplicationAddRequest) String() string { func (*ShardReplicationAddRequest) ProtoMessage() {} func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[200] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12321,7 +12458,7 @@ func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{198} + return file_vtctldata_proto_rawDescGZIP(), []int{200} } func (x *ShardReplicationAddRequest) GetKeyspace() string { @@ -12353,7 +12490,7 @@ type ShardReplicationAddResponse struct { func (x *ShardReplicationAddResponse) Reset() { *x = ShardReplicationAddResponse{} - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12365,7 +12502,7 @@ func (x *ShardReplicationAddResponse) String() string { func (*ShardReplicationAddResponse) ProtoMessage() {} func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[201] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12378,7 +12515,7 @@ func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{199} + return file_vtctldata_proto_rawDescGZIP(), []int{201} } type ShardReplicationFixRequest struct { @@ -12393,7 +12530,7 @@ type ShardReplicationFixRequest struct { func (x *ShardReplicationFixRequest) Reset() { *x = ShardReplicationFixRequest{} - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12405,7 +12542,7 @@ func (x *ShardReplicationFixRequest) String() string { func (*ShardReplicationFixRequest) ProtoMessage() {} func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[202] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12418,7 +12555,7 @@ func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationFixRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{200} + return file_vtctldata_proto_rawDescGZIP(), []int{202} } func (x *ShardReplicationFixRequest) GetKeyspace() string { @@ -12455,7 +12592,7 @@ type ShardReplicationFixResponse struct { func (x *ShardReplicationFixResponse) Reset() { *x = ShardReplicationFixResponse{} - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12467,7 +12604,7 @@ func (x *ShardReplicationFixResponse) String() string { func (*ShardReplicationFixResponse) ProtoMessage() {} func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[203] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12480,7 +12617,7 @@ func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationFixResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{201} + return file_vtctldata_proto_rawDescGZIP(), []int{203} } func (x *ShardReplicationFixResponse) GetError() *topodata.ShardReplicationError { @@ -12501,7 +12638,7 @@ type ShardReplicationPositionsRequest struct { func (x *ShardReplicationPositionsRequest) Reset() { *x = ShardReplicationPositionsRequest{} - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12513,7 +12650,7 @@ func (x *ShardReplicationPositionsRequest) String() string { func (*ShardReplicationPositionsRequest) ProtoMessage() {} func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[204] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12526,7 +12663,7 @@ func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationPositionsRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{202} + return file_vtctldata_proto_rawDescGZIP(), []int{204} } func (x *ShardReplicationPositionsRequest) GetKeyspace() string { @@ -12558,7 +12695,7 @@ type ShardReplicationPositionsResponse struct { func (x *ShardReplicationPositionsResponse) Reset() { *x = ShardReplicationPositionsResponse{} - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12570,7 +12707,7 @@ func (x *ShardReplicationPositionsResponse) String() string { func (*ShardReplicationPositionsResponse) ProtoMessage() {} func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[205] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12583,7 +12720,7 @@ func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ShardReplicationPositionsResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{203} + return file_vtctldata_proto_rawDescGZIP(), []int{205} } func (x *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string]*replicationdata.Status { @@ -12612,7 +12749,7 @@ type ShardReplicationRemoveRequest struct { func (x *ShardReplicationRemoveRequest) Reset() { *x = ShardReplicationRemoveRequest{} - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12624,7 +12761,7 @@ func (x *ShardReplicationRemoveRequest) String() string { func (*ShardReplicationRemoveRequest) ProtoMessage() {} func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[206] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12637,7 +12774,7 @@ func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{204} + return file_vtctldata_proto_rawDescGZIP(), []int{206} } func (x *ShardReplicationRemoveRequest) GetKeyspace() string { @@ -12669,7 +12806,7 @@ type ShardReplicationRemoveResponse struct { func (x *ShardReplicationRemoveResponse) Reset() { *x = ShardReplicationRemoveResponse{} - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12681,7 +12818,7 @@ func (x *ShardReplicationRemoveResponse) String() string { func (*ShardReplicationRemoveResponse) ProtoMessage() {} func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[207] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12694,7 +12831,7 @@ func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{205} + return file_vtctldata_proto_rawDescGZIP(), []int{207} } type SleepTabletRequest struct { @@ -12708,7 +12845,7 @@ type SleepTabletRequest struct { func (x *SleepTabletRequest) Reset() { *x = SleepTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12720,7 +12857,7 @@ func (x *SleepTabletRequest) String() string { func (*SleepTabletRequest) ProtoMessage() {} func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[208] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12733,7 +12870,7 @@ func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletRequest.ProtoReflect.Descriptor instead. func (*SleepTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{206} + return file_vtctldata_proto_rawDescGZIP(), []int{208} } func (x *SleepTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12758,7 +12895,7 @@ type SleepTabletResponse struct { func (x *SleepTabletResponse) Reset() { *x = SleepTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12770,7 +12907,7 @@ func (x *SleepTabletResponse) String() string { func (*SleepTabletResponse) ProtoMessage() {} func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[209] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12783,7 +12920,7 @@ func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletResponse.ProtoReflect.Descriptor instead. func (*SleepTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{207} + return file_vtctldata_proto_rawDescGZIP(), []int{209} } type SourceShardAddRequest struct { @@ -12806,7 +12943,7 @@ type SourceShardAddRequest struct { func (x *SourceShardAddRequest) Reset() { *x = SourceShardAddRequest{} - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12818,7 +12955,7 @@ func (x *SourceShardAddRequest) String() string { func (*SourceShardAddRequest) ProtoMessage() {} func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[210] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12831,7 +12968,7 @@ func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddRequest.ProtoReflect.Descriptor instead. func (*SourceShardAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{208} + return file_vtctldata_proto_rawDescGZIP(), []int{210} } func (x *SourceShardAddRequest) GetKeyspace() string { @@ -12894,7 +13031,7 @@ type SourceShardAddResponse struct { func (x *SourceShardAddResponse) Reset() { *x = SourceShardAddResponse{} - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12906,7 +13043,7 @@ func (x *SourceShardAddResponse) String() string { func (*SourceShardAddResponse) ProtoMessage() {} func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[211] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12919,7 +13056,7 @@ func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddResponse.ProtoReflect.Descriptor instead. func (*SourceShardAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{209} + return file_vtctldata_proto_rawDescGZIP(), []int{211} } func (x *SourceShardAddResponse) GetShard() *topodata.Shard { @@ -12941,7 +13078,7 @@ type SourceShardDeleteRequest struct { func (x *SourceShardDeleteRequest) Reset() { *x = SourceShardDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12953,7 +13090,7 @@ func (x *SourceShardDeleteRequest) String() string { func (*SourceShardDeleteRequest) ProtoMessage() {} func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[212] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12966,7 +13103,7 @@ func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteRequest.ProtoReflect.Descriptor instead. func (*SourceShardDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{210} + return file_vtctldata_proto_rawDescGZIP(), []int{212} } func (x *SourceShardDeleteRequest) GetKeyspace() string { @@ -13001,7 +13138,7 @@ type SourceShardDeleteResponse struct { func (x *SourceShardDeleteResponse) Reset() { *x = SourceShardDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13013,7 +13150,7 @@ func (x *SourceShardDeleteResponse) String() string { func (*SourceShardDeleteResponse) ProtoMessage() {} func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[213] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13026,7 +13163,7 @@ func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteResponse.ProtoReflect.Descriptor instead. func (*SourceShardDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{211} + return file_vtctldata_proto_rawDescGZIP(), []int{213} } func (x *SourceShardDeleteResponse) GetShard() *topodata.Shard { @@ -13046,7 +13183,7 @@ type StartReplicationRequest struct { func (x *StartReplicationRequest) Reset() { *x = StartReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13058,7 +13195,7 @@ func (x *StartReplicationRequest) String() string { func (*StartReplicationRequest) ProtoMessage() {} func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[214] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13071,7 +13208,7 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. func (*StartReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{212} + return file_vtctldata_proto_rawDescGZIP(), []int{214} } func (x *StartReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13089,7 +13226,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13101,7 +13238,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[215] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13114,7 +13251,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{213} + return file_vtctldata_proto_rawDescGZIP(), []int{215} } type StopReplicationRequest struct { @@ -13127,7 +13264,7 @@ type StopReplicationRequest struct { func (x *StopReplicationRequest) Reset() { *x = StopReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13139,7 +13276,7 @@ func (x *StopReplicationRequest) String() string { func (*StopReplicationRequest) ProtoMessage() {} func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[216] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13152,7 +13289,7 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. func (*StopReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{214} + return file_vtctldata_proto_rawDescGZIP(), []int{216} } func (x *StopReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13170,7 +13307,7 @@ type StopReplicationResponse struct { func (x *StopReplicationResponse) Reset() { *x = StopReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13182,7 +13319,7 @@ func (x *StopReplicationResponse) String() string { func (*StopReplicationResponse) ProtoMessage() {} func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[217] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13195,7 +13332,7 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. func (*StopReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{215} + return file_vtctldata_proto_rawDescGZIP(), []int{217} } type TabletExternallyReparentedRequest struct { @@ -13210,7 +13347,7 @@ type TabletExternallyReparentedRequest struct { func (x *TabletExternallyReparentedRequest) Reset() { *x = TabletExternallyReparentedRequest{} - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13222,7 +13359,7 @@ func (x *TabletExternallyReparentedRequest) String() string { func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[218] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13235,7 +13372,7 @@ func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{216} + return file_vtctldata_proto_rawDescGZIP(), []int{218} } func (x *TabletExternallyReparentedRequest) GetTablet() *topodata.TabletAlias { @@ -13258,7 +13395,7 @@ type TabletExternallyReparentedResponse struct { func (x *TabletExternallyReparentedResponse) Reset() { *x = TabletExternallyReparentedResponse{} - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13270,7 +13407,7 @@ func (x *TabletExternallyReparentedResponse) String() string { func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[219] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13283,7 +13420,7 @@ func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedResponse.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{217} + return file_vtctldata_proto_rawDescGZIP(), []int{219} } func (x *TabletExternallyReparentedResponse) GetKeyspace() string { @@ -13325,7 +13462,7 @@ type UpdateCellInfoRequest struct { func (x *UpdateCellInfoRequest) Reset() { *x = UpdateCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13337,7 +13474,7 @@ func (x *UpdateCellInfoRequest) String() string { func (*UpdateCellInfoRequest) ProtoMessage() {} func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[220] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13350,7 +13487,7 @@ func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoRequest.ProtoReflect.Descriptor instead. func (*UpdateCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{218} + return file_vtctldata_proto_rawDescGZIP(), []int{220} } func (x *UpdateCellInfoRequest) GetName() string { @@ -13378,7 +13515,7 @@ type UpdateCellInfoResponse struct { func (x *UpdateCellInfoResponse) Reset() { *x = UpdateCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13390,7 +13527,7 @@ func (x *UpdateCellInfoResponse) String() string { func (*UpdateCellInfoResponse) ProtoMessage() {} func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[221] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13403,7 +13540,7 @@ func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoResponse.ProtoReflect.Descriptor instead. func (*UpdateCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{219} + return file_vtctldata_proto_rawDescGZIP(), []int{221} } func (x *UpdateCellInfoResponse) GetName() string { @@ -13431,7 +13568,7 @@ type UpdateCellsAliasRequest struct { func (x *UpdateCellsAliasRequest) Reset() { *x = UpdateCellsAliasRequest{} - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13443,7 +13580,7 @@ func (x *UpdateCellsAliasRequest) String() string { func (*UpdateCellsAliasRequest) ProtoMessage() {} func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[222] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13456,7 +13593,7 @@ func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasRequest.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{220} + return file_vtctldata_proto_rawDescGZIP(), []int{222} } func (x *UpdateCellsAliasRequest) GetName() string { @@ -13484,7 +13621,7 @@ type UpdateCellsAliasResponse struct { func (x *UpdateCellsAliasResponse) Reset() { *x = UpdateCellsAliasResponse{} - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13496,7 +13633,7 @@ func (x *UpdateCellsAliasResponse) String() string { func (*UpdateCellsAliasResponse) ProtoMessage() {} func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[223] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13509,7 +13646,7 @@ func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasResponse.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{221} + return file_vtctldata_proto_rawDescGZIP(), []int{223} } func (x *UpdateCellsAliasResponse) GetName() string { @@ -13536,7 +13673,7 @@ type ValidateRequest struct { func (x *ValidateRequest) Reset() { *x = ValidateRequest{} - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13548,7 +13685,7 @@ func (x *ValidateRequest) String() string { func (*ValidateRequest) ProtoMessage() {} func (x *ValidateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[224] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13561,7 +13698,7 @@ func (x *ValidateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. func (*ValidateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{222} + return file_vtctldata_proto_rawDescGZIP(), []int{224} } func (x *ValidateRequest) GetPingTablets() bool { @@ -13582,7 +13719,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13594,7 +13731,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[225] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13607,7 +13744,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{223} + return file_vtctldata_proto_rawDescGZIP(), []int{225} } func (x *ValidateResponse) GetResults() []string { @@ -13635,7 +13772,7 @@ type ValidateKeyspaceRequest struct { func (x *ValidateKeyspaceRequest) Reset() { *x = ValidateKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13647,7 +13784,7 @@ func (x *ValidateKeyspaceRequest) String() string { func (*ValidateKeyspaceRequest) ProtoMessage() {} func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[226] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13660,7 +13797,7 @@ func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{224} + return file_vtctldata_proto_rawDescGZIP(), []int{226} } func (x *ValidateKeyspaceRequest) GetKeyspace() string { @@ -13688,7 +13825,7 @@ type ValidateKeyspaceResponse struct { func (x *ValidateKeyspaceResponse) Reset() { *x = ValidateKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13700,7 +13837,7 @@ func (x *ValidateKeyspaceResponse) String() string { func (*ValidateKeyspaceResponse) ProtoMessage() {} func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[227] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13713,7 +13850,7 @@ func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{225} + return file_vtctldata_proto_rawDescGZIP(), []int{227} } func (x *ValidateKeyspaceResponse) GetResults() []string { @@ -13730,33 +13867,32 @@ func (x *ValidateKeyspaceResponse) GetResultsByShard() map[string]*ValidateShard return nil } -type ValidateSchemaKeyspaceRequest struct { +type ValidatePermissionsKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - ExcludeTables []string `protobuf:"bytes,2,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` - IncludeViews bool `protobuf:"varint,3,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` - SkipNoPrimary bool `protobuf:"varint,4,opt,name=skip_no_primary,json=skipNoPrimary,proto3" json:"skip_no_primary,omitempty"` - IncludeVschema bool `protobuf:"varint,5,opt,name=include_vschema,json=includeVschema,proto3" json:"include_vschema,omitempty"` + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + Shards []string `protobuf:"bytes,2,rep,name=shards,proto3" json:"shards,omitempty"` } -func (x *ValidateSchemaKeyspaceRequest) Reset() { - *x = ValidateSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[226] +func (x *ValidatePermissionsKeyspaceRequest) Reset() { + *x = ValidatePermissionsKeyspaceRequest{} + mi := &file_vtctldata_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ValidateSchemaKeyspaceRequest) String() string { +func (x *ValidatePermissionsKeyspaceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} +func (*ValidatePermissionsKeyspaceRequest) ProtoMessage() {} -func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[226] +func (x *ValidatePermissionsKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[228] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13767,58 +13903,160 @@ func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. -func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{226} +// Deprecated: Use ValidatePermissionsKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidatePermissionsKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{228} } -func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { +func (x *ValidatePermissionsKeyspaceRequest) GetKeyspace() string { if x != nil { return x.Keyspace } return "" } -func (x *ValidateSchemaKeyspaceRequest) GetExcludeTables() []string { +func (x *ValidatePermissionsKeyspaceRequest) GetShards() []string { if x != nil { - return x.ExcludeTables + return x.Shards } return nil } -func (x *ValidateSchemaKeyspaceRequest) GetIncludeViews() bool { - if x != nil { - return x.IncludeViews - } - return false +type ValidatePermissionsKeyspaceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (x *ValidateSchemaKeyspaceRequest) GetSkipNoPrimary() bool { - if x != nil { - return x.SkipNoPrimary - } - return false +func (x *ValidatePermissionsKeyspaceResponse) Reset() { + *x = ValidatePermissionsKeyspaceResponse{} + mi := &file_vtctldata_proto_msgTypes[229] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ValidateSchemaKeyspaceRequest) GetIncludeVschema() bool { - if x != nil { - return x.IncludeVschema - } - return false +func (x *ValidatePermissionsKeyspaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -type ValidateSchemaKeyspaceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (*ValidatePermissionsKeyspaceResponse) ProtoMessage() {} - Results []string `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +func (x *ValidatePermissionsKeyspaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[229] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePermissionsKeyspaceResponse.ProtoReflect.Descriptor instead. +func (*ValidatePermissionsKeyspaceResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{229} +} + +type ValidateSchemaKeyspaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + ExcludeTables []string `protobuf:"bytes,2,rep,name=exclude_tables,json=excludeTables,proto3" json:"exclude_tables,omitempty"` + IncludeViews bool `protobuf:"varint,3,opt,name=include_views,json=includeViews,proto3" json:"include_views,omitempty"` + SkipNoPrimary bool `protobuf:"varint,4,opt,name=skip_no_primary,json=skipNoPrimary,proto3" json:"skip_no_primary,omitempty"` + IncludeVschema bool `protobuf:"varint,5,opt,name=include_vschema,json=includeVschema,proto3" json:"include_vschema,omitempty"` + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + Shards []string `protobuf:"bytes,6,rep,name=shards,proto3" json:"shards,omitempty"` +} + +func (x *ValidateSchemaKeyspaceRequest) Reset() { + *x = ValidateSchemaKeyspaceRequest{} + mi := &file_vtctldata_proto_msgTypes[230] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ValidateSchemaKeyspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} + +func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[230] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{230} +} + +func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *ValidateSchemaKeyspaceRequest) GetExcludeTables() []string { + if x != nil { + return x.ExcludeTables + } + return nil +} + +func (x *ValidateSchemaKeyspaceRequest) GetIncludeViews() bool { + if x != nil { + return x.IncludeViews + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetSkipNoPrimary() bool { + if x != nil { + return x.SkipNoPrimary + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetIncludeVschema() bool { + if x != nil { + return x.IncludeVschema + } + return false +} + +func (x *ValidateSchemaKeyspaceRequest) GetShards() []string { + if x != nil { + return x.Shards + } + return nil +} + +type ValidateSchemaKeyspaceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []string `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` ResultsByShard map[string]*ValidateShardResponse `protobuf:"bytes,2,rep,name=results_by_shard,json=resultsByShard,proto3" json:"results_by_shard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ValidateSchemaKeyspaceResponse) Reset() { *x = ValidateSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13830,7 +14068,7 @@ func (x *ValidateSchemaKeyspaceResponse) String() string { func (*ValidateSchemaKeyspaceResponse) ProtoMessage() {} func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13843,7 +14081,7 @@ func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{227} + return file_vtctldata_proto_rawDescGZIP(), []int{231} } func (x *ValidateSchemaKeyspaceResponse) GetResults() []string { @@ -13872,7 +14110,7 @@ type ValidateShardRequest struct { func (x *ValidateShardRequest) Reset() { *x = ValidateShardRequest{} - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13884,7 +14122,7 @@ func (x *ValidateShardRequest) String() string { func (*ValidateShardRequest) ProtoMessage() {} func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13897,7 +14135,7 @@ func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. func (*ValidateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{228} + return file_vtctldata_proto_rawDescGZIP(), []int{232} } func (x *ValidateShardRequest) GetKeyspace() string { @@ -13931,7 +14169,7 @@ type ValidateShardResponse struct { func (x *ValidateShardResponse) Reset() { *x = ValidateShardResponse{} - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13943,7 +14181,7 @@ func (x *ValidateShardResponse) String() string { func (*ValidateShardResponse) ProtoMessage() {} func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13956,7 +14194,7 @@ func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardResponse.ProtoReflect.Descriptor instead. func (*ValidateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{229} + return file_vtctldata_proto_rawDescGZIP(), []int{233} } func (x *ValidateShardResponse) GetResults() []string { @@ -13976,7 +14214,7 @@ type ValidateVersionKeyspaceRequest struct { func (x *ValidateVersionKeyspaceRequest) Reset() { *x = ValidateVersionKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13988,7 +14226,7 @@ func (x *ValidateVersionKeyspaceRequest) String() string { func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14001,7 +14239,7 @@ func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{230} + return file_vtctldata_proto_rawDescGZIP(), []int{234} } func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { @@ -14022,7 +14260,7 @@ type ValidateVersionKeyspaceResponse struct { func (x *ValidateVersionKeyspaceResponse) Reset() { *x = ValidateVersionKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14034,7 +14272,7 @@ func (x *ValidateVersionKeyspaceResponse) String() string { func (*ValidateVersionKeyspaceResponse) ProtoMessage() {} func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14047,7 +14285,7 @@ func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{231} + return file_vtctldata_proto_rawDescGZIP(), []int{235} } func (x *ValidateVersionKeyspaceResponse) GetResults() []string { @@ -14075,7 +14313,7 @@ type ValidateVersionShardRequest struct { func (x *ValidateVersionShardRequest) Reset() { *x = ValidateVersionShardRequest{} - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14087,7 +14325,7 @@ func (x *ValidateVersionShardRequest) String() string { func (*ValidateVersionShardRequest) ProtoMessage() {} func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14100,7 +14338,7 @@ func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{232} + return file_vtctldata_proto_rawDescGZIP(), []int{236} } func (x *ValidateVersionShardRequest) GetKeyspace() string { @@ -14127,7 +14365,7 @@ type ValidateVersionShardResponse struct { func (x *ValidateVersionShardResponse) Reset() { *x = ValidateVersionShardResponse{} - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14139,7 +14377,7 @@ func (x *ValidateVersionShardResponse) String() string { func (*ValidateVersionShardResponse) ProtoMessage() {} func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14152,7 +14390,7 @@ func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{233} + return file_vtctldata_proto_rawDescGZIP(), []int{237} } func (x *ValidateVersionShardResponse) GetResults() []string { @@ -14175,7 +14413,7 @@ type ValidateVSchemaRequest struct { func (x *ValidateVSchemaRequest) Reset() { *x = ValidateVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14187,7 +14425,7 @@ func (x *ValidateVSchemaRequest) String() string { func (*ValidateVSchemaRequest) ProtoMessage() {} func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14200,7 +14438,7 @@ func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaRequest.ProtoReflect.Descriptor instead. func (*ValidateVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{234} + return file_vtctldata_proto_rawDescGZIP(), []int{238} } func (x *ValidateVSchemaRequest) GetKeyspace() string { @@ -14242,7 +14480,7 @@ type ValidateVSchemaResponse struct { func (x *ValidateVSchemaResponse) Reset() { *x = ValidateVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14254,7 +14492,7 @@ func (x *ValidateVSchemaResponse) String() string { func (*ValidateVSchemaResponse) ProtoMessage() {} func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14267,7 +14505,7 @@ func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaResponse.ProtoReflect.Descriptor instead. func (*ValidateVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{235} + return file_vtctldata_proto_rawDescGZIP(), []int{239} } func (x *ValidateVSchemaResponse) GetResults() []string { @@ -14373,7 +14611,7 @@ type VDiffCreateRequest struct { func (x *VDiffCreateRequest) Reset() { *x = VDiffCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14385,7 +14623,7 @@ func (x *VDiffCreateRequest) String() string { func (*VDiffCreateRequest) ProtoMessage() {} func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14398,7 +14636,7 @@ func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateRequest.ProtoReflect.Descriptor instead. func (*VDiffCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{236} + return file_vtctldata_proto_rawDescGZIP(), []int{240} } func (x *VDiffCreateRequest) GetWorkflow() string { @@ -14567,7 +14805,7 @@ type VDiffCreateResponse struct { func (x *VDiffCreateResponse) Reset() { *x = VDiffCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14579,7 +14817,7 @@ func (x *VDiffCreateResponse) String() string { func (*VDiffCreateResponse) ProtoMessage() {} func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14592,7 +14830,7 @@ func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateResponse.ProtoReflect.Descriptor instead. func (*VDiffCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{237} + return file_vtctldata_proto_rawDescGZIP(), []int{241} } func (x *VDiffCreateResponse) GetUUID() string { @@ -14615,7 +14853,7 @@ type VDiffDeleteRequest struct { func (x *VDiffDeleteRequest) Reset() { *x = VDiffDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14627,7 +14865,7 @@ func (x *VDiffDeleteRequest) String() string { func (*VDiffDeleteRequest) ProtoMessage() {} func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14640,7 +14878,7 @@ func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteRequest.ProtoReflect.Descriptor instead. func (*VDiffDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{238} + return file_vtctldata_proto_rawDescGZIP(), []int{242} } func (x *VDiffDeleteRequest) GetWorkflow() string { @@ -14672,7 +14910,7 @@ type VDiffDeleteResponse struct { func (x *VDiffDeleteResponse) Reset() { *x = VDiffDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14684,7 +14922,7 @@ func (x *VDiffDeleteResponse) String() string { func (*VDiffDeleteResponse) ProtoMessage() {} func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14697,7 +14935,7 @@ func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteResponse.ProtoReflect.Descriptor instead. func (*VDiffDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{239} + return file_vtctldata_proto_rawDescGZIP(), []int{243} } type VDiffResumeRequest struct { @@ -14713,7 +14951,7 @@ type VDiffResumeRequest struct { func (x *VDiffResumeRequest) Reset() { *x = VDiffResumeRequest{} - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14725,7 +14963,7 @@ func (x *VDiffResumeRequest) String() string { func (*VDiffResumeRequest) ProtoMessage() {} func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14738,7 +14976,7 @@ func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeRequest.ProtoReflect.Descriptor instead. func (*VDiffResumeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240} + return file_vtctldata_proto_rawDescGZIP(), []int{244} } func (x *VDiffResumeRequest) GetWorkflow() string { @@ -14777,7 +15015,7 @@ type VDiffResumeResponse struct { func (x *VDiffResumeResponse) Reset() { *x = VDiffResumeResponse{} - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14789,7 +15027,7 @@ func (x *VDiffResumeResponse) String() string { func (*VDiffResumeResponse) ProtoMessage() {} func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14802,7 +15040,7 @@ func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeResponse.ProtoReflect.Descriptor instead. func (*VDiffResumeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{241} + return file_vtctldata_proto_rawDescGZIP(), []int{245} } type VDiffShowRequest struct { @@ -14818,7 +15056,7 @@ type VDiffShowRequest struct { func (x *VDiffShowRequest) Reset() { *x = VDiffShowRequest{} - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14830,7 +15068,7 @@ func (x *VDiffShowRequest) String() string { func (*VDiffShowRequest) ProtoMessage() {} func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14843,7 +15081,7 @@ func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowRequest.ProtoReflect.Descriptor instead. func (*VDiffShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{242} + return file_vtctldata_proto_rawDescGZIP(), []int{246} } func (x *VDiffShowRequest) GetWorkflow() string { @@ -14878,7 +15116,7 @@ type VDiffShowResponse struct { func (x *VDiffShowResponse) Reset() { *x = VDiffShowResponse{} - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14890,7 +15128,7 @@ func (x *VDiffShowResponse) String() string { func (*VDiffShowResponse) ProtoMessage() {} func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14903,7 +15141,7 @@ func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowResponse.ProtoReflect.Descriptor instead. func (*VDiffShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{243} + return file_vtctldata_proto_rawDescGZIP(), []int{247} } func (x *VDiffShowResponse) GetTabletResponses() map[string]*tabletmanagerdata.VDiffResponse { @@ -14926,7 +15164,7 @@ type VDiffStopRequest struct { func (x *VDiffStopRequest) Reset() { *x = VDiffStopRequest{} - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14938,7 +15176,7 @@ func (x *VDiffStopRequest) String() string { func (*VDiffStopRequest) ProtoMessage() {} func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14951,7 +15189,7 @@ func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopRequest.ProtoReflect.Descriptor instead. func (*VDiffStopRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{244} + return file_vtctldata_proto_rawDescGZIP(), []int{248} } func (x *VDiffStopRequest) GetWorkflow() string { @@ -14990,7 +15228,7 @@ type VDiffStopResponse struct { func (x *VDiffStopResponse) Reset() { *x = VDiffStopResponse{} - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15002,7 +15240,7 @@ func (x *VDiffStopResponse) String() string { func (*VDiffStopResponse) ProtoMessage() {} func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15015,7 +15253,7 @@ func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopResponse.ProtoReflect.Descriptor instead. func (*VDiffStopResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{245} + return file_vtctldata_proto_rawDescGZIP(), []int{249} } type WorkflowDeleteRequest struct { @@ -15036,7 +15274,7 @@ type WorkflowDeleteRequest struct { func (x *WorkflowDeleteRequest) Reset() { *x = WorkflowDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15048,7 +15286,7 @@ func (x *WorkflowDeleteRequest) String() string { func (*WorkflowDeleteRequest) ProtoMessage() {} func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15061,7 +15299,7 @@ func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteRequest.ProtoReflect.Descriptor instead. func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{246} + return file_vtctldata_proto_rawDescGZIP(), []int{250} } func (x *WorkflowDeleteRequest) GetKeyspace() string { @@ -15117,7 +15355,7 @@ type WorkflowDeleteResponse struct { func (x *WorkflowDeleteResponse) Reset() { *x = WorkflowDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15129,7 +15367,7 @@ func (x *WorkflowDeleteResponse) String() string { func (*WorkflowDeleteResponse) ProtoMessage() {} func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15142,7 +15380,7 @@ func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteResponse.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247} + return file_vtctldata_proto_rawDescGZIP(), []int{251} } func (x *WorkflowDeleteResponse) GetSummary() string { @@ -15171,7 +15409,7 @@ type WorkflowStatusRequest struct { func (x *WorkflowStatusRequest) Reset() { *x = WorkflowStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15183,7 +15421,7 @@ func (x *WorkflowStatusRequest) String() string { func (*WorkflowStatusRequest) ProtoMessage() {} func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15196,7 +15434,7 @@ func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusRequest.ProtoReflect.Descriptor instead. func (*WorkflowStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{248} + return file_vtctldata_proto_rawDescGZIP(), []int{252} } func (x *WorkflowStatusRequest) GetKeyspace() string { @@ -15233,7 +15471,7 @@ type WorkflowStatusResponse struct { func (x *WorkflowStatusResponse) Reset() { *x = WorkflowStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15245,7 +15483,7 @@ func (x *WorkflowStatusResponse) String() string { func (*WorkflowStatusResponse) ProtoMessage() {} func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15258,7 +15496,7 @@ func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusResponse.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249} + return file_vtctldata_proto_rawDescGZIP(), []int{253} } func (x *WorkflowStatusResponse) GetTableCopyState() map[string]*WorkflowStatusResponse_TableCopyState { @@ -15303,7 +15541,7 @@ type WorkflowSwitchTrafficRequest struct { func (x *WorkflowSwitchTrafficRequest) Reset() { *x = WorkflowSwitchTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15315,7 +15553,7 @@ func (x *WorkflowSwitchTrafficRequest) String() string { func (*WorkflowSwitchTrafficRequest) ProtoMessage() {} func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15328,7 +15566,7 @@ func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{250} + return file_vtctldata_proto_rawDescGZIP(), []int{254} } func (x *WorkflowSwitchTrafficRequest) GetKeyspace() string { @@ -15428,7 +15666,7 @@ type WorkflowSwitchTrafficResponse struct { func (x *WorkflowSwitchTrafficResponse) Reset() { *x = WorkflowSwitchTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15440,7 +15678,7 @@ func (x *WorkflowSwitchTrafficResponse) String() string { func (*WorkflowSwitchTrafficResponse) ProtoMessage() {} func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15453,7 +15691,7 @@ func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{251} + return file_vtctldata_proto_rawDescGZIP(), []int{255} } func (x *WorkflowSwitchTrafficResponse) GetSummary() string { @@ -15497,7 +15735,7 @@ type WorkflowUpdateRequest struct { func (x *WorkflowUpdateRequest) Reset() { *x = WorkflowUpdateRequest{} - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15509,7 +15747,7 @@ func (x *WorkflowUpdateRequest) String() string { func (*WorkflowUpdateRequest) ProtoMessage() {} func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15522,7 +15760,7 @@ func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateRequest.ProtoReflect.Descriptor instead. func (*WorkflowUpdateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{252} + return file_vtctldata_proto_rawDescGZIP(), []int{256} } func (x *WorkflowUpdateRequest) GetKeyspace() string { @@ -15550,7 +15788,7 @@ type WorkflowUpdateResponse struct { func (x *WorkflowUpdateResponse) Reset() { *x = WorkflowUpdateResponse{} - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15562,7 +15800,7 @@ func (x *WorkflowUpdateResponse) String() string { func (*WorkflowUpdateResponse) ProtoMessage() {} func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15575,7 +15813,7 @@ func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateResponse.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253} + return file_vtctldata_proto_rawDescGZIP(), []int{257} } func (x *WorkflowUpdateResponse) GetSummary() string { @@ -15600,7 +15838,7 @@ type GetMirrorRulesRequest struct { func (x *GetMirrorRulesRequest) Reset() { *x = GetMirrorRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15612,7 +15850,7 @@ func (x *GetMirrorRulesRequest) String() string { func (*GetMirrorRulesRequest) ProtoMessage() {} func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15625,7 +15863,7 @@ func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesRequest.ProtoReflect.Descriptor instead. func (*GetMirrorRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{254} + return file_vtctldata_proto_rawDescGZIP(), []int{258} } type GetMirrorRulesResponse struct { @@ -15638,7 +15876,7 @@ type GetMirrorRulesResponse struct { func (x *GetMirrorRulesResponse) Reset() { *x = GetMirrorRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15650,7 +15888,7 @@ func (x *GetMirrorRulesResponse) String() string { func (*GetMirrorRulesResponse) ProtoMessage() {} func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15663,7 +15901,7 @@ func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesResponse.ProtoReflect.Descriptor instead. func (*GetMirrorRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{255} + return file_vtctldata_proto_rawDescGZIP(), []int{259} } func (x *GetMirrorRulesResponse) GetMirrorRules() *vschema.MirrorRules { @@ -15686,7 +15924,7 @@ type WorkflowMirrorTrafficRequest struct { func (x *WorkflowMirrorTrafficRequest) Reset() { *x = WorkflowMirrorTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15698,7 +15936,7 @@ func (x *WorkflowMirrorTrafficRequest) String() string { func (*WorkflowMirrorTrafficRequest) ProtoMessage() {} func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15711,7 +15949,7 @@ func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{256} + return file_vtctldata_proto_rawDescGZIP(), []int{260} } func (x *WorkflowMirrorTrafficRequest) GetKeyspace() string { @@ -15754,7 +15992,7 @@ type WorkflowMirrorTrafficResponse struct { func (x *WorkflowMirrorTrafficResponse) Reset() { *x = WorkflowMirrorTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15766,7 +16004,7 @@ func (x *WorkflowMirrorTrafficResponse) String() string { func (*WorkflowMirrorTrafficResponse) ProtoMessage() {} func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15779,7 +16017,7 @@ func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{257} + return file_vtctldata_proto_rawDescGZIP(), []int{261} } func (x *WorkflowMirrorTrafficResponse) GetSummary() string { @@ -15814,7 +16052,7 @@ type Workflow_ReplicationLocation struct { func (x *Workflow_ReplicationLocation) Reset() { *x = Workflow_ReplicationLocation{} - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15826,7 +16064,7 @@ func (x *Workflow_ReplicationLocation) String() string { func (*Workflow_ReplicationLocation) ProtoMessage() {} func (x *Workflow_ReplicationLocation) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15868,7 +16106,7 @@ type Workflow_ShardStream struct { func (x *Workflow_ShardStream) Reset() { *x = Workflow_ShardStream{} - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15880,7 +16118,7 @@ func (x *Workflow_ShardStream) String() string { func (*Workflow_ShardStream) ProtoMessage() {} func (x *Workflow_ShardStream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15954,7 +16192,7 @@ type Workflow_Stream struct { func (x *Workflow_Stream) Reset() { *x = Workflow_Stream{} - mi := &file_vtctldata_proto_msgTypes[262] + mi := &file_vtctldata_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15966,7 +16204,7 @@ func (x *Workflow_Stream) String() string { func (*Workflow_Stream) ProtoMessage() {} func (x *Workflow_Stream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[262] + mi := &file_vtctldata_proto_msgTypes[266] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16134,7 +16372,7 @@ type Workflow_Stream_CopyState struct { func (x *Workflow_Stream_CopyState) Reset() { *x = Workflow_Stream_CopyState{} - mi := &file_vtctldata_proto_msgTypes[263] + mi := &file_vtctldata_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16146,7 +16384,7 @@ func (x *Workflow_Stream_CopyState) String() string { func (*Workflow_Stream_CopyState) ProtoMessage() {} func (x *Workflow_Stream_CopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[263] + mi := &file_vtctldata_proto_msgTypes[267] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16200,7 +16438,7 @@ type Workflow_Stream_Log struct { func (x *Workflow_Stream_Log) Reset() { *x = Workflow_Stream_Log{} - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16212,7 +16450,7 @@ func (x *Workflow_Stream_Log) String() string { func (*Workflow_Stream_Log) ProtoMessage() {} func (x *Workflow_Stream_Log) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16295,7 +16533,7 @@ type Workflow_Stream_ThrottlerStatus struct { func (x *Workflow_Stream_ThrottlerStatus) Reset() { *x = Workflow_Stream_ThrottlerStatus{} - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16307,7 +16545,7 @@ func (x *Workflow_Stream_ThrottlerStatus) String() string { func (*Workflow_Stream_ThrottlerStatus) ProtoMessage() {} func (x *Workflow_Stream_ThrottlerStatus) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16347,7 +16585,7 @@ type ApplyVSchemaResponse_ParamList struct { func (x *ApplyVSchemaResponse_ParamList) Reset() { *x = ApplyVSchemaResponse_ParamList{} - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16359,7 +16597,7 @@ func (x *ApplyVSchemaResponse_ParamList) String() string { func (*ApplyVSchemaResponse_ParamList) ProtoMessage() {} func (x *ApplyVSchemaResponse_ParamList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16392,7 +16630,7 @@ type GetSrvKeyspaceNamesResponse_NameList struct { func (x *GetSrvKeyspaceNamesResponse_NameList) Reset() { *x = GetSrvKeyspaceNamesResponse_NameList{} - mi := &file_vtctldata_proto_msgTypes[280] + mi := &file_vtctldata_proto_msgTypes[284] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16404,7 +16642,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) String() string { func (*GetSrvKeyspaceNamesResponse_NameList) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[280] + mi := &file_vtctldata_proto_msgTypes[284] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16417,7 +16655,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Messa // Deprecated: Use GetSrvKeyspaceNamesResponse_NameList.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse_NameList) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{99, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{101, 1} } func (x *GetSrvKeyspaceNamesResponse_NameList) GetNames() []string { @@ -16439,7 +16677,7 @@ type MoveTablesCreateResponse_TabletInfo struct { func (x *MoveTablesCreateResponse_TabletInfo) Reset() { *x = MoveTablesCreateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16451,7 +16689,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) String() string { func (*MoveTablesCreateResponse_TabletInfo) ProtoMessage() {} func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16464,7 +16702,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Messag // Deprecated: Use MoveTablesCreateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{154, 0} } func (x *MoveTablesCreateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16493,7 +16731,7 @@ type WorkflowDeleteResponse_TabletInfo struct { func (x *WorkflowDeleteResponse_TabletInfo) Reset() { *x = WorkflowDeleteResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[294] + mi := &file_vtctldata_proto_msgTypes[298] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16505,7 +16743,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) String() string { func (*WorkflowDeleteResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[294] + mi := &file_vtctldata_proto_msgTypes[298] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16518,7 +16756,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowDeleteResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{251, 0} } func (x *WorkflowDeleteResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16550,7 +16788,7 @@ type WorkflowStatusResponse_TableCopyState struct { func (x *WorkflowStatusResponse_TableCopyState) Reset() { *x = WorkflowStatusResponse_TableCopyState{} - mi := &file_vtctldata_proto_msgTypes[295] + mi := &file_vtctldata_proto_msgTypes[299] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16562,7 +16800,7 @@ func (x *WorkflowStatusResponse_TableCopyState) String() string { func (*WorkflowStatusResponse_TableCopyState) ProtoMessage() {} func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[295] + mi := &file_vtctldata_proto_msgTypes[299] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16575,7 +16813,7 @@ func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Mess // Deprecated: Use WorkflowStatusResponse_TableCopyState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_TableCopyState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 0} } func (x *WorkflowStatusResponse_TableCopyState) GetRowsCopied() int64 { @@ -16635,7 +16873,7 @@ type WorkflowStatusResponse_ShardStreamState struct { func (x *WorkflowStatusResponse_ShardStreamState) Reset() { *x = WorkflowStatusResponse_ShardStreamState{} - mi := &file_vtctldata_proto_msgTypes[296] + mi := &file_vtctldata_proto_msgTypes[300] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16647,7 +16885,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) String() string { func (*WorkflowStatusResponse_ShardStreamState) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[296] + mi := &file_vtctldata_proto_msgTypes[300] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16660,7 +16898,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Me // Deprecated: Use WorkflowStatusResponse_ShardStreamState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreamState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 1} } func (x *WorkflowStatusResponse_ShardStreamState) GetId() int32 { @@ -16715,7 +16953,7 @@ type WorkflowStatusResponse_ShardStreams struct { func (x *WorkflowStatusResponse_ShardStreams) Reset() { *x = WorkflowStatusResponse_ShardStreams{} - mi := &file_vtctldata_proto_msgTypes[297] + mi := &file_vtctldata_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16727,7 +16965,7 @@ func (x *WorkflowStatusResponse_ShardStreams) String() string { func (*WorkflowStatusResponse_ShardStreams) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[297] + mi := &file_vtctldata_proto_msgTypes[301] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16740,7 +16978,7 @@ func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Messag // Deprecated: Use WorkflowStatusResponse_ShardStreams.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreams) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249, 2} + return file_vtctldata_proto_rawDescGZIP(), []int{253, 2} } func (x *WorkflowStatusResponse_ShardStreams) GetStreams() []*WorkflowStatusResponse_ShardStreamState { @@ -16763,7 +17001,7 @@ type WorkflowUpdateResponse_TabletInfo struct { func (x *WorkflowUpdateResponse_TabletInfo) Reset() { *x = WorkflowUpdateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16775,7 +17013,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) String() string { func (*WorkflowUpdateResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16788,7 +17026,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowUpdateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{257, 0} } func (x *WorkflowUpdateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -17532,1162 +17770,705 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, - 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x02, 0x0a, - 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, - 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, - 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, - 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8a, 0x03, 0x0a, + 0x16, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x13, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x11, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, + 0x77, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x70, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, + 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, + 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, + 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, + 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, + 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, + 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, + 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, + 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, + 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, + 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, + 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, + 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, - 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, - 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x1d, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, - 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, - 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, - 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, - 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, - 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, - 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, - 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, + 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, - 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x4e, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, - 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, - 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, - 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, - 0x61, 0x72, 0x64, 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, 0x26, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, - 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, - 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 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, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, - 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, - 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, - 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, - 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, - 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, - 0x43, 0x65, 0x6c, 0x6c, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x22, 0x4e, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, + 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, - 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, - 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, - 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, - 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, - 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, - 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, - 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, - 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x54, 0x0a, 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, + 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, + 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, + 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, + 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x63, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, - 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, - 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x21, 0x47, 0x65, 0x74, - 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, - 0xa0, 0x01, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x63, - 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, - 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xc6, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, - 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, - 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, + 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x65, 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, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, - 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, - 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, - 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, - 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, - 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, - 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, - 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, - 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, - 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, - 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, - 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, - 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, - 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, - 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, - 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, - 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, - 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, - 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, - 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, - 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, - 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, - 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, - 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, - 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, - 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, - 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, - 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, - 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, - 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, + 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, + 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, + 0x6c, 0x6c, 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, - 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, - 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, - 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, + 0x61, 0x6d, 0x65, 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, 0x45, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, + 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, + 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, + 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 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, + 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, - 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, - 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, - 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, - 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, - 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, - 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, - 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, - 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, - 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, + 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x63, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, + 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, + 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x5f, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, + 0x65, 0x22, 0x63, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, + 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xc6, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, - 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, + 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, + 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, @@ -18696,451 +18477,975 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, + 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, + 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, + 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, + 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, + 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, + 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, + 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, + 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, + 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, + 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, + 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, + 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, + 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, + 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, + 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, + 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, + 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, + 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, + 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, + 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, + 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, + 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, - 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, - 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, - 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x65, 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, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, - 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, - 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, + 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, + 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, - 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, - 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, - 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, - 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, - 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, + 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, + 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, + 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, + 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, + 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, + 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, + 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, + 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, + 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, + 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, + 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, + 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, + 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, + 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, + 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, + 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, - 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, + 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, + 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, + 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, - 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, - 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, + 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, + 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, + 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, + 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, + 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, + 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd8, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x88, 0x02, 0x0a, 0x1e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, + 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x22, 0x25, 0x0a, 0x23, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, + 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, + 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x1e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, + 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, + 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, + 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, + 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, + 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, + 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, + 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, + 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, + 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, + 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, + 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, + 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3c, 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, + 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x22, 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, + 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x92, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x16, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, - 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x10, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, - 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, - 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x70, - 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, 0x50, - 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, 0x77, - 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, - 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x42, - 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, - 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, 0x78, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, - 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0a, - 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, - 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, - 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x22, 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, @@ -19149,242 +19454,211 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, - 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, - 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x15, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x72, 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, + 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, + 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, + 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, + 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, + 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, + 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, + 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, + 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x85, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, + 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, + 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, - 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, - 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, - 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, - 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, - 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, - 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, - 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, - 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, 0x42, - 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x4c, - 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, - 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x22, 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, + 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, + 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, + 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -19400,7 +19674,7 @@ func file_vtctldata_proto_rawDescGZIP() []byte { } var file_vtctldata_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 301) +var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 305) var file_vtctldata_proto_goTypes = []any{ (MaterializationIntent)(0), // 0: vtctldata.MaterializationIntent (QueryOrdering)(0), // 1: vtctldata.QueryOrdering @@ -19445,557 +19719,563 @@ var file_vtctldata_proto_goTypes = []any{ (*CleanupSchemaMigrationResponse)(nil), // 40: vtctldata.CleanupSchemaMigrationResponse (*CompleteSchemaMigrationRequest)(nil), // 41: vtctldata.CompleteSchemaMigrationRequest (*CompleteSchemaMigrationResponse)(nil), // 42: vtctldata.CompleteSchemaMigrationResponse - (*CreateKeyspaceRequest)(nil), // 43: vtctldata.CreateKeyspaceRequest - (*CreateKeyspaceResponse)(nil), // 44: vtctldata.CreateKeyspaceResponse - (*CreateShardRequest)(nil), // 45: vtctldata.CreateShardRequest - (*CreateShardResponse)(nil), // 46: vtctldata.CreateShardResponse - (*DeleteCellInfoRequest)(nil), // 47: vtctldata.DeleteCellInfoRequest - (*DeleteCellInfoResponse)(nil), // 48: vtctldata.DeleteCellInfoResponse - (*DeleteCellsAliasRequest)(nil), // 49: vtctldata.DeleteCellsAliasRequest - (*DeleteCellsAliasResponse)(nil), // 50: vtctldata.DeleteCellsAliasResponse - (*DeleteKeyspaceRequest)(nil), // 51: vtctldata.DeleteKeyspaceRequest - (*DeleteKeyspaceResponse)(nil), // 52: vtctldata.DeleteKeyspaceResponse - (*DeleteShardsRequest)(nil), // 53: vtctldata.DeleteShardsRequest - (*DeleteShardsResponse)(nil), // 54: vtctldata.DeleteShardsResponse - (*DeleteSrvVSchemaRequest)(nil), // 55: vtctldata.DeleteSrvVSchemaRequest - (*DeleteSrvVSchemaResponse)(nil), // 56: vtctldata.DeleteSrvVSchemaResponse - (*DeleteTabletsRequest)(nil), // 57: vtctldata.DeleteTabletsRequest - (*DeleteTabletsResponse)(nil), // 58: vtctldata.DeleteTabletsResponse - (*EmergencyReparentShardRequest)(nil), // 59: vtctldata.EmergencyReparentShardRequest - (*EmergencyReparentShardResponse)(nil), // 60: vtctldata.EmergencyReparentShardResponse - (*ExecuteFetchAsAppRequest)(nil), // 61: vtctldata.ExecuteFetchAsAppRequest - (*ExecuteFetchAsAppResponse)(nil), // 62: vtctldata.ExecuteFetchAsAppResponse - (*ExecuteFetchAsDBARequest)(nil), // 63: vtctldata.ExecuteFetchAsDBARequest - (*ExecuteFetchAsDBAResponse)(nil), // 64: vtctldata.ExecuteFetchAsDBAResponse - (*ExecuteHookRequest)(nil), // 65: vtctldata.ExecuteHookRequest - (*ExecuteHookResponse)(nil), // 66: vtctldata.ExecuteHookResponse - (*ExecuteMultiFetchAsDBARequest)(nil), // 67: vtctldata.ExecuteMultiFetchAsDBARequest - (*ExecuteMultiFetchAsDBAResponse)(nil), // 68: vtctldata.ExecuteMultiFetchAsDBAResponse - (*FindAllShardsInKeyspaceRequest)(nil), // 69: vtctldata.FindAllShardsInKeyspaceRequest - (*FindAllShardsInKeyspaceResponse)(nil), // 70: vtctldata.FindAllShardsInKeyspaceResponse - (*ForceCutOverSchemaMigrationRequest)(nil), // 71: vtctldata.ForceCutOverSchemaMigrationRequest - (*ForceCutOverSchemaMigrationResponse)(nil), // 72: vtctldata.ForceCutOverSchemaMigrationResponse - (*GetBackupsRequest)(nil), // 73: vtctldata.GetBackupsRequest - (*GetBackupsResponse)(nil), // 74: vtctldata.GetBackupsResponse - (*GetCellInfoRequest)(nil), // 75: vtctldata.GetCellInfoRequest - (*GetCellInfoResponse)(nil), // 76: vtctldata.GetCellInfoResponse - (*GetCellInfoNamesRequest)(nil), // 77: vtctldata.GetCellInfoNamesRequest - (*GetCellInfoNamesResponse)(nil), // 78: vtctldata.GetCellInfoNamesResponse - (*GetCellsAliasesRequest)(nil), // 79: vtctldata.GetCellsAliasesRequest - (*GetCellsAliasesResponse)(nil), // 80: vtctldata.GetCellsAliasesResponse - (*GetFullStatusRequest)(nil), // 81: vtctldata.GetFullStatusRequest - (*GetFullStatusResponse)(nil), // 82: vtctldata.GetFullStatusResponse - (*GetKeyspacesRequest)(nil), // 83: vtctldata.GetKeyspacesRequest - (*GetKeyspacesResponse)(nil), // 84: vtctldata.GetKeyspacesResponse - (*GetKeyspaceRequest)(nil), // 85: vtctldata.GetKeyspaceRequest - (*GetKeyspaceResponse)(nil), // 86: vtctldata.GetKeyspaceResponse - (*GetPermissionsRequest)(nil), // 87: vtctldata.GetPermissionsRequest - (*GetPermissionsResponse)(nil), // 88: vtctldata.GetPermissionsResponse - (*GetKeyspaceRoutingRulesRequest)(nil), // 89: vtctldata.GetKeyspaceRoutingRulesRequest - (*GetKeyspaceRoutingRulesResponse)(nil), // 90: vtctldata.GetKeyspaceRoutingRulesResponse - (*GetRoutingRulesRequest)(nil), // 91: vtctldata.GetRoutingRulesRequest - (*GetRoutingRulesResponse)(nil), // 92: vtctldata.GetRoutingRulesResponse - (*GetSchemaRequest)(nil), // 93: vtctldata.GetSchemaRequest - (*GetSchemaResponse)(nil), // 94: vtctldata.GetSchemaResponse - (*GetSchemaMigrationsRequest)(nil), // 95: vtctldata.GetSchemaMigrationsRequest - (*GetSchemaMigrationsResponse)(nil), // 96: vtctldata.GetSchemaMigrationsResponse - (*GetShardReplicationRequest)(nil), // 97: vtctldata.GetShardReplicationRequest - (*GetShardReplicationResponse)(nil), // 98: vtctldata.GetShardReplicationResponse - (*GetShardRequest)(nil), // 99: vtctldata.GetShardRequest - (*GetShardResponse)(nil), // 100: vtctldata.GetShardResponse - (*GetShardRoutingRulesRequest)(nil), // 101: vtctldata.GetShardRoutingRulesRequest - (*GetShardRoutingRulesResponse)(nil), // 102: vtctldata.GetShardRoutingRulesResponse - (*GetSrvKeyspaceNamesRequest)(nil), // 103: vtctldata.GetSrvKeyspaceNamesRequest - (*GetSrvKeyspaceNamesResponse)(nil), // 104: vtctldata.GetSrvKeyspaceNamesResponse - (*GetSrvKeyspacesRequest)(nil), // 105: vtctldata.GetSrvKeyspacesRequest - (*GetSrvKeyspacesResponse)(nil), // 106: vtctldata.GetSrvKeyspacesResponse - (*UpdateThrottlerConfigRequest)(nil), // 107: vtctldata.UpdateThrottlerConfigRequest - (*UpdateThrottlerConfigResponse)(nil), // 108: vtctldata.UpdateThrottlerConfigResponse - (*GetSrvVSchemaRequest)(nil), // 109: vtctldata.GetSrvVSchemaRequest - (*GetSrvVSchemaResponse)(nil), // 110: vtctldata.GetSrvVSchemaResponse - (*GetSrvVSchemasRequest)(nil), // 111: vtctldata.GetSrvVSchemasRequest - (*GetSrvVSchemasResponse)(nil), // 112: vtctldata.GetSrvVSchemasResponse - (*GetTabletRequest)(nil), // 113: vtctldata.GetTabletRequest - (*GetTabletResponse)(nil), // 114: vtctldata.GetTabletResponse - (*GetTabletsRequest)(nil), // 115: vtctldata.GetTabletsRequest - (*GetTabletsResponse)(nil), // 116: vtctldata.GetTabletsResponse - (*GetThrottlerStatusRequest)(nil), // 117: vtctldata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 118: vtctldata.GetThrottlerStatusResponse - (*GetTopologyPathRequest)(nil), // 119: vtctldata.GetTopologyPathRequest - (*GetTopologyPathResponse)(nil), // 120: vtctldata.GetTopologyPathResponse - (*TopologyCell)(nil), // 121: vtctldata.TopologyCell - (*GetUnresolvedTransactionsRequest)(nil), // 122: vtctldata.GetUnresolvedTransactionsRequest - (*GetUnresolvedTransactionsResponse)(nil), // 123: vtctldata.GetUnresolvedTransactionsResponse - (*GetTransactionInfoRequest)(nil), // 124: vtctldata.GetTransactionInfoRequest - (*ShardTransactionState)(nil), // 125: vtctldata.ShardTransactionState - (*GetTransactionInfoResponse)(nil), // 126: vtctldata.GetTransactionInfoResponse - (*ConcludeTransactionRequest)(nil), // 127: vtctldata.ConcludeTransactionRequest - (*ConcludeTransactionResponse)(nil), // 128: vtctldata.ConcludeTransactionResponse - (*GetVSchemaRequest)(nil), // 129: vtctldata.GetVSchemaRequest - (*GetVersionRequest)(nil), // 130: vtctldata.GetVersionRequest - (*GetVersionResponse)(nil), // 131: vtctldata.GetVersionResponse - (*GetVSchemaResponse)(nil), // 132: vtctldata.GetVSchemaResponse - (*GetWorkflowsRequest)(nil), // 133: vtctldata.GetWorkflowsRequest - (*GetWorkflowsResponse)(nil), // 134: vtctldata.GetWorkflowsResponse - (*InitShardPrimaryRequest)(nil), // 135: vtctldata.InitShardPrimaryRequest - (*InitShardPrimaryResponse)(nil), // 136: vtctldata.InitShardPrimaryResponse - (*LaunchSchemaMigrationRequest)(nil), // 137: vtctldata.LaunchSchemaMigrationRequest - (*LaunchSchemaMigrationResponse)(nil), // 138: vtctldata.LaunchSchemaMigrationResponse - (*LookupVindexCreateRequest)(nil), // 139: vtctldata.LookupVindexCreateRequest - (*LookupVindexCreateResponse)(nil), // 140: vtctldata.LookupVindexCreateResponse - (*LookupVindexExternalizeRequest)(nil), // 141: vtctldata.LookupVindexExternalizeRequest - (*LookupVindexExternalizeResponse)(nil), // 142: vtctldata.LookupVindexExternalizeResponse - (*MaterializeCreateRequest)(nil), // 143: vtctldata.MaterializeCreateRequest - (*MaterializeCreateResponse)(nil), // 144: vtctldata.MaterializeCreateResponse - (*MigrateCreateRequest)(nil), // 145: vtctldata.MigrateCreateRequest - (*MigrateCompleteRequest)(nil), // 146: vtctldata.MigrateCompleteRequest - (*MigrateCompleteResponse)(nil), // 147: vtctldata.MigrateCompleteResponse - (*MountRegisterRequest)(nil), // 148: vtctldata.MountRegisterRequest - (*MountRegisterResponse)(nil), // 149: vtctldata.MountRegisterResponse - (*MountUnregisterRequest)(nil), // 150: vtctldata.MountUnregisterRequest - (*MountUnregisterResponse)(nil), // 151: vtctldata.MountUnregisterResponse - (*MountShowRequest)(nil), // 152: vtctldata.MountShowRequest - (*MountShowResponse)(nil), // 153: vtctldata.MountShowResponse - (*MountListRequest)(nil), // 154: vtctldata.MountListRequest - (*MountListResponse)(nil), // 155: vtctldata.MountListResponse - (*MoveTablesCreateRequest)(nil), // 156: vtctldata.MoveTablesCreateRequest - (*MoveTablesCreateResponse)(nil), // 157: vtctldata.MoveTablesCreateResponse - (*MoveTablesCompleteRequest)(nil), // 158: vtctldata.MoveTablesCompleteRequest - (*MoveTablesCompleteResponse)(nil), // 159: vtctldata.MoveTablesCompleteResponse - (*PingTabletRequest)(nil), // 160: vtctldata.PingTabletRequest - (*PingTabletResponse)(nil), // 161: vtctldata.PingTabletResponse - (*PlannedReparentShardRequest)(nil), // 162: vtctldata.PlannedReparentShardRequest - (*PlannedReparentShardResponse)(nil), // 163: vtctldata.PlannedReparentShardResponse - (*RebuildKeyspaceGraphRequest)(nil), // 164: vtctldata.RebuildKeyspaceGraphRequest - (*RebuildKeyspaceGraphResponse)(nil), // 165: vtctldata.RebuildKeyspaceGraphResponse - (*RebuildVSchemaGraphRequest)(nil), // 166: vtctldata.RebuildVSchemaGraphRequest - (*RebuildVSchemaGraphResponse)(nil), // 167: vtctldata.RebuildVSchemaGraphResponse - (*RefreshStateRequest)(nil), // 168: vtctldata.RefreshStateRequest - (*RefreshStateResponse)(nil), // 169: vtctldata.RefreshStateResponse - (*RefreshStateByShardRequest)(nil), // 170: vtctldata.RefreshStateByShardRequest - (*RefreshStateByShardResponse)(nil), // 171: vtctldata.RefreshStateByShardResponse - (*ReloadSchemaRequest)(nil), // 172: vtctldata.ReloadSchemaRequest - (*ReloadSchemaResponse)(nil), // 173: vtctldata.ReloadSchemaResponse - (*ReloadSchemaKeyspaceRequest)(nil), // 174: vtctldata.ReloadSchemaKeyspaceRequest - (*ReloadSchemaKeyspaceResponse)(nil), // 175: vtctldata.ReloadSchemaKeyspaceResponse - (*ReloadSchemaShardRequest)(nil), // 176: vtctldata.ReloadSchemaShardRequest - (*ReloadSchemaShardResponse)(nil), // 177: vtctldata.ReloadSchemaShardResponse - (*RemoveBackupRequest)(nil), // 178: vtctldata.RemoveBackupRequest - (*RemoveBackupResponse)(nil), // 179: vtctldata.RemoveBackupResponse - (*RemoveKeyspaceCellRequest)(nil), // 180: vtctldata.RemoveKeyspaceCellRequest - (*RemoveKeyspaceCellResponse)(nil), // 181: vtctldata.RemoveKeyspaceCellResponse - (*RemoveShardCellRequest)(nil), // 182: vtctldata.RemoveShardCellRequest - (*RemoveShardCellResponse)(nil), // 183: vtctldata.RemoveShardCellResponse - (*ReparentTabletRequest)(nil), // 184: vtctldata.ReparentTabletRequest - (*ReparentTabletResponse)(nil), // 185: vtctldata.ReparentTabletResponse - (*ReshardCreateRequest)(nil), // 186: vtctldata.ReshardCreateRequest - (*RestoreFromBackupRequest)(nil), // 187: vtctldata.RestoreFromBackupRequest - (*RestoreFromBackupResponse)(nil), // 188: vtctldata.RestoreFromBackupResponse - (*RetrySchemaMigrationRequest)(nil), // 189: vtctldata.RetrySchemaMigrationRequest - (*RetrySchemaMigrationResponse)(nil), // 190: vtctldata.RetrySchemaMigrationResponse - (*RunHealthCheckRequest)(nil), // 191: vtctldata.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 192: vtctldata.RunHealthCheckResponse - (*SetKeyspaceDurabilityPolicyRequest)(nil), // 193: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*SetKeyspaceDurabilityPolicyResponse)(nil), // 194: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*SetKeyspaceShardingInfoRequest)(nil), // 195: vtctldata.SetKeyspaceShardingInfoRequest - (*SetKeyspaceShardingInfoResponse)(nil), // 196: vtctldata.SetKeyspaceShardingInfoResponse - (*SetShardIsPrimaryServingRequest)(nil), // 197: vtctldata.SetShardIsPrimaryServingRequest - (*SetShardIsPrimaryServingResponse)(nil), // 198: vtctldata.SetShardIsPrimaryServingResponse - (*SetShardTabletControlRequest)(nil), // 199: vtctldata.SetShardTabletControlRequest - (*SetShardTabletControlResponse)(nil), // 200: vtctldata.SetShardTabletControlResponse - (*SetWritableRequest)(nil), // 201: vtctldata.SetWritableRequest - (*SetWritableResponse)(nil), // 202: vtctldata.SetWritableResponse - (*ShardReplicationAddRequest)(nil), // 203: vtctldata.ShardReplicationAddRequest - (*ShardReplicationAddResponse)(nil), // 204: vtctldata.ShardReplicationAddResponse - (*ShardReplicationFixRequest)(nil), // 205: vtctldata.ShardReplicationFixRequest - (*ShardReplicationFixResponse)(nil), // 206: vtctldata.ShardReplicationFixResponse - (*ShardReplicationPositionsRequest)(nil), // 207: vtctldata.ShardReplicationPositionsRequest - (*ShardReplicationPositionsResponse)(nil), // 208: vtctldata.ShardReplicationPositionsResponse - (*ShardReplicationRemoveRequest)(nil), // 209: vtctldata.ShardReplicationRemoveRequest - (*ShardReplicationRemoveResponse)(nil), // 210: vtctldata.ShardReplicationRemoveResponse - (*SleepTabletRequest)(nil), // 211: vtctldata.SleepTabletRequest - (*SleepTabletResponse)(nil), // 212: vtctldata.SleepTabletResponse - (*SourceShardAddRequest)(nil), // 213: vtctldata.SourceShardAddRequest - (*SourceShardAddResponse)(nil), // 214: vtctldata.SourceShardAddResponse - (*SourceShardDeleteRequest)(nil), // 215: vtctldata.SourceShardDeleteRequest - (*SourceShardDeleteResponse)(nil), // 216: vtctldata.SourceShardDeleteResponse - (*StartReplicationRequest)(nil), // 217: vtctldata.StartReplicationRequest - (*StartReplicationResponse)(nil), // 218: vtctldata.StartReplicationResponse - (*StopReplicationRequest)(nil), // 219: vtctldata.StopReplicationRequest - (*StopReplicationResponse)(nil), // 220: vtctldata.StopReplicationResponse - (*TabletExternallyReparentedRequest)(nil), // 221: vtctldata.TabletExternallyReparentedRequest - (*TabletExternallyReparentedResponse)(nil), // 222: vtctldata.TabletExternallyReparentedResponse - (*UpdateCellInfoRequest)(nil), // 223: vtctldata.UpdateCellInfoRequest - (*UpdateCellInfoResponse)(nil), // 224: vtctldata.UpdateCellInfoResponse - (*UpdateCellsAliasRequest)(nil), // 225: vtctldata.UpdateCellsAliasRequest - (*UpdateCellsAliasResponse)(nil), // 226: vtctldata.UpdateCellsAliasResponse - (*ValidateRequest)(nil), // 227: vtctldata.ValidateRequest - (*ValidateResponse)(nil), // 228: vtctldata.ValidateResponse - (*ValidateKeyspaceRequest)(nil), // 229: vtctldata.ValidateKeyspaceRequest - (*ValidateKeyspaceResponse)(nil), // 230: vtctldata.ValidateKeyspaceResponse - (*ValidateSchemaKeyspaceRequest)(nil), // 231: vtctldata.ValidateSchemaKeyspaceRequest - (*ValidateSchemaKeyspaceResponse)(nil), // 232: vtctldata.ValidateSchemaKeyspaceResponse - (*ValidateShardRequest)(nil), // 233: vtctldata.ValidateShardRequest - (*ValidateShardResponse)(nil), // 234: vtctldata.ValidateShardResponse - (*ValidateVersionKeyspaceRequest)(nil), // 235: vtctldata.ValidateVersionKeyspaceRequest - (*ValidateVersionKeyspaceResponse)(nil), // 236: vtctldata.ValidateVersionKeyspaceResponse - (*ValidateVersionShardRequest)(nil), // 237: vtctldata.ValidateVersionShardRequest - (*ValidateVersionShardResponse)(nil), // 238: vtctldata.ValidateVersionShardResponse - (*ValidateVSchemaRequest)(nil), // 239: vtctldata.ValidateVSchemaRequest - (*ValidateVSchemaResponse)(nil), // 240: vtctldata.ValidateVSchemaResponse - (*VDiffCreateRequest)(nil), // 241: vtctldata.VDiffCreateRequest - (*VDiffCreateResponse)(nil), // 242: vtctldata.VDiffCreateResponse - (*VDiffDeleteRequest)(nil), // 243: vtctldata.VDiffDeleteRequest - (*VDiffDeleteResponse)(nil), // 244: vtctldata.VDiffDeleteResponse - (*VDiffResumeRequest)(nil), // 245: vtctldata.VDiffResumeRequest - (*VDiffResumeResponse)(nil), // 246: vtctldata.VDiffResumeResponse - (*VDiffShowRequest)(nil), // 247: vtctldata.VDiffShowRequest - (*VDiffShowResponse)(nil), // 248: vtctldata.VDiffShowResponse - (*VDiffStopRequest)(nil), // 249: vtctldata.VDiffStopRequest - (*VDiffStopResponse)(nil), // 250: vtctldata.VDiffStopResponse - (*WorkflowDeleteRequest)(nil), // 251: vtctldata.WorkflowDeleteRequest - (*WorkflowDeleteResponse)(nil), // 252: vtctldata.WorkflowDeleteResponse - (*WorkflowStatusRequest)(nil), // 253: vtctldata.WorkflowStatusRequest - (*WorkflowStatusResponse)(nil), // 254: vtctldata.WorkflowStatusResponse - (*WorkflowSwitchTrafficRequest)(nil), // 255: vtctldata.WorkflowSwitchTrafficRequest - (*WorkflowSwitchTrafficResponse)(nil), // 256: vtctldata.WorkflowSwitchTrafficResponse - (*WorkflowUpdateRequest)(nil), // 257: vtctldata.WorkflowUpdateRequest - (*WorkflowUpdateResponse)(nil), // 258: vtctldata.WorkflowUpdateResponse - (*GetMirrorRulesRequest)(nil), // 259: vtctldata.GetMirrorRulesRequest - (*GetMirrorRulesResponse)(nil), // 260: vtctldata.GetMirrorRulesResponse - (*WorkflowMirrorTrafficRequest)(nil), // 261: vtctldata.WorkflowMirrorTrafficRequest - (*WorkflowMirrorTrafficResponse)(nil), // 262: vtctldata.WorkflowMirrorTrafficResponse - nil, // 263: vtctldata.WorkflowOptions.ConfigEntry - nil, // 264: vtctldata.Workflow.ShardStreamsEntry - (*Workflow_ReplicationLocation)(nil), // 265: vtctldata.Workflow.ReplicationLocation - (*Workflow_ShardStream)(nil), // 266: vtctldata.Workflow.ShardStream - (*Workflow_Stream)(nil), // 267: vtctldata.Workflow.Stream - (*Workflow_Stream_CopyState)(nil), // 268: vtctldata.Workflow.Stream.CopyState - (*Workflow_Stream_Log)(nil), // 269: vtctldata.Workflow.Stream.Log - (*Workflow_Stream_ThrottlerStatus)(nil), // 270: vtctldata.Workflow.Stream.ThrottlerStatus - nil, // 271: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - nil, // 272: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - (*ApplyVSchemaResponse_ParamList)(nil), // 273: vtctldata.ApplyVSchemaResponse.ParamList - nil, // 274: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 275: vtctldata.ChangeTabletTagsRequest.TagsEntry - nil, // 276: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - nil, // 277: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - nil, // 278: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 279: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 280: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - nil, // 281: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 282: vtctldata.GetCellsAliasesResponse.AliasesEntry - nil, // 283: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - nil, // 284: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 285: vtctldata.GetSrvKeyspaceNamesResponse.NameList - nil, // 286: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - nil, // 287: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - nil, // 288: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - (*MoveTablesCreateResponse_TabletInfo)(nil), // 289: vtctldata.MoveTablesCreateResponse.TabletInfo - nil, // 290: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 291: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - nil, // 292: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - nil, // 293: vtctldata.ValidateResponse.ResultsByKeyspaceEntry - nil, // 294: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - nil, // 295: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - nil, // 296: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - nil, // 297: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - nil, // 298: vtctldata.VDiffShowResponse.TabletResponsesEntry - (*WorkflowDeleteResponse_TabletInfo)(nil), // 299: vtctldata.WorkflowDeleteResponse.TabletInfo - (*WorkflowStatusResponse_TableCopyState)(nil), // 300: vtctldata.WorkflowStatusResponse.TableCopyState - (*WorkflowStatusResponse_ShardStreamState)(nil), // 301: vtctldata.WorkflowStatusResponse.ShardStreamState - (*WorkflowStatusResponse_ShardStreams)(nil), // 302: vtctldata.WorkflowStatusResponse.ShardStreams - nil, // 303: vtctldata.WorkflowStatusResponse.TableCopyStateEntry - nil, // 304: vtctldata.WorkflowStatusResponse.ShardStreamsEntry - (*WorkflowUpdateResponse_TabletInfo)(nil), // 305: vtctldata.WorkflowUpdateResponse.TabletInfo - (*logutil.Event)(nil), // 306: logutil.Event - (tabletmanagerdata.TabletSelectionPreference)(0), // 307: tabletmanagerdata.TabletSelectionPreference - (*topodata.Keyspace)(nil), // 308: topodata.Keyspace - (*vttime.Time)(nil), // 309: vttime.Time - (*topodata.TabletAlias)(nil), // 310: topodata.TabletAlias - (*vttime.Duration)(nil), // 311: vttime.Duration - (*topodata.Shard)(nil), // 312: topodata.Shard - (*topodata.CellInfo)(nil), // 313: topodata.CellInfo - (*vschema.KeyspaceRoutingRules)(nil), // 314: vschema.KeyspaceRoutingRules - (*vschema.RoutingRules)(nil), // 315: vschema.RoutingRules - (*vschema.ShardRoutingRules)(nil), // 316: vschema.ShardRoutingRules - (*vtrpc.CallerID)(nil), // 317: vtrpc.CallerID - (*vschema.Keyspace)(nil), // 318: vschema.Keyspace - (topodata.TabletType)(0), // 319: topodata.TabletType - (*topodata.Tablet)(nil), // 320: topodata.Tablet - (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 321: tabletmanagerdata.CheckThrottlerResponse - (topodata.KeyspaceType)(0), // 322: topodata.KeyspaceType - (*query.QueryResult)(nil), // 323: query.QueryResult - (*tabletmanagerdata.ExecuteHookRequest)(nil), // 324: tabletmanagerdata.ExecuteHookRequest - (*tabletmanagerdata.ExecuteHookResponse)(nil), // 325: tabletmanagerdata.ExecuteHookResponse - (*mysqlctl.BackupInfo)(nil), // 326: mysqlctl.BackupInfo - (*replicationdata.FullStatus)(nil), // 327: replicationdata.FullStatus - (*tabletmanagerdata.Permissions)(nil), // 328: tabletmanagerdata.Permissions - (*tabletmanagerdata.SchemaDefinition)(nil), // 329: tabletmanagerdata.SchemaDefinition - (*topodata.ThrottledAppRule)(nil), // 330: topodata.ThrottledAppRule - (*vschema.SrvVSchema)(nil), // 331: vschema.SrvVSchema - (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 332: tabletmanagerdata.GetThrottlerStatusResponse - (*query.TransactionMetadata)(nil), // 333: query.TransactionMetadata - (*query.Target)(nil), // 334: query.Target - (*topodata.ShardReplicationError)(nil), // 335: topodata.ShardReplicationError - (*topodata.KeyRange)(nil), // 336: topodata.KeyRange - (*topodata.CellsAlias)(nil), // 337: topodata.CellsAlias - (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 338: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*vschema.MirrorRules)(nil), // 339: vschema.MirrorRules - (*topodata.Shard_TabletControl)(nil), // 340: topodata.Shard.TabletControl - (*binlogdata.BinlogSource)(nil), // 341: binlogdata.BinlogSource - (*topodata.ShardReplication)(nil), // 342: topodata.ShardReplication - (*topodata.SrvKeyspace)(nil), // 343: topodata.SrvKeyspace - (*replicationdata.Status)(nil), // 344: replicationdata.Status - (*tabletmanagerdata.VDiffResponse)(nil), // 345: tabletmanagerdata.VDiffResponse + (*CopySchemaShardRequest)(nil), // 43: vtctldata.CopySchemaShardRequest + (*CopySchemaShardResponse)(nil), // 44: vtctldata.CopySchemaShardResponse + (*CreateKeyspaceRequest)(nil), // 45: vtctldata.CreateKeyspaceRequest + (*CreateKeyspaceResponse)(nil), // 46: vtctldata.CreateKeyspaceResponse + (*CreateShardRequest)(nil), // 47: vtctldata.CreateShardRequest + (*CreateShardResponse)(nil), // 48: vtctldata.CreateShardResponse + (*DeleteCellInfoRequest)(nil), // 49: vtctldata.DeleteCellInfoRequest + (*DeleteCellInfoResponse)(nil), // 50: vtctldata.DeleteCellInfoResponse + (*DeleteCellsAliasRequest)(nil), // 51: vtctldata.DeleteCellsAliasRequest + (*DeleteCellsAliasResponse)(nil), // 52: vtctldata.DeleteCellsAliasResponse + (*DeleteKeyspaceRequest)(nil), // 53: vtctldata.DeleteKeyspaceRequest + (*DeleteKeyspaceResponse)(nil), // 54: vtctldata.DeleteKeyspaceResponse + (*DeleteShardsRequest)(nil), // 55: vtctldata.DeleteShardsRequest + (*DeleteShardsResponse)(nil), // 56: vtctldata.DeleteShardsResponse + (*DeleteSrvVSchemaRequest)(nil), // 57: vtctldata.DeleteSrvVSchemaRequest + (*DeleteSrvVSchemaResponse)(nil), // 58: vtctldata.DeleteSrvVSchemaResponse + (*DeleteTabletsRequest)(nil), // 59: vtctldata.DeleteTabletsRequest + (*DeleteTabletsResponse)(nil), // 60: vtctldata.DeleteTabletsResponse + (*EmergencyReparentShardRequest)(nil), // 61: vtctldata.EmergencyReparentShardRequest + (*EmergencyReparentShardResponse)(nil), // 62: vtctldata.EmergencyReparentShardResponse + (*ExecuteFetchAsAppRequest)(nil), // 63: vtctldata.ExecuteFetchAsAppRequest + (*ExecuteFetchAsAppResponse)(nil), // 64: vtctldata.ExecuteFetchAsAppResponse + (*ExecuteFetchAsDBARequest)(nil), // 65: vtctldata.ExecuteFetchAsDBARequest + (*ExecuteFetchAsDBAResponse)(nil), // 66: vtctldata.ExecuteFetchAsDBAResponse + (*ExecuteHookRequest)(nil), // 67: vtctldata.ExecuteHookRequest + (*ExecuteHookResponse)(nil), // 68: vtctldata.ExecuteHookResponse + (*ExecuteMultiFetchAsDBARequest)(nil), // 69: vtctldata.ExecuteMultiFetchAsDBARequest + (*ExecuteMultiFetchAsDBAResponse)(nil), // 70: vtctldata.ExecuteMultiFetchAsDBAResponse + (*FindAllShardsInKeyspaceRequest)(nil), // 71: vtctldata.FindAllShardsInKeyspaceRequest + (*FindAllShardsInKeyspaceResponse)(nil), // 72: vtctldata.FindAllShardsInKeyspaceResponse + (*ForceCutOverSchemaMigrationRequest)(nil), // 73: vtctldata.ForceCutOverSchemaMigrationRequest + (*ForceCutOverSchemaMigrationResponse)(nil), // 74: vtctldata.ForceCutOverSchemaMigrationResponse + (*GetBackupsRequest)(nil), // 75: vtctldata.GetBackupsRequest + (*GetBackupsResponse)(nil), // 76: vtctldata.GetBackupsResponse + (*GetCellInfoRequest)(nil), // 77: vtctldata.GetCellInfoRequest + (*GetCellInfoResponse)(nil), // 78: vtctldata.GetCellInfoResponse + (*GetCellInfoNamesRequest)(nil), // 79: vtctldata.GetCellInfoNamesRequest + (*GetCellInfoNamesResponse)(nil), // 80: vtctldata.GetCellInfoNamesResponse + (*GetCellsAliasesRequest)(nil), // 81: vtctldata.GetCellsAliasesRequest + (*GetCellsAliasesResponse)(nil), // 82: vtctldata.GetCellsAliasesResponse + (*GetFullStatusRequest)(nil), // 83: vtctldata.GetFullStatusRequest + (*GetFullStatusResponse)(nil), // 84: vtctldata.GetFullStatusResponse + (*GetKeyspacesRequest)(nil), // 85: vtctldata.GetKeyspacesRequest + (*GetKeyspacesResponse)(nil), // 86: vtctldata.GetKeyspacesResponse + (*GetKeyspaceRequest)(nil), // 87: vtctldata.GetKeyspaceRequest + (*GetKeyspaceResponse)(nil), // 88: vtctldata.GetKeyspaceResponse + (*GetPermissionsRequest)(nil), // 89: vtctldata.GetPermissionsRequest + (*GetPermissionsResponse)(nil), // 90: vtctldata.GetPermissionsResponse + (*GetKeyspaceRoutingRulesRequest)(nil), // 91: vtctldata.GetKeyspaceRoutingRulesRequest + (*GetKeyspaceRoutingRulesResponse)(nil), // 92: vtctldata.GetKeyspaceRoutingRulesResponse + (*GetRoutingRulesRequest)(nil), // 93: vtctldata.GetRoutingRulesRequest + (*GetRoutingRulesResponse)(nil), // 94: vtctldata.GetRoutingRulesResponse + (*GetSchemaRequest)(nil), // 95: vtctldata.GetSchemaRequest + (*GetSchemaResponse)(nil), // 96: vtctldata.GetSchemaResponse + (*GetSchemaMigrationsRequest)(nil), // 97: vtctldata.GetSchemaMigrationsRequest + (*GetSchemaMigrationsResponse)(nil), // 98: vtctldata.GetSchemaMigrationsResponse + (*GetShardReplicationRequest)(nil), // 99: vtctldata.GetShardReplicationRequest + (*GetShardReplicationResponse)(nil), // 100: vtctldata.GetShardReplicationResponse + (*GetShardRequest)(nil), // 101: vtctldata.GetShardRequest + (*GetShardResponse)(nil), // 102: vtctldata.GetShardResponse + (*GetShardRoutingRulesRequest)(nil), // 103: vtctldata.GetShardRoutingRulesRequest + (*GetShardRoutingRulesResponse)(nil), // 104: vtctldata.GetShardRoutingRulesResponse + (*GetSrvKeyspaceNamesRequest)(nil), // 105: vtctldata.GetSrvKeyspaceNamesRequest + (*GetSrvKeyspaceNamesResponse)(nil), // 106: vtctldata.GetSrvKeyspaceNamesResponse + (*GetSrvKeyspacesRequest)(nil), // 107: vtctldata.GetSrvKeyspacesRequest + (*GetSrvKeyspacesResponse)(nil), // 108: vtctldata.GetSrvKeyspacesResponse + (*UpdateThrottlerConfigRequest)(nil), // 109: vtctldata.UpdateThrottlerConfigRequest + (*UpdateThrottlerConfigResponse)(nil), // 110: vtctldata.UpdateThrottlerConfigResponse + (*GetSrvVSchemaRequest)(nil), // 111: vtctldata.GetSrvVSchemaRequest + (*GetSrvVSchemaResponse)(nil), // 112: vtctldata.GetSrvVSchemaResponse + (*GetSrvVSchemasRequest)(nil), // 113: vtctldata.GetSrvVSchemasRequest + (*GetSrvVSchemasResponse)(nil), // 114: vtctldata.GetSrvVSchemasResponse + (*GetTabletRequest)(nil), // 115: vtctldata.GetTabletRequest + (*GetTabletResponse)(nil), // 116: vtctldata.GetTabletResponse + (*GetTabletsRequest)(nil), // 117: vtctldata.GetTabletsRequest + (*GetTabletsResponse)(nil), // 118: vtctldata.GetTabletsResponse + (*GetThrottlerStatusRequest)(nil), // 119: vtctldata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 120: vtctldata.GetThrottlerStatusResponse + (*GetTopologyPathRequest)(nil), // 121: vtctldata.GetTopologyPathRequest + (*GetTopologyPathResponse)(nil), // 122: vtctldata.GetTopologyPathResponse + (*TopologyCell)(nil), // 123: vtctldata.TopologyCell + (*GetUnresolvedTransactionsRequest)(nil), // 124: vtctldata.GetUnresolvedTransactionsRequest + (*GetUnresolvedTransactionsResponse)(nil), // 125: vtctldata.GetUnresolvedTransactionsResponse + (*GetTransactionInfoRequest)(nil), // 126: vtctldata.GetTransactionInfoRequest + (*ShardTransactionState)(nil), // 127: vtctldata.ShardTransactionState + (*GetTransactionInfoResponse)(nil), // 128: vtctldata.GetTransactionInfoResponse + (*ConcludeTransactionRequest)(nil), // 129: vtctldata.ConcludeTransactionRequest + (*ConcludeTransactionResponse)(nil), // 130: vtctldata.ConcludeTransactionResponse + (*GetVSchemaRequest)(nil), // 131: vtctldata.GetVSchemaRequest + (*GetVersionRequest)(nil), // 132: vtctldata.GetVersionRequest + (*GetVersionResponse)(nil), // 133: vtctldata.GetVersionResponse + (*GetVSchemaResponse)(nil), // 134: vtctldata.GetVSchemaResponse + (*GetWorkflowsRequest)(nil), // 135: vtctldata.GetWorkflowsRequest + (*GetWorkflowsResponse)(nil), // 136: vtctldata.GetWorkflowsResponse + (*InitShardPrimaryRequest)(nil), // 137: vtctldata.InitShardPrimaryRequest + (*InitShardPrimaryResponse)(nil), // 138: vtctldata.InitShardPrimaryResponse + (*LaunchSchemaMigrationRequest)(nil), // 139: vtctldata.LaunchSchemaMigrationRequest + (*LaunchSchemaMigrationResponse)(nil), // 140: vtctldata.LaunchSchemaMigrationResponse + (*LookupVindexCreateRequest)(nil), // 141: vtctldata.LookupVindexCreateRequest + (*LookupVindexCreateResponse)(nil), // 142: vtctldata.LookupVindexCreateResponse + (*LookupVindexExternalizeRequest)(nil), // 143: vtctldata.LookupVindexExternalizeRequest + (*LookupVindexExternalizeResponse)(nil), // 144: vtctldata.LookupVindexExternalizeResponse + (*MaterializeCreateRequest)(nil), // 145: vtctldata.MaterializeCreateRequest + (*MaterializeCreateResponse)(nil), // 146: vtctldata.MaterializeCreateResponse + (*MigrateCreateRequest)(nil), // 147: vtctldata.MigrateCreateRequest + (*MigrateCompleteRequest)(nil), // 148: vtctldata.MigrateCompleteRequest + (*MigrateCompleteResponse)(nil), // 149: vtctldata.MigrateCompleteResponse + (*MountRegisterRequest)(nil), // 150: vtctldata.MountRegisterRequest + (*MountRegisterResponse)(nil), // 151: vtctldata.MountRegisterResponse + (*MountUnregisterRequest)(nil), // 152: vtctldata.MountUnregisterRequest + (*MountUnregisterResponse)(nil), // 153: vtctldata.MountUnregisterResponse + (*MountShowRequest)(nil), // 154: vtctldata.MountShowRequest + (*MountShowResponse)(nil), // 155: vtctldata.MountShowResponse + (*MountListRequest)(nil), // 156: vtctldata.MountListRequest + (*MountListResponse)(nil), // 157: vtctldata.MountListResponse + (*MoveTablesCreateRequest)(nil), // 158: vtctldata.MoveTablesCreateRequest + (*MoveTablesCreateResponse)(nil), // 159: vtctldata.MoveTablesCreateResponse + (*MoveTablesCompleteRequest)(nil), // 160: vtctldata.MoveTablesCompleteRequest + (*MoveTablesCompleteResponse)(nil), // 161: vtctldata.MoveTablesCompleteResponse + (*PingTabletRequest)(nil), // 162: vtctldata.PingTabletRequest + (*PingTabletResponse)(nil), // 163: vtctldata.PingTabletResponse + (*PlannedReparentShardRequest)(nil), // 164: vtctldata.PlannedReparentShardRequest + (*PlannedReparentShardResponse)(nil), // 165: vtctldata.PlannedReparentShardResponse + (*RebuildKeyspaceGraphRequest)(nil), // 166: vtctldata.RebuildKeyspaceGraphRequest + (*RebuildKeyspaceGraphResponse)(nil), // 167: vtctldata.RebuildKeyspaceGraphResponse + (*RebuildVSchemaGraphRequest)(nil), // 168: vtctldata.RebuildVSchemaGraphRequest + (*RebuildVSchemaGraphResponse)(nil), // 169: vtctldata.RebuildVSchemaGraphResponse + (*RefreshStateRequest)(nil), // 170: vtctldata.RefreshStateRequest + (*RefreshStateResponse)(nil), // 171: vtctldata.RefreshStateResponse + (*RefreshStateByShardRequest)(nil), // 172: vtctldata.RefreshStateByShardRequest + (*RefreshStateByShardResponse)(nil), // 173: vtctldata.RefreshStateByShardResponse + (*ReloadSchemaRequest)(nil), // 174: vtctldata.ReloadSchemaRequest + (*ReloadSchemaResponse)(nil), // 175: vtctldata.ReloadSchemaResponse + (*ReloadSchemaKeyspaceRequest)(nil), // 176: vtctldata.ReloadSchemaKeyspaceRequest + (*ReloadSchemaKeyspaceResponse)(nil), // 177: vtctldata.ReloadSchemaKeyspaceResponse + (*ReloadSchemaShardRequest)(nil), // 178: vtctldata.ReloadSchemaShardRequest + (*ReloadSchemaShardResponse)(nil), // 179: vtctldata.ReloadSchemaShardResponse + (*RemoveBackupRequest)(nil), // 180: vtctldata.RemoveBackupRequest + (*RemoveBackupResponse)(nil), // 181: vtctldata.RemoveBackupResponse + (*RemoveKeyspaceCellRequest)(nil), // 182: vtctldata.RemoveKeyspaceCellRequest + (*RemoveKeyspaceCellResponse)(nil), // 183: vtctldata.RemoveKeyspaceCellResponse + (*RemoveShardCellRequest)(nil), // 184: vtctldata.RemoveShardCellRequest + (*RemoveShardCellResponse)(nil), // 185: vtctldata.RemoveShardCellResponse + (*ReparentTabletRequest)(nil), // 186: vtctldata.ReparentTabletRequest + (*ReparentTabletResponse)(nil), // 187: vtctldata.ReparentTabletResponse + (*ReshardCreateRequest)(nil), // 188: vtctldata.ReshardCreateRequest + (*RestoreFromBackupRequest)(nil), // 189: vtctldata.RestoreFromBackupRequest + (*RestoreFromBackupResponse)(nil), // 190: vtctldata.RestoreFromBackupResponse + (*RetrySchemaMigrationRequest)(nil), // 191: vtctldata.RetrySchemaMigrationRequest + (*RetrySchemaMigrationResponse)(nil), // 192: vtctldata.RetrySchemaMigrationResponse + (*RunHealthCheckRequest)(nil), // 193: vtctldata.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 194: vtctldata.RunHealthCheckResponse + (*SetKeyspaceDurabilityPolicyRequest)(nil), // 195: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*SetKeyspaceDurabilityPolicyResponse)(nil), // 196: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*SetKeyspaceShardingInfoRequest)(nil), // 197: vtctldata.SetKeyspaceShardingInfoRequest + (*SetKeyspaceShardingInfoResponse)(nil), // 198: vtctldata.SetKeyspaceShardingInfoResponse + (*SetShardIsPrimaryServingRequest)(nil), // 199: vtctldata.SetShardIsPrimaryServingRequest + (*SetShardIsPrimaryServingResponse)(nil), // 200: vtctldata.SetShardIsPrimaryServingResponse + (*SetShardTabletControlRequest)(nil), // 201: vtctldata.SetShardTabletControlRequest + (*SetShardTabletControlResponse)(nil), // 202: vtctldata.SetShardTabletControlResponse + (*SetWritableRequest)(nil), // 203: vtctldata.SetWritableRequest + (*SetWritableResponse)(nil), // 204: vtctldata.SetWritableResponse + (*ShardReplicationAddRequest)(nil), // 205: vtctldata.ShardReplicationAddRequest + (*ShardReplicationAddResponse)(nil), // 206: vtctldata.ShardReplicationAddResponse + (*ShardReplicationFixRequest)(nil), // 207: vtctldata.ShardReplicationFixRequest + (*ShardReplicationFixResponse)(nil), // 208: vtctldata.ShardReplicationFixResponse + (*ShardReplicationPositionsRequest)(nil), // 209: vtctldata.ShardReplicationPositionsRequest + (*ShardReplicationPositionsResponse)(nil), // 210: vtctldata.ShardReplicationPositionsResponse + (*ShardReplicationRemoveRequest)(nil), // 211: vtctldata.ShardReplicationRemoveRequest + (*ShardReplicationRemoveResponse)(nil), // 212: vtctldata.ShardReplicationRemoveResponse + (*SleepTabletRequest)(nil), // 213: vtctldata.SleepTabletRequest + (*SleepTabletResponse)(nil), // 214: vtctldata.SleepTabletResponse + (*SourceShardAddRequest)(nil), // 215: vtctldata.SourceShardAddRequest + (*SourceShardAddResponse)(nil), // 216: vtctldata.SourceShardAddResponse + (*SourceShardDeleteRequest)(nil), // 217: vtctldata.SourceShardDeleteRequest + (*SourceShardDeleteResponse)(nil), // 218: vtctldata.SourceShardDeleteResponse + (*StartReplicationRequest)(nil), // 219: vtctldata.StartReplicationRequest + (*StartReplicationResponse)(nil), // 220: vtctldata.StartReplicationResponse + (*StopReplicationRequest)(nil), // 221: vtctldata.StopReplicationRequest + (*StopReplicationResponse)(nil), // 222: vtctldata.StopReplicationResponse + (*TabletExternallyReparentedRequest)(nil), // 223: vtctldata.TabletExternallyReparentedRequest + (*TabletExternallyReparentedResponse)(nil), // 224: vtctldata.TabletExternallyReparentedResponse + (*UpdateCellInfoRequest)(nil), // 225: vtctldata.UpdateCellInfoRequest + (*UpdateCellInfoResponse)(nil), // 226: vtctldata.UpdateCellInfoResponse + (*UpdateCellsAliasRequest)(nil), // 227: vtctldata.UpdateCellsAliasRequest + (*UpdateCellsAliasResponse)(nil), // 228: vtctldata.UpdateCellsAliasResponse + (*ValidateRequest)(nil), // 229: vtctldata.ValidateRequest + (*ValidateResponse)(nil), // 230: vtctldata.ValidateResponse + (*ValidateKeyspaceRequest)(nil), // 231: vtctldata.ValidateKeyspaceRequest + (*ValidateKeyspaceResponse)(nil), // 232: vtctldata.ValidateKeyspaceResponse + (*ValidatePermissionsKeyspaceRequest)(nil), // 233: vtctldata.ValidatePermissionsKeyspaceRequest + (*ValidatePermissionsKeyspaceResponse)(nil), // 234: vtctldata.ValidatePermissionsKeyspaceResponse + (*ValidateSchemaKeyspaceRequest)(nil), // 235: vtctldata.ValidateSchemaKeyspaceRequest + (*ValidateSchemaKeyspaceResponse)(nil), // 236: vtctldata.ValidateSchemaKeyspaceResponse + (*ValidateShardRequest)(nil), // 237: vtctldata.ValidateShardRequest + (*ValidateShardResponse)(nil), // 238: vtctldata.ValidateShardResponse + (*ValidateVersionKeyspaceRequest)(nil), // 239: vtctldata.ValidateVersionKeyspaceRequest + (*ValidateVersionKeyspaceResponse)(nil), // 240: vtctldata.ValidateVersionKeyspaceResponse + (*ValidateVersionShardRequest)(nil), // 241: vtctldata.ValidateVersionShardRequest + (*ValidateVersionShardResponse)(nil), // 242: vtctldata.ValidateVersionShardResponse + (*ValidateVSchemaRequest)(nil), // 243: vtctldata.ValidateVSchemaRequest + (*ValidateVSchemaResponse)(nil), // 244: vtctldata.ValidateVSchemaResponse + (*VDiffCreateRequest)(nil), // 245: vtctldata.VDiffCreateRequest + (*VDiffCreateResponse)(nil), // 246: vtctldata.VDiffCreateResponse + (*VDiffDeleteRequest)(nil), // 247: vtctldata.VDiffDeleteRequest + (*VDiffDeleteResponse)(nil), // 248: vtctldata.VDiffDeleteResponse + (*VDiffResumeRequest)(nil), // 249: vtctldata.VDiffResumeRequest + (*VDiffResumeResponse)(nil), // 250: vtctldata.VDiffResumeResponse + (*VDiffShowRequest)(nil), // 251: vtctldata.VDiffShowRequest + (*VDiffShowResponse)(nil), // 252: vtctldata.VDiffShowResponse + (*VDiffStopRequest)(nil), // 253: vtctldata.VDiffStopRequest + (*VDiffStopResponse)(nil), // 254: vtctldata.VDiffStopResponse + (*WorkflowDeleteRequest)(nil), // 255: vtctldata.WorkflowDeleteRequest + (*WorkflowDeleteResponse)(nil), // 256: vtctldata.WorkflowDeleteResponse + (*WorkflowStatusRequest)(nil), // 257: vtctldata.WorkflowStatusRequest + (*WorkflowStatusResponse)(nil), // 258: vtctldata.WorkflowStatusResponse + (*WorkflowSwitchTrafficRequest)(nil), // 259: vtctldata.WorkflowSwitchTrafficRequest + (*WorkflowSwitchTrafficResponse)(nil), // 260: vtctldata.WorkflowSwitchTrafficResponse + (*WorkflowUpdateRequest)(nil), // 261: vtctldata.WorkflowUpdateRequest + (*WorkflowUpdateResponse)(nil), // 262: vtctldata.WorkflowUpdateResponse + (*GetMirrorRulesRequest)(nil), // 263: vtctldata.GetMirrorRulesRequest + (*GetMirrorRulesResponse)(nil), // 264: vtctldata.GetMirrorRulesResponse + (*WorkflowMirrorTrafficRequest)(nil), // 265: vtctldata.WorkflowMirrorTrafficRequest + (*WorkflowMirrorTrafficResponse)(nil), // 266: vtctldata.WorkflowMirrorTrafficResponse + nil, // 267: vtctldata.WorkflowOptions.ConfigEntry + nil, // 268: vtctldata.Workflow.ShardStreamsEntry + (*Workflow_ReplicationLocation)(nil), // 269: vtctldata.Workflow.ReplicationLocation + (*Workflow_ShardStream)(nil), // 270: vtctldata.Workflow.ShardStream + (*Workflow_Stream)(nil), // 271: vtctldata.Workflow.Stream + (*Workflow_Stream_CopyState)(nil), // 272: vtctldata.Workflow.Stream.CopyState + (*Workflow_Stream_Log)(nil), // 273: vtctldata.Workflow.Stream.Log + (*Workflow_Stream_ThrottlerStatus)(nil), // 274: vtctldata.Workflow.Stream.ThrottlerStatus + nil, // 275: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + nil, // 276: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + (*ApplyVSchemaResponse_ParamList)(nil), // 277: vtctldata.ApplyVSchemaResponse.ParamList + nil, // 278: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 279: vtctldata.ChangeTabletTagsRequest.TagsEntry + nil, // 280: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + nil, // 281: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + nil, // 282: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 283: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 284: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + nil, // 285: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 286: vtctldata.GetCellsAliasesResponse.AliasesEntry + nil, // 287: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + nil, // 288: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 289: vtctldata.GetSrvKeyspaceNamesResponse.NameList + nil, // 290: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + nil, // 291: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + nil, // 292: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + (*MoveTablesCreateResponse_TabletInfo)(nil), // 293: vtctldata.MoveTablesCreateResponse.TabletInfo + nil, // 294: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 295: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + nil, // 296: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + nil, // 297: vtctldata.ValidateResponse.ResultsByKeyspaceEntry + nil, // 298: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + nil, // 299: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + nil, // 300: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + nil, // 301: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + nil, // 302: vtctldata.VDiffShowResponse.TabletResponsesEntry + (*WorkflowDeleteResponse_TabletInfo)(nil), // 303: vtctldata.WorkflowDeleteResponse.TabletInfo + (*WorkflowStatusResponse_TableCopyState)(nil), // 304: vtctldata.WorkflowStatusResponse.TableCopyState + (*WorkflowStatusResponse_ShardStreamState)(nil), // 305: vtctldata.WorkflowStatusResponse.ShardStreamState + (*WorkflowStatusResponse_ShardStreams)(nil), // 306: vtctldata.WorkflowStatusResponse.ShardStreams + nil, // 307: vtctldata.WorkflowStatusResponse.TableCopyStateEntry + nil, // 308: vtctldata.WorkflowStatusResponse.ShardStreamsEntry + (*WorkflowUpdateResponse_TabletInfo)(nil), // 309: vtctldata.WorkflowUpdateResponse.TabletInfo + (*logutil.Event)(nil), // 310: logutil.Event + (tabletmanagerdata.TabletSelectionPreference)(0), // 311: tabletmanagerdata.TabletSelectionPreference + (*topodata.Keyspace)(nil), // 312: topodata.Keyspace + (*vttime.Time)(nil), // 313: vttime.Time + (*topodata.TabletAlias)(nil), // 314: topodata.TabletAlias + (*vttime.Duration)(nil), // 315: vttime.Duration + (*topodata.Shard)(nil), // 316: topodata.Shard + (*topodata.CellInfo)(nil), // 317: topodata.CellInfo + (*vschema.KeyspaceRoutingRules)(nil), // 318: vschema.KeyspaceRoutingRules + (*vschema.RoutingRules)(nil), // 319: vschema.RoutingRules + (*vschema.ShardRoutingRules)(nil), // 320: vschema.ShardRoutingRules + (*vtrpc.CallerID)(nil), // 321: vtrpc.CallerID + (*vschema.Keyspace)(nil), // 322: vschema.Keyspace + (topodata.TabletType)(0), // 323: topodata.TabletType + (*topodata.Tablet)(nil), // 324: topodata.Tablet + (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 325: tabletmanagerdata.CheckThrottlerResponse + (topodata.KeyspaceType)(0), // 326: topodata.KeyspaceType + (*query.QueryResult)(nil), // 327: query.QueryResult + (*tabletmanagerdata.ExecuteHookRequest)(nil), // 328: tabletmanagerdata.ExecuteHookRequest + (*tabletmanagerdata.ExecuteHookResponse)(nil), // 329: tabletmanagerdata.ExecuteHookResponse + (*mysqlctl.BackupInfo)(nil), // 330: mysqlctl.BackupInfo + (*replicationdata.FullStatus)(nil), // 331: replicationdata.FullStatus + (*tabletmanagerdata.Permissions)(nil), // 332: tabletmanagerdata.Permissions + (*tabletmanagerdata.SchemaDefinition)(nil), // 333: tabletmanagerdata.SchemaDefinition + (*topodata.ThrottledAppRule)(nil), // 334: topodata.ThrottledAppRule + (*vschema.SrvVSchema)(nil), // 335: vschema.SrvVSchema + (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 336: tabletmanagerdata.GetThrottlerStatusResponse + (*query.TransactionMetadata)(nil), // 337: query.TransactionMetadata + (*query.Target)(nil), // 338: query.Target + (*topodata.ShardReplicationError)(nil), // 339: topodata.ShardReplicationError + (*topodata.KeyRange)(nil), // 340: topodata.KeyRange + (*topodata.CellsAlias)(nil), // 341: topodata.CellsAlias + (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 342: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*vschema.MirrorRules)(nil), // 343: vschema.MirrorRules + (*topodata.Shard_TabletControl)(nil), // 344: topodata.Shard.TabletControl + (*binlogdata.BinlogSource)(nil), // 345: binlogdata.BinlogSource + (*topodata.ShardReplication)(nil), // 346: topodata.ShardReplication + (*topodata.SrvKeyspace)(nil), // 347: topodata.SrvKeyspace + (*replicationdata.Status)(nil), // 348: replicationdata.Status + (*tabletmanagerdata.VDiffResponse)(nil), // 349: tabletmanagerdata.VDiffResponse } var file_vtctldata_proto_depIdxs = []int32{ - 306, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event + 310, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event 7, // 1: vtctldata.MaterializeSettings.table_settings:type_name -> vtctldata.TableMaterializeSettings 0, // 2: vtctldata.MaterializeSettings.materialization_intent:type_name -> vtctldata.MaterializationIntent - 307, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 311, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 12, // 4: vtctldata.MaterializeSettings.workflow_options:type_name -> vtctldata.WorkflowOptions - 308, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace + 312, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace 3, // 6: vtctldata.SchemaMigration.strategy:type_name -> vtctldata.SchemaMigration.Strategy - 309, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time - 309, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time - 309, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time - 309, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time - 309, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time - 309, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time - 309, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time + 313, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time + 313, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time + 313, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time + 313, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time + 313, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time + 313, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time + 313, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time 4, // 14: vtctldata.SchemaMigration.status:type_name -> vtctldata.SchemaMigration.Status - 310, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias - 311, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration - 309, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time - 309, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time - 309, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time - 309, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time - 312, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard + 314, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias + 315, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration + 313, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time + 313, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time + 313, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time + 313, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time + 316, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard 2, // 22: vtctldata.WorkflowOptions.sharded_auto_increment_handling:type_name -> vtctldata.ShardedAutoIncrementHandling - 263, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry - 265, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation - 265, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation - 264, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry + 267, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry + 269, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation + 269, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation + 268, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry 12, // 27: vtctldata.Workflow.options:type_name -> vtctldata.WorkflowOptions - 313, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 314, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 314, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 315, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules - 316, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 311, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration - 317, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID - 271, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - 318, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace - 318, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 272, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - 310, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 306, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event - 274, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - 310, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias - 275, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry - 276, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - 277, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - 310, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias - 319, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType - 320, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet - 320, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet - 310, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias - 321, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse - 278, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - 279, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - 322, // 56: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType - 309, // 57: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time - 9, // 58: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 9, // 59: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace - 11, // 60: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard - 11, // 61: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard - 310, // 62: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 310, // 63: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 310, // 64: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias - 311, // 65: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 310, // 66: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 310, // 67: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 306, // 68: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event - 310, // 69: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 70: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 310, // 71: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 72: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult - 310, // 73: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias - 324, // 74: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest - 325, // 75: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse - 310, // 76: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 77: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult - 280, // 78: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - 281, // 79: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - 326, // 80: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo - 313, // 81: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 282, // 82: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry - 310, // 83: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 327, // 84: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus - 9, // 85: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace - 9, // 86: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 310, // 87: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias - 328, // 88: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 314, // 89: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 315, // 90: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules - 310, // 91: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 329, // 92: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition - 4, // 93: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status - 311, // 94: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration - 1, // 95: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering - 10, // 96: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration - 283, // 97: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - 11, // 98: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard - 316, // 99: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 284, // 100: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - 286, // 101: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - 330, // 102: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule - 331, // 103: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema - 287, // 104: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - 310, // 105: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 320, // 106: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet - 310, // 107: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 319, // 108: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType - 320, // 109: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet - 310, // 110: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 332, // 111: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse - 121, // 112: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell - 333, // 113: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata - 333, // 114: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata - 125, // 115: vtctldata.GetTransactionInfoResponse.shard_states:type_name -> vtctldata.ShardTransactionState - 334, // 116: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target - 310, // 117: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias - 318, // 118: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 13, // 119: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow - 310, // 120: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias - 311, // 121: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration - 306, // 122: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event - 288, // 123: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - 318, // 124: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace - 319, // 125: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 126: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 8, // 127: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings - 319, // 128: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 129: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 319, // 130: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 131: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 12, // 132: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 289, // 133: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo - 310, // 134: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 135: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 310, // 136: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias - 311, // 137: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 311, // 138: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration - 310, // 139: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 310, // 140: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 306, // 141: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event - 310, // 142: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 143: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 306, // 144: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event - 306, // 145: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event - 310, // 146: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias - 310, // 147: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias - 319, // 148: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 149: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 12, // 150: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 310, // 151: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 309, // 152: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 309, // 153: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 310, // 154: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 306, // 155: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 290, // 156: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - 310, // 157: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias - 308, // 158: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace - 308, // 159: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace - 312, // 160: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard - 319, // 161: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType - 312, // 162: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard - 310, // 163: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 164: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias - 335, // 165: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError - 291, // 166: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - 292, // 167: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - 310, // 168: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 169: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 311, // 170: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration - 336, // 171: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange - 312, // 172: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard - 312, // 173: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard - 310, // 174: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 175: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 176: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias - 310, // 177: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias - 310, // 178: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias - 313, // 179: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 313, // 180: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 337, // 181: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias - 337, // 182: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias - 293, // 183: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry - 294, // 184: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - 295, // 185: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - 296, // 186: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - 297, // 187: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - 319, // 188: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType - 307, // 189: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 311, // 190: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration - 311, // 191: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration - 311, // 192: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration - 298, // 193: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry - 299, // 194: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo - 303, // 195: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry - 304, // 196: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry - 319, // 197: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType - 311, // 198: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration - 311, // 199: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration - 338, // 200: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest - 305, // 201: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo - 339, // 202: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules - 319, // 203: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType - 266, // 204: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream - 267, // 205: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream - 340, // 206: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl - 310, // 207: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias - 341, // 208: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource - 309, // 209: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time - 309, // 210: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time - 268, // 211: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState - 269, // 212: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log - 270, // 213: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus - 319, // 214: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType - 307, // 215: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 309, // 216: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time - 309, // 217: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time - 309, // 218: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time - 273, // 219: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList - 11, // 220: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard - 337, // 221: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias - 342, // 222: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication - 285, // 223: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList - 343, // 224: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace - 331, // 225: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema - 310, // 226: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 344, // 227: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status - 320, // 228: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet - 230, // 229: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse - 234, // 230: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 231: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 232: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 234, // 233: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 345, // 234: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse - 310, // 235: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 310, // 236: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias - 301, // 237: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState - 300, // 238: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState - 302, // 239: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams - 310, // 240: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 241, // [241:241] is the sub-list for method output_type - 241, // [241:241] is the sub-list for method input_type - 241, // [241:241] is the sub-list for extension type_name - 241, // [241:241] is the sub-list for extension extendee - 0, // [0:241] is the sub-list for field type_name + 317, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 318, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 318, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 319, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules + 320, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 315, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration + 321, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID + 275, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + 322, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace + 322, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 276, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + 314, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 310, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event + 278, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias + 279, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry + 280, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + 281, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + 314, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias + 323, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType + 324, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet + 324, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet + 314, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias + 325, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse + 282, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + 283, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 56: vtctldata.CopySchemaShardRequest.source_tablet_alias:type_name -> topodata.TabletAlias + 315, // 57: vtctldata.CopySchemaShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 326, // 58: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType + 313, // 59: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time + 9, // 60: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 9, // 61: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace + 11, // 62: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard + 11, // 63: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard + 314, // 64: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 314, // 65: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 314, // 66: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias + 315, // 67: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 314, // 68: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 314, // 69: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 310, // 70: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event + 314, // 71: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 72: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 314, // 73: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 74: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult + 314, // 75: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias + 328, // 76: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest + 329, // 77: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse + 314, // 78: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 79: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult + 284, // 80: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + 285, // 81: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + 330, // 82: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo + 317, // 83: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 286, // 84: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry + 314, // 85: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 331, // 86: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus + 9, // 87: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace + 9, // 88: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 314, // 89: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias + 332, // 90: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions + 318, // 91: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 319, // 92: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules + 314, // 93: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 333, // 94: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition + 4, // 95: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status + 315, // 96: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration + 1, // 97: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering + 10, // 98: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration + 287, // 99: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + 11, // 100: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard + 320, // 101: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 288, // 102: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + 290, // 103: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + 334, // 104: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule + 335, // 105: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema + 291, // 106: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + 314, // 107: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 324, // 108: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet + 314, // 109: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 323, // 110: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType + 324, // 111: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet + 314, // 112: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 336, // 113: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse + 123, // 114: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell + 337, // 115: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 337, // 116: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata + 127, // 117: vtctldata.GetTransactionInfoResponse.shard_states:type_name -> vtctldata.ShardTransactionState + 338, // 118: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target + 314, // 119: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias + 322, // 120: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 13, // 121: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow + 314, // 122: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias + 315, // 123: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration + 310, // 124: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event + 292, // 125: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + 322, // 126: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace + 323, // 127: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 128: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 8, // 129: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings + 323, // 130: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 131: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 323, // 132: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 133: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 134: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 293, // 135: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo + 314, // 136: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 137: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 314, // 138: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias + 315, // 139: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 315, // 140: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration + 314, // 141: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 314, // 142: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 310, // 143: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event + 314, // 144: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 145: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 310, // 146: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event + 310, // 147: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event + 314, // 148: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias + 314, // 149: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias + 323, // 150: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 151: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 152: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 314, // 153: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 313, // 154: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 313, // 155: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 314, // 156: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 310, // 157: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 294, // 158: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + 314, // 159: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias + 312, // 160: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace + 312, // 161: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace + 316, // 162: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard + 323, // 163: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType + 316, // 164: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard + 314, // 165: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 166: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias + 339, // 167: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError + 295, // 168: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + 296, // 169: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + 314, // 170: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 171: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 315, // 172: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration + 340, // 173: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange + 316, // 174: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard + 316, // 175: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard + 314, // 176: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 177: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 178: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias + 314, // 179: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias + 314, // 180: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias + 317, // 181: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 317, // 182: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 341, // 183: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias + 341, // 184: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias + 297, // 185: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry + 298, // 186: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + 299, // 187: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + 300, // 188: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + 301, // 189: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + 323, // 190: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType + 311, // 191: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 315, // 192: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration + 315, // 193: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration + 315, // 194: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration + 302, // 195: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry + 303, // 196: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo + 307, // 197: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry + 308, // 198: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry + 323, // 199: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType + 315, // 200: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration + 315, // 201: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration + 342, // 202: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest + 309, // 203: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo + 343, // 204: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules + 323, // 205: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType + 270, // 206: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream + 271, // 207: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream + 344, // 208: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl + 314, // 209: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias + 345, // 210: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource + 313, // 211: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time + 313, // 212: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time + 272, // 213: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState + 273, // 214: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log + 274, // 215: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus + 323, // 216: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType + 311, // 217: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 313, // 218: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time + 313, // 219: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time + 313, // 220: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time + 277, // 221: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList + 11, // 222: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard + 341, // 223: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias + 346, // 224: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication + 289, // 225: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList + 347, // 226: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace + 335, // 227: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema + 314, // 228: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 348, // 229: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status + 324, // 230: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet + 232, // 231: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse + 238, // 232: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 233: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 234: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 238, // 235: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 349, // 236: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse + 314, // 237: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 314, // 238: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias + 305, // 239: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState + 304, // 240: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState + 306, // 241: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams + 314, // 242: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 243, // [243:243] is the sub-list for method output_type + 243, // [243:243] is the sub-list for method input_type + 243, // [243:243] is the sub-list for extension type_name + 243, // [243:243] is the sub-list for extension extendee + 0, // [0:243] is the sub-list for field type_name } func init() { file_vtctldata_proto_init() } @@ -20004,14 +20284,14 @@ func file_vtctldata_proto_init() { return } file_vtctldata_proto_msgTypes[23].OneofWrappers = []any{} - file_vtctldata_proto_msgTypes[236].OneofWrappers = []any{} + file_vtctldata_proto_msgTypes[240].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vtctldata_proto_rawDesc, NumEnums: 5, - NumMessages: 301, + NumMessages: 305, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go index 947b5ce9f43..f50e5e25614 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -1125,6 +1125,54 @@ func (m *CompleteSchemaMigrationResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *CopySchemaShardRequest) CloneVT() *CopySchemaShardRequest { + if m == nil { + return (*CopySchemaShardRequest)(nil) + } + r := new(CopySchemaShardRequest) + r.SourceTabletAlias = m.SourceTabletAlias.CloneVT() + r.IncludeViews = m.IncludeViews + r.SkipVerify = m.SkipVerify + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() + r.DestinationKeyspace = m.DestinationKeyspace + r.DestinationShard = m.DestinationShard + if rhs := m.Tables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Tables = tmpContainer + } + if rhs := m.ExcludeTables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ExcludeTables = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CopySchemaShardRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *CopySchemaShardResponse) CloneVT() *CopySchemaShardResponse { + if m == nil { + return (*CopySchemaShardResponse)(nil) + } + r := new(CopySchemaShardResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *CopySchemaShardResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *CreateKeyspaceRequest) CloneVT() *CreateKeyspaceRequest { if m == nil { return (*CreateKeyspaceRequest)(nil) @@ -4935,6 +4983,44 @@ func (m *ValidateKeyspaceResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ValidatePermissionsKeyspaceRequest) CloneVT() *ValidatePermissionsKeyspaceRequest { + if m == nil { + return (*ValidatePermissionsKeyspaceRequest)(nil) + } + r := new(ValidatePermissionsKeyspaceRequest) + r.Keyspace = m.Keyspace + if rhs := m.Shards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Shards = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidatePermissionsKeyspaceRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ValidatePermissionsKeyspaceResponse) CloneVT() *ValidatePermissionsKeyspaceResponse { + if m == nil { + return (*ValidatePermissionsKeyspaceResponse)(nil) + } + r := new(ValidatePermissionsKeyspaceResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidatePermissionsKeyspaceResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest { if m == nil { return (*ValidateSchemaKeyspaceRequest)(nil) @@ -4949,6 +5035,11 @@ func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest copy(tmpContainer, rhs) r.ExcludeTables = tmpContainer } + if rhs := m.Shards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Shards = tmpContainer + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -9213,6 +9304,144 @@ func (m *CompleteSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *CopySchemaShardRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CopySchemaShardRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CopySchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.DestinationShard) > 0 { + i -= len(m.DestinationShard) + copy(dAtA[i:], m.DestinationShard) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DestinationShard))) + i-- + dAtA[i] = 0x42 + } + if len(m.DestinationKeyspace) > 0 { + i -= len(m.DestinationKeyspace) + copy(dAtA[i:], m.DestinationKeyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DestinationKeyspace))) + i-- + dAtA[i] = 0x3a + } + if m.WaitReplicasTimeout != nil { + size, err := m.WaitReplicasTimeout.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } + if m.SkipVerify { + i-- + if m.SkipVerify { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.IncludeViews { + i-- + if m.IncludeViews { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.ExcludeTables) > 0 { + for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExcludeTables[iNdEx]) + copy(dAtA[i:], m.ExcludeTables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Tables) > 0 { + for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Tables[iNdEx]) + copy(dAtA[i:], m.Tables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.SourceTabletAlias != nil { + size, err := m.SourceTabletAlias.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CopySchemaShardResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CopySchemaShardResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *CopySchemaShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *CreateKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -19246,6 +19475,88 @@ func (m *ValidateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *ValidatePermissionsKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatePermissionsKeyspaceRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ValidatePermissionsKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ValidatePermissionsKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *ValidateSchemaKeyspaceRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -19276,6 +19587,15 @@ func (m *ValidateSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } if m.IncludeVschema { i-- if m.IncludeVschema { @@ -22908,6 +23228,60 @@ func (m *CompleteSchemaMigrationResponse) SizeVT() (n int) { return n } +func (m *CopySchemaShardRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SourceTabletAlias != nil { + l = m.SourceTabletAlias.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Tables) > 0 { + for _, s := range m.Tables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExcludeTables) > 0 { + for _, s := range m.ExcludeTables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.IncludeViews { + n += 2 + } + if m.SkipVerify { + n += 2 + } + if m.WaitReplicasTimeout != nil { + l = m.WaitReplicasTimeout.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DestinationKeyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DestinationShard) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CopySchemaShardResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *CreateKeyspaceRequest) SizeVT() (n int) { if m == nil { return 0 @@ -26585,6 +26959,36 @@ func (m *ValidateKeyspaceResponse) SizeVT() (n int) { return n } +func (m *ValidatePermissionsKeyspaceRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ValidatePermissionsKeyspaceResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { if m == nil { return 0 @@ -26610,6 +27014,12 @@ func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { if m.IncludeVschema { n += 2 } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } n += len(m.unknownFields) return n } @@ -36892,125 +37302,467 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CompleteSchemaMigrationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: CompleteSchemaMigrationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompleteSchemaMigrationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RowsAffectedByShard", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RowsAffectedByShard == nil { + m.RowsAffectedByShard = make(map[string]uint64) + } + var mapkey string + var mapvalue uint64 + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.RowsAffectedByShard[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CopySchemaShardRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CopySchemaShardRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CopySchemaShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceTabletAlias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SourceTabletAlias == nil { + m.SourceTabletAlias = &topodata.TabletAlias{} + } + if err := m.SourceTabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tables", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tables = append(m.Tables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeTables", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeTables = append(m.ExcludeTables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeViews", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeViews = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkipVerify", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SkipVerify = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitReplicasTimeout", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitReplicasTimeout == nil { + m.WaitReplicasTimeout = &vttime.Duration{} + } + if err := m.WaitReplicasTimeout.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationKeyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestinationKeyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationShard", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestinationShard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CopySchemaShardResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CopySchemaShardResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CompleteSchemaMigrationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CopySchemaShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RowsAffectedByShard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.RowsAffectedByShard == nil { - m.RowsAffectedByShard = make(map[string]uint64) - } - var mapkey string - var mapvalue uint64 - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return protohelpers.ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return protohelpers.ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - } else { - iNdEx = entryPreIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protohelpers.ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.RowsAffectedByShard[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -58706,7 +59458,181 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { +func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SourceShardDeleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SourceShardDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Shard == nil { + m.Shard = &topodata.Shard{} + } + if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletAlias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TabletAlias == nil { + m.TabletAlias = &topodata.TabletAlias{} + } + if err := m.TabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58729,48 +59655,12 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SourceShardDeleteResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SourceShardDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Shard == nil { - m.Shard = &topodata.Shard{} - } - if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -58793,7 +59683,7 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58816,10 +59706,10 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -58880,7 +59770,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58903,10 +59793,10 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -58931,7 +59821,7 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -58954,15 +59844,15 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletAlias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -58989,10 +59879,10 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.TabletAlias == nil { - m.TabletAlias = &topodata.TabletAlias{} + if m.Tablet == nil { + m.Tablet = &topodata.TabletAlias{} } - if err := m.TabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59018,7 +59908,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59041,66 +59931,115 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyReparentedResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyReparentedResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { return protohelpers.ErrInvalidLength } - if (iNdEx + skippy) > l { + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - if iNdEx >= l { + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NewPrimary == nil { + m.NewPrimary = &topodata.TabletAlias{} + } + if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59127,10 +60066,10 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Tablet == nil { - m.Tablet = &topodata.TabletAlias{} + if m.OldPrimary == nil { + m.OldPrimary = &topodata.TabletAlias{} } - if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59156,7 +60095,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59179,47 +60118,15 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyReparentedResponse: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellInfoRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyReparentedResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Keyspace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -59247,47 +60154,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.NewPrimary == nil { - m.NewPrimary = &topodata.TabletAlias{} - } - if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CellInfo", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59314,10 +60185,10 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.OldPrimary == nil { - m.OldPrimary = &topodata.TabletAlias{} + if m.CellInfo == nil { + m.CellInfo = &topodata.CellInfo{} } - if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CellInfo.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59343,7 +60214,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59366,10 +60237,10 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellInfoResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59462,7 +60333,7 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59485,10 +60356,10 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellsAliasRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellsAliasRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59525,7 +60396,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CellInfo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CellsAlias", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59552,10 +60423,10 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CellInfo == nil { - m.CellInfo = &topodata.CellInfo{} + if m.CellsAlias == nil { + m.CellsAlias = &topodata.CellsAlias{} } - if err := m.CellInfo.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CellsAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -59581,7 +60452,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { +func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59604,10 +60475,10 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellsAliasRequest: wiretype end group for non-group") + return fmt.Errorf("proto: UpdateCellsAliasResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellsAliasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UpdateCellsAliasResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59700,7 +60571,7 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59723,15 +60594,86 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UpdateCellsAliasResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateCellsAliasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PingTablets = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -59759,11 +60701,11 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Results = append(m.Results, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CellsAlias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResultsByKeyspace", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59790,12 +60732,105 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CellsAlias == nil { - m.CellsAlias = &topodata.CellsAlias{} + if m.ResultsByKeyspace == nil { + m.ResultsByKeyspace = make(map[string]*ValidateKeyspaceResponse) } - if err := m.CellsAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue *ValidateKeyspaceResponse + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &ValidateKeyspaceResponse{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.ResultsByKeyspace[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -59819,7 +60854,7 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59842,13 +60877,45 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) } @@ -59890,7 +60957,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -59913,10 +60980,10 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateKeyspaceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -59953,7 +61020,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultsByKeyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResultsByShard", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -59980,11 +61047,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ResultsByKeyspace == nil { - m.ResultsByKeyspace = make(map[string]*ValidateKeyspaceResponse) + if m.ResultsByShard == nil { + m.ResultsByShard = make(map[string]*ValidateShardResponse) } var mapkey string - var mapvalue *ValidateKeyspaceResponse + var mapvalue *ValidateShardResponse for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 @@ -60058,7 +61125,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { if postmsgIndex > l { return io.ErrUnexpectedEOF } - mapvalue = &ValidateKeyspaceResponse{} + mapvalue = &ValidateShardResponse{} if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { return err } @@ -60078,7 +61145,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.ResultsByKeyspace[mapkey] = mapvalue + m.ResultsByShard[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -60102,7 +61169,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidatePermissionsKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -60125,10 +61192,10 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatePermissionsKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatePermissionsKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -60164,10 +61231,10 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return protohelpers.ErrIntOverflow @@ -60177,12 +61244,24 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.PingTablets = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -60205,7 +61284,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidatePermissionsKeyspaceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -60228,173 +61307,12 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateKeyspaceResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidatePermissionsKeyspaceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidatePermissionsKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Results = append(m.Results, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultsByShard", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protohelpers.ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ResultsByShard == nil { - m.ResultsByShard = make(map[string]*ValidateShardResponse) - } - var mapkey string - var mapvalue *ValidateShardResponse - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return protohelpers.ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return protohelpers.ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return protohelpers.ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return protohelpers.ErrInvalidLength - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return protohelpers.ErrInvalidLength - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &ValidateShardResponse{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := protohelpers.Skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return protohelpers.ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.ResultsByShard[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -60570,6 +61488,38 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } } m.IncludeVschema = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index 9ffe2fa9aae..e645214b5dd 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -51,7 +51,7 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0x85, 0x5b, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xe1, 0x5c, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, @@ -147,643 +147,656 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x43, 0x6f, 0x70, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x51, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, + 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, - 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, - 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, - 0x44, 0x42, 0x41, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, - 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x12, 0x23, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, + 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x44, 0x42, 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, - 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x72, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, - 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, - 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, + 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x46, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, + 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7e, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, + 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x10, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, + 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x49, 0x6e, + 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x15, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, - 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x4c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, - 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x63, 0x0a, 0x12, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, - 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, - 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, - 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x57, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x62, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, - 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, - 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, + 0x5a, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5b, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, + 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, + 0x6c, 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x69, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, + 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, + 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x15, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, - 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x64, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, + 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, - 0x1a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, - 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x69, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x72, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, - 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, + 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, + 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, + 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_vtctlservice_proto_goTypes = []any{ @@ -804,233 +817,237 @@ var file_vtctlservice_proto_goTypes = []any{ (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 14: vtctldata.CleanupSchemaMigrationRequest (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 15: vtctldata.CompleteSchemaMigrationRequest (*vtctldata.ConcludeTransactionRequest)(nil), // 16: vtctldata.ConcludeTransactionRequest - (*vtctldata.CreateKeyspaceRequest)(nil), // 17: vtctldata.CreateKeyspaceRequest - (*vtctldata.CreateShardRequest)(nil), // 18: vtctldata.CreateShardRequest - (*vtctldata.DeleteCellInfoRequest)(nil), // 19: vtctldata.DeleteCellInfoRequest - (*vtctldata.DeleteCellsAliasRequest)(nil), // 20: vtctldata.DeleteCellsAliasRequest - (*vtctldata.DeleteKeyspaceRequest)(nil), // 21: vtctldata.DeleteKeyspaceRequest - (*vtctldata.DeleteShardsRequest)(nil), // 22: vtctldata.DeleteShardsRequest - (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 23: vtctldata.DeleteSrvVSchemaRequest - (*vtctldata.DeleteTabletsRequest)(nil), // 24: vtctldata.DeleteTabletsRequest - (*vtctldata.EmergencyReparentShardRequest)(nil), // 25: vtctldata.EmergencyReparentShardRequest - (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 26: vtctldata.ExecuteFetchAsAppRequest - (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 27: vtctldata.ExecuteFetchAsDBARequest - (*vtctldata.ExecuteHookRequest)(nil), // 28: vtctldata.ExecuteHookRequest - (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 29: vtctldata.ExecuteMultiFetchAsDBARequest - (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 30: vtctldata.FindAllShardsInKeyspaceRequest - (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 31: vtctldata.ForceCutOverSchemaMigrationRequest - (*vtctldata.GetBackupsRequest)(nil), // 32: vtctldata.GetBackupsRequest - (*vtctldata.GetCellInfoRequest)(nil), // 33: vtctldata.GetCellInfoRequest - (*vtctldata.GetCellInfoNamesRequest)(nil), // 34: vtctldata.GetCellInfoNamesRequest - (*vtctldata.GetCellsAliasesRequest)(nil), // 35: vtctldata.GetCellsAliasesRequest - (*vtctldata.GetFullStatusRequest)(nil), // 36: vtctldata.GetFullStatusRequest - (*vtctldata.GetKeyspaceRequest)(nil), // 37: vtctldata.GetKeyspaceRequest - (*vtctldata.GetKeyspacesRequest)(nil), // 38: vtctldata.GetKeyspacesRequest - (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 39: vtctldata.GetKeyspaceRoutingRulesRequest - (*vtctldata.GetPermissionsRequest)(nil), // 40: vtctldata.GetPermissionsRequest - (*vtctldata.GetRoutingRulesRequest)(nil), // 41: vtctldata.GetRoutingRulesRequest - (*vtctldata.GetSchemaRequest)(nil), // 42: vtctldata.GetSchemaRequest - (*vtctldata.GetSchemaMigrationsRequest)(nil), // 43: vtctldata.GetSchemaMigrationsRequest - (*vtctldata.GetShardReplicationRequest)(nil), // 44: vtctldata.GetShardReplicationRequest - (*vtctldata.GetShardRequest)(nil), // 45: vtctldata.GetShardRequest - (*vtctldata.GetShardRoutingRulesRequest)(nil), // 46: vtctldata.GetShardRoutingRulesRequest - (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 47: vtctldata.GetSrvKeyspaceNamesRequest - (*vtctldata.GetSrvKeyspacesRequest)(nil), // 48: vtctldata.GetSrvKeyspacesRequest - (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 49: vtctldata.UpdateThrottlerConfigRequest - (*vtctldata.GetSrvVSchemaRequest)(nil), // 50: vtctldata.GetSrvVSchemaRequest - (*vtctldata.GetSrvVSchemasRequest)(nil), // 51: vtctldata.GetSrvVSchemasRequest - (*vtctldata.GetTabletRequest)(nil), // 52: vtctldata.GetTabletRequest - (*vtctldata.GetTabletsRequest)(nil), // 53: vtctldata.GetTabletsRequest - (*vtctldata.GetThrottlerStatusRequest)(nil), // 54: vtctldata.GetThrottlerStatusRequest - (*vtctldata.GetTopologyPathRequest)(nil), // 55: vtctldata.GetTopologyPathRequest - (*vtctldata.GetTransactionInfoRequest)(nil), // 56: vtctldata.GetTransactionInfoRequest - (*vtctldata.GetUnresolvedTransactionsRequest)(nil), // 57: vtctldata.GetUnresolvedTransactionsRequest - (*vtctldata.GetVersionRequest)(nil), // 58: vtctldata.GetVersionRequest - (*vtctldata.GetVSchemaRequest)(nil), // 59: vtctldata.GetVSchemaRequest - (*vtctldata.GetWorkflowsRequest)(nil), // 60: vtctldata.GetWorkflowsRequest - (*vtctldata.InitShardPrimaryRequest)(nil), // 61: vtctldata.InitShardPrimaryRequest - (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 62: vtctldata.LaunchSchemaMigrationRequest - (*vtctldata.LookupVindexCreateRequest)(nil), // 63: vtctldata.LookupVindexCreateRequest - (*vtctldata.LookupVindexExternalizeRequest)(nil), // 64: vtctldata.LookupVindexExternalizeRequest - (*vtctldata.MaterializeCreateRequest)(nil), // 65: vtctldata.MaterializeCreateRequest - (*vtctldata.MigrateCreateRequest)(nil), // 66: vtctldata.MigrateCreateRequest - (*vtctldata.MountRegisterRequest)(nil), // 67: vtctldata.MountRegisterRequest - (*vtctldata.MountUnregisterRequest)(nil), // 68: vtctldata.MountUnregisterRequest - (*vtctldata.MountShowRequest)(nil), // 69: vtctldata.MountShowRequest - (*vtctldata.MountListRequest)(nil), // 70: vtctldata.MountListRequest - (*vtctldata.MoveTablesCreateRequest)(nil), // 71: vtctldata.MoveTablesCreateRequest - (*vtctldata.MoveTablesCompleteRequest)(nil), // 72: vtctldata.MoveTablesCompleteRequest - (*vtctldata.PingTabletRequest)(nil), // 73: vtctldata.PingTabletRequest - (*vtctldata.PlannedReparentShardRequest)(nil), // 74: vtctldata.PlannedReparentShardRequest - (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 75: vtctldata.RebuildKeyspaceGraphRequest - (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 76: vtctldata.RebuildVSchemaGraphRequest - (*vtctldata.RefreshStateRequest)(nil), // 77: vtctldata.RefreshStateRequest - (*vtctldata.RefreshStateByShardRequest)(nil), // 78: vtctldata.RefreshStateByShardRequest - (*vtctldata.ReloadSchemaRequest)(nil), // 79: vtctldata.ReloadSchemaRequest - (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 80: vtctldata.ReloadSchemaKeyspaceRequest - (*vtctldata.ReloadSchemaShardRequest)(nil), // 81: vtctldata.ReloadSchemaShardRequest - (*vtctldata.RemoveBackupRequest)(nil), // 82: vtctldata.RemoveBackupRequest - (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 83: vtctldata.RemoveKeyspaceCellRequest - (*vtctldata.RemoveShardCellRequest)(nil), // 84: vtctldata.RemoveShardCellRequest - (*vtctldata.ReparentTabletRequest)(nil), // 85: vtctldata.ReparentTabletRequest - (*vtctldata.ReshardCreateRequest)(nil), // 86: vtctldata.ReshardCreateRequest - (*vtctldata.RestoreFromBackupRequest)(nil), // 87: vtctldata.RestoreFromBackupRequest - (*vtctldata.RetrySchemaMigrationRequest)(nil), // 88: vtctldata.RetrySchemaMigrationRequest - (*vtctldata.RunHealthCheckRequest)(nil), // 89: vtctldata.RunHealthCheckRequest - (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 90: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 91: vtctldata.SetShardIsPrimaryServingRequest - (*vtctldata.SetShardTabletControlRequest)(nil), // 92: vtctldata.SetShardTabletControlRequest - (*vtctldata.SetWritableRequest)(nil), // 93: vtctldata.SetWritableRequest - (*vtctldata.ShardReplicationAddRequest)(nil), // 94: vtctldata.ShardReplicationAddRequest - (*vtctldata.ShardReplicationFixRequest)(nil), // 95: vtctldata.ShardReplicationFixRequest - (*vtctldata.ShardReplicationPositionsRequest)(nil), // 96: vtctldata.ShardReplicationPositionsRequest - (*vtctldata.ShardReplicationRemoveRequest)(nil), // 97: vtctldata.ShardReplicationRemoveRequest - (*vtctldata.SleepTabletRequest)(nil), // 98: vtctldata.SleepTabletRequest - (*vtctldata.SourceShardAddRequest)(nil), // 99: vtctldata.SourceShardAddRequest - (*vtctldata.SourceShardDeleteRequest)(nil), // 100: vtctldata.SourceShardDeleteRequest - (*vtctldata.StartReplicationRequest)(nil), // 101: vtctldata.StartReplicationRequest - (*vtctldata.StopReplicationRequest)(nil), // 102: vtctldata.StopReplicationRequest - (*vtctldata.TabletExternallyReparentedRequest)(nil), // 103: vtctldata.TabletExternallyReparentedRequest - (*vtctldata.UpdateCellInfoRequest)(nil), // 104: vtctldata.UpdateCellInfoRequest - (*vtctldata.UpdateCellsAliasRequest)(nil), // 105: vtctldata.UpdateCellsAliasRequest - (*vtctldata.ValidateRequest)(nil), // 106: vtctldata.ValidateRequest - (*vtctldata.ValidateKeyspaceRequest)(nil), // 107: vtctldata.ValidateKeyspaceRequest - (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 108: vtctldata.ValidateSchemaKeyspaceRequest - (*vtctldata.ValidateShardRequest)(nil), // 109: vtctldata.ValidateShardRequest - (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 110: vtctldata.ValidateVersionKeyspaceRequest - (*vtctldata.ValidateVersionShardRequest)(nil), // 111: vtctldata.ValidateVersionShardRequest - (*vtctldata.ValidateVSchemaRequest)(nil), // 112: vtctldata.ValidateVSchemaRequest - (*vtctldata.VDiffCreateRequest)(nil), // 113: vtctldata.VDiffCreateRequest - (*vtctldata.VDiffDeleteRequest)(nil), // 114: vtctldata.VDiffDeleteRequest - (*vtctldata.VDiffResumeRequest)(nil), // 115: vtctldata.VDiffResumeRequest - (*vtctldata.VDiffShowRequest)(nil), // 116: vtctldata.VDiffShowRequest - (*vtctldata.VDiffStopRequest)(nil), // 117: vtctldata.VDiffStopRequest - (*vtctldata.WorkflowDeleteRequest)(nil), // 118: vtctldata.WorkflowDeleteRequest - (*vtctldata.WorkflowStatusRequest)(nil), // 119: vtctldata.WorkflowStatusRequest - (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 120: vtctldata.WorkflowSwitchTrafficRequest - (*vtctldata.WorkflowUpdateRequest)(nil), // 121: vtctldata.WorkflowUpdateRequest - (*vtctldata.GetMirrorRulesRequest)(nil), // 122: vtctldata.GetMirrorRulesRequest - (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 123: vtctldata.WorkflowMirrorTrafficRequest - (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 124: vtctldata.ExecuteVtctlCommandResponse - (*vtctldata.AddCellInfoResponse)(nil), // 125: vtctldata.AddCellInfoResponse - (*vtctldata.AddCellsAliasResponse)(nil), // 126: vtctldata.AddCellsAliasResponse - (*vtctldata.ApplyRoutingRulesResponse)(nil), // 127: vtctldata.ApplyRoutingRulesResponse - (*vtctldata.ApplySchemaResponse)(nil), // 128: vtctldata.ApplySchemaResponse - (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 129: vtctldata.ApplyKeyspaceRoutingRulesResponse - (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 130: vtctldata.ApplyShardRoutingRulesResponse - (*vtctldata.ApplyVSchemaResponse)(nil), // 131: vtctldata.ApplyVSchemaResponse - (*vtctldata.BackupResponse)(nil), // 132: vtctldata.BackupResponse - (*vtctldata.CancelSchemaMigrationResponse)(nil), // 133: vtctldata.CancelSchemaMigrationResponse - (*vtctldata.ChangeTabletTagsResponse)(nil), // 134: vtctldata.ChangeTabletTagsResponse - (*vtctldata.ChangeTabletTypeResponse)(nil), // 135: vtctldata.ChangeTabletTypeResponse - (*vtctldata.CheckThrottlerResponse)(nil), // 136: vtctldata.CheckThrottlerResponse - (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 137: vtctldata.CleanupSchemaMigrationResponse - (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 138: vtctldata.CompleteSchemaMigrationResponse - (*vtctldata.ConcludeTransactionResponse)(nil), // 139: vtctldata.ConcludeTransactionResponse - (*vtctldata.CreateKeyspaceResponse)(nil), // 140: vtctldata.CreateKeyspaceResponse - (*vtctldata.CreateShardResponse)(nil), // 141: vtctldata.CreateShardResponse - (*vtctldata.DeleteCellInfoResponse)(nil), // 142: vtctldata.DeleteCellInfoResponse - (*vtctldata.DeleteCellsAliasResponse)(nil), // 143: vtctldata.DeleteCellsAliasResponse - (*vtctldata.DeleteKeyspaceResponse)(nil), // 144: vtctldata.DeleteKeyspaceResponse - (*vtctldata.DeleteShardsResponse)(nil), // 145: vtctldata.DeleteShardsResponse - (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 146: vtctldata.DeleteSrvVSchemaResponse - (*vtctldata.DeleteTabletsResponse)(nil), // 147: vtctldata.DeleteTabletsResponse - (*vtctldata.EmergencyReparentShardResponse)(nil), // 148: vtctldata.EmergencyReparentShardResponse - (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 149: vtctldata.ExecuteFetchAsAppResponse - (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 150: vtctldata.ExecuteFetchAsDBAResponse - (*vtctldata.ExecuteHookResponse)(nil), // 151: vtctldata.ExecuteHookResponse - (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 152: vtctldata.ExecuteMultiFetchAsDBAResponse - (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 153: vtctldata.FindAllShardsInKeyspaceResponse - (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 154: vtctldata.ForceCutOverSchemaMigrationResponse - (*vtctldata.GetBackupsResponse)(nil), // 155: vtctldata.GetBackupsResponse - (*vtctldata.GetCellInfoResponse)(nil), // 156: vtctldata.GetCellInfoResponse - (*vtctldata.GetCellInfoNamesResponse)(nil), // 157: vtctldata.GetCellInfoNamesResponse - (*vtctldata.GetCellsAliasesResponse)(nil), // 158: vtctldata.GetCellsAliasesResponse - (*vtctldata.GetFullStatusResponse)(nil), // 159: vtctldata.GetFullStatusResponse - (*vtctldata.GetKeyspaceResponse)(nil), // 160: vtctldata.GetKeyspaceResponse - (*vtctldata.GetKeyspacesResponse)(nil), // 161: vtctldata.GetKeyspacesResponse - (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 162: vtctldata.GetKeyspaceRoutingRulesResponse - (*vtctldata.GetPermissionsResponse)(nil), // 163: vtctldata.GetPermissionsResponse - (*vtctldata.GetRoutingRulesResponse)(nil), // 164: vtctldata.GetRoutingRulesResponse - (*vtctldata.GetSchemaResponse)(nil), // 165: vtctldata.GetSchemaResponse - (*vtctldata.GetSchemaMigrationsResponse)(nil), // 166: vtctldata.GetSchemaMigrationsResponse - (*vtctldata.GetShardReplicationResponse)(nil), // 167: vtctldata.GetShardReplicationResponse - (*vtctldata.GetShardResponse)(nil), // 168: vtctldata.GetShardResponse - (*vtctldata.GetShardRoutingRulesResponse)(nil), // 169: vtctldata.GetShardRoutingRulesResponse - (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 170: vtctldata.GetSrvKeyspaceNamesResponse - (*vtctldata.GetSrvKeyspacesResponse)(nil), // 171: vtctldata.GetSrvKeyspacesResponse - (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 172: vtctldata.UpdateThrottlerConfigResponse - (*vtctldata.GetSrvVSchemaResponse)(nil), // 173: vtctldata.GetSrvVSchemaResponse - (*vtctldata.GetSrvVSchemasResponse)(nil), // 174: vtctldata.GetSrvVSchemasResponse - (*vtctldata.GetTabletResponse)(nil), // 175: vtctldata.GetTabletResponse - (*vtctldata.GetTabletsResponse)(nil), // 176: vtctldata.GetTabletsResponse - (*vtctldata.GetThrottlerStatusResponse)(nil), // 177: vtctldata.GetThrottlerStatusResponse - (*vtctldata.GetTopologyPathResponse)(nil), // 178: vtctldata.GetTopologyPathResponse - (*vtctldata.GetTransactionInfoResponse)(nil), // 179: vtctldata.GetTransactionInfoResponse - (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 180: vtctldata.GetUnresolvedTransactionsResponse - (*vtctldata.GetVersionResponse)(nil), // 181: vtctldata.GetVersionResponse - (*vtctldata.GetVSchemaResponse)(nil), // 182: vtctldata.GetVSchemaResponse - (*vtctldata.GetWorkflowsResponse)(nil), // 183: vtctldata.GetWorkflowsResponse - (*vtctldata.InitShardPrimaryResponse)(nil), // 184: vtctldata.InitShardPrimaryResponse - (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 185: vtctldata.LaunchSchemaMigrationResponse - (*vtctldata.LookupVindexCreateResponse)(nil), // 186: vtctldata.LookupVindexCreateResponse - (*vtctldata.LookupVindexExternalizeResponse)(nil), // 187: vtctldata.LookupVindexExternalizeResponse - (*vtctldata.MaterializeCreateResponse)(nil), // 188: vtctldata.MaterializeCreateResponse - (*vtctldata.WorkflowStatusResponse)(nil), // 189: vtctldata.WorkflowStatusResponse - (*vtctldata.MountRegisterResponse)(nil), // 190: vtctldata.MountRegisterResponse - (*vtctldata.MountUnregisterResponse)(nil), // 191: vtctldata.MountUnregisterResponse - (*vtctldata.MountShowResponse)(nil), // 192: vtctldata.MountShowResponse - (*vtctldata.MountListResponse)(nil), // 193: vtctldata.MountListResponse - (*vtctldata.MoveTablesCompleteResponse)(nil), // 194: vtctldata.MoveTablesCompleteResponse - (*vtctldata.PingTabletResponse)(nil), // 195: vtctldata.PingTabletResponse - (*vtctldata.PlannedReparentShardResponse)(nil), // 196: vtctldata.PlannedReparentShardResponse - (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 197: vtctldata.RebuildKeyspaceGraphResponse - (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 198: vtctldata.RebuildVSchemaGraphResponse - (*vtctldata.RefreshStateResponse)(nil), // 199: vtctldata.RefreshStateResponse - (*vtctldata.RefreshStateByShardResponse)(nil), // 200: vtctldata.RefreshStateByShardResponse - (*vtctldata.ReloadSchemaResponse)(nil), // 201: vtctldata.ReloadSchemaResponse - (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 202: vtctldata.ReloadSchemaKeyspaceResponse - (*vtctldata.ReloadSchemaShardResponse)(nil), // 203: vtctldata.ReloadSchemaShardResponse - (*vtctldata.RemoveBackupResponse)(nil), // 204: vtctldata.RemoveBackupResponse - (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 205: vtctldata.RemoveKeyspaceCellResponse - (*vtctldata.RemoveShardCellResponse)(nil), // 206: vtctldata.RemoveShardCellResponse - (*vtctldata.ReparentTabletResponse)(nil), // 207: vtctldata.ReparentTabletResponse - (*vtctldata.RestoreFromBackupResponse)(nil), // 208: vtctldata.RestoreFromBackupResponse - (*vtctldata.RetrySchemaMigrationResponse)(nil), // 209: vtctldata.RetrySchemaMigrationResponse - (*vtctldata.RunHealthCheckResponse)(nil), // 210: vtctldata.RunHealthCheckResponse - (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 211: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 212: vtctldata.SetShardIsPrimaryServingResponse - (*vtctldata.SetShardTabletControlResponse)(nil), // 213: vtctldata.SetShardTabletControlResponse - (*vtctldata.SetWritableResponse)(nil), // 214: vtctldata.SetWritableResponse - (*vtctldata.ShardReplicationAddResponse)(nil), // 215: vtctldata.ShardReplicationAddResponse - (*vtctldata.ShardReplicationFixResponse)(nil), // 216: vtctldata.ShardReplicationFixResponse - (*vtctldata.ShardReplicationPositionsResponse)(nil), // 217: vtctldata.ShardReplicationPositionsResponse - (*vtctldata.ShardReplicationRemoveResponse)(nil), // 218: vtctldata.ShardReplicationRemoveResponse - (*vtctldata.SleepTabletResponse)(nil), // 219: vtctldata.SleepTabletResponse - (*vtctldata.SourceShardAddResponse)(nil), // 220: vtctldata.SourceShardAddResponse - (*vtctldata.SourceShardDeleteResponse)(nil), // 221: vtctldata.SourceShardDeleteResponse - (*vtctldata.StartReplicationResponse)(nil), // 222: vtctldata.StartReplicationResponse - (*vtctldata.StopReplicationResponse)(nil), // 223: vtctldata.StopReplicationResponse - (*vtctldata.TabletExternallyReparentedResponse)(nil), // 224: vtctldata.TabletExternallyReparentedResponse - (*vtctldata.UpdateCellInfoResponse)(nil), // 225: vtctldata.UpdateCellInfoResponse - (*vtctldata.UpdateCellsAliasResponse)(nil), // 226: vtctldata.UpdateCellsAliasResponse - (*vtctldata.ValidateResponse)(nil), // 227: vtctldata.ValidateResponse - (*vtctldata.ValidateKeyspaceResponse)(nil), // 228: vtctldata.ValidateKeyspaceResponse - (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 229: vtctldata.ValidateSchemaKeyspaceResponse - (*vtctldata.ValidateShardResponse)(nil), // 230: vtctldata.ValidateShardResponse - (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 231: vtctldata.ValidateVersionKeyspaceResponse - (*vtctldata.ValidateVersionShardResponse)(nil), // 232: vtctldata.ValidateVersionShardResponse - (*vtctldata.ValidateVSchemaResponse)(nil), // 233: vtctldata.ValidateVSchemaResponse - (*vtctldata.VDiffCreateResponse)(nil), // 234: vtctldata.VDiffCreateResponse - (*vtctldata.VDiffDeleteResponse)(nil), // 235: vtctldata.VDiffDeleteResponse - (*vtctldata.VDiffResumeResponse)(nil), // 236: vtctldata.VDiffResumeResponse - (*vtctldata.VDiffShowResponse)(nil), // 237: vtctldata.VDiffShowResponse - (*vtctldata.VDiffStopResponse)(nil), // 238: vtctldata.VDiffStopResponse - (*vtctldata.WorkflowDeleteResponse)(nil), // 239: vtctldata.WorkflowDeleteResponse - (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 240: vtctldata.WorkflowSwitchTrafficResponse - (*vtctldata.WorkflowUpdateResponse)(nil), // 241: vtctldata.WorkflowUpdateResponse - (*vtctldata.GetMirrorRulesResponse)(nil), // 242: vtctldata.GetMirrorRulesResponse - (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 243: vtctldata.WorkflowMirrorTrafficResponse + (*vtctldata.CopySchemaShardRequest)(nil), // 17: vtctldata.CopySchemaShardRequest + (*vtctldata.CreateKeyspaceRequest)(nil), // 18: vtctldata.CreateKeyspaceRequest + (*vtctldata.CreateShardRequest)(nil), // 19: vtctldata.CreateShardRequest + (*vtctldata.DeleteCellInfoRequest)(nil), // 20: vtctldata.DeleteCellInfoRequest + (*vtctldata.DeleteCellsAliasRequest)(nil), // 21: vtctldata.DeleteCellsAliasRequest + (*vtctldata.DeleteKeyspaceRequest)(nil), // 22: vtctldata.DeleteKeyspaceRequest + (*vtctldata.DeleteShardsRequest)(nil), // 23: vtctldata.DeleteShardsRequest + (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 24: vtctldata.DeleteSrvVSchemaRequest + (*vtctldata.DeleteTabletsRequest)(nil), // 25: vtctldata.DeleteTabletsRequest + (*vtctldata.EmergencyReparentShardRequest)(nil), // 26: vtctldata.EmergencyReparentShardRequest + (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 27: vtctldata.ExecuteFetchAsAppRequest + (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 28: vtctldata.ExecuteFetchAsDBARequest + (*vtctldata.ExecuteHookRequest)(nil), // 29: vtctldata.ExecuteHookRequest + (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 30: vtctldata.ExecuteMultiFetchAsDBARequest + (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 31: vtctldata.FindAllShardsInKeyspaceRequest + (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 32: vtctldata.ForceCutOverSchemaMigrationRequest + (*vtctldata.GetBackupsRequest)(nil), // 33: vtctldata.GetBackupsRequest + (*vtctldata.GetCellInfoRequest)(nil), // 34: vtctldata.GetCellInfoRequest + (*vtctldata.GetCellInfoNamesRequest)(nil), // 35: vtctldata.GetCellInfoNamesRequest + (*vtctldata.GetCellsAliasesRequest)(nil), // 36: vtctldata.GetCellsAliasesRequest + (*vtctldata.GetFullStatusRequest)(nil), // 37: vtctldata.GetFullStatusRequest + (*vtctldata.GetKeyspaceRequest)(nil), // 38: vtctldata.GetKeyspaceRequest + (*vtctldata.GetKeyspacesRequest)(nil), // 39: vtctldata.GetKeyspacesRequest + (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 40: vtctldata.GetKeyspaceRoutingRulesRequest + (*vtctldata.GetPermissionsRequest)(nil), // 41: vtctldata.GetPermissionsRequest + (*vtctldata.GetRoutingRulesRequest)(nil), // 42: vtctldata.GetRoutingRulesRequest + (*vtctldata.GetSchemaRequest)(nil), // 43: vtctldata.GetSchemaRequest + (*vtctldata.GetSchemaMigrationsRequest)(nil), // 44: vtctldata.GetSchemaMigrationsRequest + (*vtctldata.GetShardReplicationRequest)(nil), // 45: vtctldata.GetShardReplicationRequest + (*vtctldata.GetShardRequest)(nil), // 46: vtctldata.GetShardRequest + (*vtctldata.GetShardRoutingRulesRequest)(nil), // 47: vtctldata.GetShardRoutingRulesRequest + (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 48: vtctldata.GetSrvKeyspaceNamesRequest + (*vtctldata.GetSrvKeyspacesRequest)(nil), // 49: vtctldata.GetSrvKeyspacesRequest + (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 50: vtctldata.UpdateThrottlerConfigRequest + (*vtctldata.GetSrvVSchemaRequest)(nil), // 51: vtctldata.GetSrvVSchemaRequest + (*vtctldata.GetSrvVSchemasRequest)(nil), // 52: vtctldata.GetSrvVSchemasRequest + (*vtctldata.GetTabletRequest)(nil), // 53: vtctldata.GetTabletRequest + (*vtctldata.GetTabletsRequest)(nil), // 54: vtctldata.GetTabletsRequest + (*vtctldata.GetThrottlerStatusRequest)(nil), // 55: vtctldata.GetThrottlerStatusRequest + (*vtctldata.GetTopologyPathRequest)(nil), // 56: vtctldata.GetTopologyPathRequest + (*vtctldata.GetTransactionInfoRequest)(nil), // 57: vtctldata.GetTransactionInfoRequest + (*vtctldata.GetUnresolvedTransactionsRequest)(nil), // 58: vtctldata.GetUnresolvedTransactionsRequest + (*vtctldata.GetVersionRequest)(nil), // 59: vtctldata.GetVersionRequest + (*vtctldata.GetVSchemaRequest)(nil), // 60: vtctldata.GetVSchemaRequest + (*vtctldata.GetWorkflowsRequest)(nil), // 61: vtctldata.GetWorkflowsRequest + (*vtctldata.InitShardPrimaryRequest)(nil), // 62: vtctldata.InitShardPrimaryRequest + (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 63: vtctldata.LaunchSchemaMigrationRequest + (*vtctldata.LookupVindexCreateRequest)(nil), // 64: vtctldata.LookupVindexCreateRequest + (*vtctldata.LookupVindexExternalizeRequest)(nil), // 65: vtctldata.LookupVindexExternalizeRequest + (*vtctldata.MaterializeCreateRequest)(nil), // 66: vtctldata.MaterializeCreateRequest + (*vtctldata.MigrateCreateRequest)(nil), // 67: vtctldata.MigrateCreateRequest + (*vtctldata.MountRegisterRequest)(nil), // 68: vtctldata.MountRegisterRequest + (*vtctldata.MountUnregisterRequest)(nil), // 69: vtctldata.MountUnregisterRequest + (*vtctldata.MountShowRequest)(nil), // 70: vtctldata.MountShowRequest + (*vtctldata.MountListRequest)(nil), // 71: vtctldata.MountListRequest + (*vtctldata.MoveTablesCreateRequest)(nil), // 72: vtctldata.MoveTablesCreateRequest + (*vtctldata.MoveTablesCompleteRequest)(nil), // 73: vtctldata.MoveTablesCompleteRequest + (*vtctldata.PingTabletRequest)(nil), // 74: vtctldata.PingTabletRequest + (*vtctldata.PlannedReparentShardRequest)(nil), // 75: vtctldata.PlannedReparentShardRequest + (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 76: vtctldata.RebuildKeyspaceGraphRequest + (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 77: vtctldata.RebuildVSchemaGraphRequest + (*vtctldata.RefreshStateRequest)(nil), // 78: vtctldata.RefreshStateRequest + (*vtctldata.RefreshStateByShardRequest)(nil), // 79: vtctldata.RefreshStateByShardRequest + (*vtctldata.ReloadSchemaRequest)(nil), // 80: vtctldata.ReloadSchemaRequest + (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 81: vtctldata.ReloadSchemaKeyspaceRequest + (*vtctldata.ReloadSchemaShardRequest)(nil), // 82: vtctldata.ReloadSchemaShardRequest + (*vtctldata.RemoveBackupRequest)(nil), // 83: vtctldata.RemoveBackupRequest + (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 84: vtctldata.RemoveKeyspaceCellRequest + (*vtctldata.RemoveShardCellRequest)(nil), // 85: vtctldata.RemoveShardCellRequest + (*vtctldata.ReparentTabletRequest)(nil), // 86: vtctldata.ReparentTabletRequest + (*vtctldata.ReshardCreateRequest)(nil), // 87: vtctldata.ReshardCreateRequest + (*vtctldata.RestoreFromBackupRequest)(nil), // 88: vtctldata.RestoreFromBackupRequest + (*vtctldata.RetrySchemaMigrationRequest)(nil), // 89: vtctldata.RetrySchemaMigrationRequest + (*vtctldata.RunHealthCheckRequest)(nil), // 90: vtctldata.RunHealthCheckRequest + (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 91: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 92: vtctldata.SetShardIsPrimaryServingRequest + (*vtctldata.SetShardTabletControlRequest)(nil), // 93: vtctldata.SetShardTabletControlRequest + (*vtctldata.SetWritableRequest)(nil), // 94: vtctldata.SetWritableRequest + (*vtctldata.ShardReplicationAddRequest)(nil), // 95: vtctldata.ShardReplicationAddRequest + (*vtctldata.ShardReplicationFixRequest)(nil), // 96: vtctldata.ShardReplicationFixRequest + (*vtctldata.ShardReplicationPositionsRequest)(nil), // 97: vtctldata.ShardReplicationPositionsRequest + (*vtctldata.ShardReplicationRemoveRequest)(nil), // 98: vtctldata.ShardReplicationRemoveRequest + (*vtctldata.SleepTabletRequest)(nil), // 99: vtctldata.SleepTabletRequest + (*vtctldata.SourceShardAddRequest)(nil), // 100: vtctldata.SourceShardAddRequest + (*vtctldata.SourceShardDeleteRequest)(nil), // 101: vtctldata.SourceShardDeleteRequest + (*vtctldata.StartReplicationRequest)(nil), // 102: vtctldata.StartReplicationRequest + (*vtctldata.StopReplicationRequest)(nil), // 103: vtctldata.StopReplicationRequest + (*vtctldata.TabletExternallyReparentedRequest)(nil), // 104: vtctldata.TabletExternallyReparentedRequest + (*vtctldata.UpdateCellInfoRequest)(nil), // 105: vtctldata.UpdateCellInfoRequest + (*vtctldata.UpdateCellsAliasRequest)(nil), // 106: vtctldata.UpdateCellsAliasRequest + (*vtctldata.ValidateRequest)(nil), // 107: vtctldata.ValidateRequest + (*vtctldata.ValidateKeyspaceRequest)(nil), // 108: vtctldata.ValidateKeyspaceRequest + (*vtctldata.ValidatePermissionsKeyspaceRequest)(nil), // 109: vtctldata.ValidatePermissionsKeyspaceRequest + (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 110: vtctldata.ValidateSchemaKeyspaceRequest + (*vtctldata.ValidateShardRequest)(nil), // 111: vtctldata.ValidateShardRequest + (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 112: vtctldata.ValidateVersionKeyspaceRequest + (*vtctldata.ValidateVersionShardRequest)(nil), // 113: vtctldata.ValidateVersionShardRequest + (*vtctldata.ValidateVSchemaRequest)(nil), // 114: vtctldata.ValidateVSchemaRequest + (*vtctldata.VDiffCreateRequest)(nil), // 115: vtctldata.VDiffCreateRequest + (*vtctldata.VDiffDeleteRequest)(nil), // 116: vtctldata.VDiffDeleteRequest + (*vtctldata.VDiffResumeRequest)(nil), // 117: vtctldata.VDiffResumeRequest + (*vtctldata.VDiffShowRequest)(nil), // 118: vtctldata.VDiffShowRequest + (*vtctldata.VDiffStopRequest)(nil), // 119: vtctldata.VDiffStopRequest + (*vtctldata.WorkflowDeleteRequest)(nil), // 120: vtctldata.WorkflowDeleteRequest + (*vtctldata.WorkflowStatusRequest)(nil), // 121: vtctldata.WorkflowStatusRequest + (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 122: vtctldata.WorkflowSwitchTrafficRequest + (*vtctldata.WorkflowUpdateRequest)(nil), // 123: vtctldata.WorkflowUpdateRequest + (*vtctldata.GetMirrorRulesRequest)(nil), // 124: vtctldata.GetMirrorRulesRequest + (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 125: vtctldata.WorkflowMirrorTrafficRequest + (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 126: vtctldata.ExecuteVtctlCommandResponse + (*vtctldata.AddCellInfoResponse)(nil), // 127: vtctldata.AddCellInfoResponse + (*vtctldata.AddCellsAliasResponse)(nil), // 128: vtctldata.AddCellsAliasResponse + (*vtctldata.ApplyRoutingRulesResponse)(nil), // 129: vtctldata.ApplyRoutingRulesResponse + (*vtctldata.ApplySchemaResponse)(nil), // 130: vtctldata.ApplySchemaResponse + (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 131: vtctldata.ApplyKeyspaceRoutingRulesResponse + (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 132: vtctldata.ApplyShardRoutingRulesResponse + (*vtctldata.ApplyVSchemaResponse)(nil), // 133: vtctldata.ApplyVSchemaResponse + (*vtctldata.BackupResponse)(nil), // 134: vtctldata.BackupResponse + (*vtctldata.CancelSchemaMigrationResponse)(nil), // 135: vtctldata.CancelSchemaMigrationResponse + (*vtctldata.ChangeTabletTagsResponse)(nil), // 136: vtctldata.ChangeTabletTagsResponse + (*vtctldata.ChangeTabletTypeResponse)(nil), // 137: vtctldata.ChangeTabletTypeResponse + (*vtctldata.CheckThrottlerResponse)(nil), // 138: vtctldata.CheckThrottlerResponse + (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 139: vtctldata.CleanupSchemaMigrationResponse + (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 140: vtctldata.CompleteSchemaMigrationResponse + (*vtctldata.ConcludeTransactionResponse)(nil), // 141: vtctldata.ConcludeTransactionResponse + (*vtctldata.CopySchemaShardResponse)(nil), // 142: vtctldata.CopySchemaShardResponse + (*vtctldata.CreateKeyspaceResponse)(nil), // 143: vtctldata.CreateKeyspaceResponse + (*vtctldata.CreateShardResponse)(nil), // 144: vtctldata.CreateShardResponse + (*vtctldata.DeleteCellInfoResponse)(nil), // 145: vtctldata.DeleteCellInfoResponse + (*vtctldata.DeleteCellsAliasResponse)(nil), // 146: vtctldata.DeleteCellsAliasResponse + (*vtctldata.DeleteKeyspaceResponse)(nil), // 147: vtctldata.DeleteKeyspaceResponse + (*vtctldata.DeleteShardsResponse)(nil), // 148: vtctldata.DeleteShardsResponse + (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 149: vtctldata.DeleteSrvVSchemaResponse + (*vtctldata.DeleteTabletsResponse)(nil), // 150: vtctldata.DeleteTabletsResponse + (*vtctldata.EmergencyReparentShardResponse)(nil), // 151: vtctldata.EmergencyReparentShardResponse + (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 152: vtctldata.ExecuteFetchAsAppResponse + (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 153: vtctldata.ExecuteFetchAsDBAResponse + (*vtctldata.ExecuteHookResponse)(nil), // 154: vtctldata.ExecuteHookResponse + (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 155: vtctldata.ExecuteMultiFetchAsDBAResponse + (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 156: vtctldata.FindAllShardsInKeyspaceResponse + (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 157: vtctldata.ForceCutOverSchemaMigrationResponse + (*vtctldata.GetBackupsResponse)(nil), // 158: vtctldata.GetBackupsResponse + (*vtctldata.GetCellInfoResponse)(nil), // 159: vtctldata.GetCellInfoResponse + (*vtctldata.GetCellInfoNamesResponse)(nil), // 160: vtctldata.GetCellInfoNamesResponse + (*vtctldata.GetCellsAliasesResponse)(nil), // 161: vtctldata.GetCellsAliasesResponse + (*vtctldata.GetFullStatusResponse)(nil), // 162: vtctldata.GetFullStatusResponse + (*vtctldata.GetKeyspaceResponse)(nil), // 163: vtctldata.GetKeyspaceResponse + (*vtctldata.GetKeyspacesResponse)(nil), // 164: vtctldata.GetKeyspacesResponse + (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 165: vtctldata.GetKeyspaceRoutingRulesResponse + (*vtctldata.GetPermissionsResponse)(nil), // 166: vtctldata.GetPermissionsResponse + (*vtctldata.GetRoutingRulesResponse)(nil), // 167: vtctldata.GetRoutingRulesResponse + (*vtctldata.GetSchemaResponse)(nil), // 168: vtctldata.GetSchemaResponse + (*vtctldata.GetSchemaMigrationsResponse)(nil), // 169: vtctldata.GetSchemaMigrationsResponse + (*vtctldata.GetShardReplicationResponse)(nil), // 170: vtctldata.GetShardReplicationResponse + (*vtctldata.GetShardResponse)(nil), // 171: vtctldata.GetShardResponse + (*vtctldata.GetShardRoutingRulesResponse)(nil), // 172: vtctldata.GetShardRoutingRulesResponse + (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 173: vtctldata.GetSrvKeyspaceNamesResponse + (*vtctldata.GetSrvKeyspacesResponse)(nil), // 174: vtctldata.GetSrvKeyspacesResponse + (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 175: vtctldata.UpdateThrottlerConfigResponse + (*vtctldata.GetSrvVSchemaResponse)(nil), // 176: vtctldata.GetSrvVSchemaResponse + (*vtctldata.GetSrvVSchemasResponse)(nil), // 177: vtctldata.GetSrvVSchemasResponse + (*vtctldata.GetTabletResponse)(nil), // 178: vtctldata.GetTabletResponse + (*vtctldata.GetTabletsResponse)(nil), // 179: vtctldata.GetTabletsResponse + (*vtctldata.GetThrottlerStatusResponse)(nil), // 180: vtctldata.GetThrottlerStatusResponse + (*vtctldata.GetTopologyPathResponse)(nil), // 181: vtctldata.GetTopologyPathResponse + (*vtctldata.GetTransactionInfoResponse)(nil), // 182: vtctldata.GetTransactionInfoResponse + (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 183: vtctldata.GetUnresolvedTransactionsResponse + (*vtctldata.GetVersionResponse)(nil), // 184: vtctldata.GetVersionResponse + (*vtctldata.GetVSchemaResponse)(nil), // 185: vtctldata.GetVSchemaResponse + (*vtctldata.GetWorkflowsResponse)(nil), // 186: vtctldata.GetWorkflowsResponse + (*vtctldata.InitShardPrimaryResponse)(nil), // 187: vtctldata.InitShardPrimaryResponse + (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 188: vtctldata.LaunchSchemaMigrationResponse + (*vtctldata.LookupVindexCreateResponse)(nil), // 189: vtctldata.LookupVindexCreateResponse + (*vtctldata.LookupVindexExternalizeResponse)(nil), // 190: vtctldata.LookupVindexExternalizeResponse + (*vtctldata.MaterializeCreateResponse)(nil), // 191: vtctldata.MaterializeCreateResponse + (*vtctldata.WorkflowStatusResponse)(nil), // 192: vtctldata.WorkflowStatusResponse + (*vtctldata.MountRegisterResponse)(nil), // 193: vtctldata.MountRegisterResponse + (*vtctldata.MountUnregisterResponse)(nil), // 194: vtctldata.MountUnregisterResponse + (*vtctldata.MountShowResponse)(nil), // 195: vtctldata.MountShowResponse + (*vtctldata.MountListResponse)(nil), // 196: vtctldata.MountListResponse + (*vtctldata.MoveTablesCompleteResponse)(nil), // 197: vtctldata.MoveTablesCompleteResponse + (*vtctldata.PingTabletResponse)(nil), // 198: vtctldata.PingTabletResponse + (*vtctldata.PlannedReparentShardResponse)(nil), // 199: vtctldata.PlannedReparentShardResponse + (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 200: vtctldata.RebuildKeyspaceGraphResponse + (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 201: vtctldata.RebuildVSchemaGraphResponse + (*vtctldata.RefreshStateResponse)(nil), // 202: vtctldata.RefreshStateResponse + (*vtctldata.RefreshStateByShardResponse)(nil), // 203: vtctldata.RefreshStateByShardResponse + (*vtctldata.ReloadSchemaResponse)(nil), // 204: vtctldata.ReloadSchemaResponse + (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 205: vtctldata.ReloadSchemaKeyspaceResponse + (*vtctldata.ReloadSchemaShardResponse)(nil), // 206: vtctldata.ReloadSchemaShardResponse + (*vtctldata.RemoveBackupResponse)(nil), // 207: vtctldata.RemoveBackupResponse + (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 208: vtctldata.RemoveKeyspaceCellResponse + (*vtctldata.RemoveShardCellResponse)(nil), // 209: vtctldata.RemoveShardCellResponse + (*vtctldata.ReparentTabletResponse)(nil), // 210: vtctldata.ReparentTabletResponse + (*vtctldata.RestoreFromBackupResponse)(nil), // 211: vtctldata.RestoreFromBackupResponse + (*vtctldata.RetrySchemaMigrationResponse)(nil), // 212: vtctldata.RetrySchemaMigrationResponse + (*vtctldata.RunHealthCheckResponse)(nil), // 213: vtctldata.RunHealthCheckResponse + (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 214: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 215: vtctldata.SetShardIsPrimaryServingResponse + (*vtctldata.SetShardTabletControlResponse)(nil), // 216: vtctldata.SetShardTabletControlResponse + (*vtctldata.SetWritableResponse)(nil), // 217: vtctldata.SetWritableResponse + (*vtctldata.ShardReplicationAddResponse)(nil), // 218: vtctldata.ShardReplicationAddResponse + (*vtctldata.ShardReplicationFixResponse)(nil), // 219: vtctldata.ShardReplicationFixResponse + (*vtctldata.ShardReplicationPositionsResponse)(nil), // 220: vtctldata.ShardReplicationPositionsResponse + (*vtctldata.ShardReplicationRemoveResponse)(nil), // 221: vtctldata.ShardReplicationRemoveResponse + (*vtctldata.SleepTabletResponse)(nil), // 222: vtctldata.SleepTabletResponse + (*vtctldata.SourceShardAddResponse)(nil), // 223: vtctldata.SourceShardAddResponse + (*vtctldata.SourceShardDeleteResponse)(nil), // 224: vtctldata.SourceShardDeleteResponse + (*vtctldata.StartReplicationResponse)(nil), // 225: vtctldata.StartReplicationResponse + (*vtctldata.StopReplicationResponse)(nil), // 226: vtctldata.StopReplicationResponse + (*vtctldata.TabletExternallyReparentedResponse)(nil), // 227: vtctldata.TabletExternallyReparentedResponse + (*vtctldata.UpdateCellInfoResponse)(nil), // 228: vtctldata.UpdateCellInfoResponse + (*vtctldata.UpdateCellsAliasResponse)(nil), // 229: vtctldata.UpdateCellsAliasResponse + (*vtctldata.ValidateResponse)(nil), // 230: vtctldata.ValidateResponse + (*vtctldata.ValidateKeyspaceResponse)(nil), // 231: vtctldata.ValidateKeyspaceResponse + (*vtctldata.ValidatePermissionsKeyspaceResponse)(nil), // 232: vtctldata.ValidatePermissionsKeyspaceResponse + (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 233: vtctldata.ValidateSchemaKeyspaceResponse + (*vtctldata.ValidateShardResponse)(nil), // 234: vtctldata.ValidateShardResponse + (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 235: vtctldata.ValidateVersionKeyspaceResponse + (*vtctldata.ValidateVersionShardResponse)(nil), // 236: vtctldata.ValidateVersionShardResponse + (*vtctldata.ValidateVSchemaResponse)(nil), // 237: vtctldata.ValidateVSchemaResponse + (*vtctldata.VDiffCreateResponse)(nil), // 238: vtctldata.VDiffCreateResponse + (*vtctldata.VDiffDeleteResponse)(nil), // 239: vtctldata.VDiffDeleteResponse + (*vtctldata.VDiffResumeResponse)(nil), // 240: vtctldata.VDiffResumeResponse + (*vtctldata.VDiffShowResponse)(nil), // 241: vtctldata.VDiffShowResponse + (*vtctldata.VDiffStopResponse)(nil), // 242: vtctldata.VDiffStopResponse + (*vtctldata.WorkflowDeleteResponse)(nil), // 243: vtctldata.WorkflowDeleteResponse + (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 244: vtctldata.WorkflowSwitchTrafficResponse + (*vtctldata.WorkflowUpdateResponse)(nil), // 245: vtctldata.WorkflowUpdateResponse + (*vtctldata.GetMirrorRulesResponse)(nil), // 246: vtctldata.GetMirrorRulesResponse + (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 247: vtctldata.WorkflowMirrorTrafficResponse } var file_vtctlservice_proto_depIdxs = []int32{ 0, // 0: vtctlservice.Vtctl.ExecuteVtctlCommand:input_type -> vtctldata.ExecuteVtctlCommandRequest @@ -1050,239 +1067,243 @@ var file_vtctlservice_proto_depIdxs = []int32{ 14, // 14: vtctlservice.Vtctld.CleanupSchemaMigration:input_type -> vtctldata.CleanupSchemaMigrationRequest 15, // 15: vtctlservice.Vtctld.CompleteSchemaMigration:input_type -> vtctldata.CompleteSchemaMigrationRequest 16, // 16: vtctlservice.Vtctld.ConcludeTransaction:input_type -> vtctldata.ConcludeTransactionRequest - 17, // 17: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest - 18, // 18: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest - 19, // 19: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest - 20, // 20: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest - 21, // 21: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest - 22, // 22: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest - 23, // 23: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest - 24, // 24: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest - 25, // 25: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest - 26, // 26: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest - 27, // 27: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest - 28, // 28: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest - 29, // 29: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest - 30, // 30: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest - 31, // 31: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest - 32, // 32: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest - 33, // 33: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest - 34, // 34: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest - 35, // 35: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest - 36, // 36: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest - 37, // 37: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest - 38, // 38: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest - 39, // 39: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest - 40, // 40: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest - 41, // 41: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest - 42, // 42: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest - 43, // 43: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest - 44, // 44: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest - 45, // 45: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest - 46, // 46: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest - 47, // 47: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest - 48, // 48: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest - 49, // 49: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest - 50, // 50: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest - 51, // 51: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest - 52, // 52: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest - 53, // 53: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest - 54, // 54: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest - 55, // 55: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest - 56, // 56: vtctlservice.Vtctld.GetTransactionInfo:input_type -> vtctldata.GetTransactionInfoRequest - 57, // 57: vtctlservice.Vtctld.GetUnresolvedTransactions:input_type -> vtctldata.GetUnresolvedTransactionsRequest - 58, // 58: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest - 59, // 59: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest - 60, // 60: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest - 61, // 61: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest - 62, // 62: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest - 63, // 63: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest - 64, // 64: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest - 65, // 65: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest - 66, // 66: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest - 67, // 67: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest - 68, // 68: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest - 69, // 69: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest - 70, // 70: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest - 71, // 71: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest - 72, // 72: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest - 73, // 73: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest - 74, // 74: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest - 75, // 75: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest - 76, // 76: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest - 77, // 77: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest - 78, // 78: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest - 79, // 79: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest - 80, // 80: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest - 81, // 81: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest - 82, // 82: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest - 83, // 83: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest - 84, // 84: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest - 85, // 85: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest - 86, // 86: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest - 87, // 87: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest - 88, // 88: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest - 89, // 89: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest - 90, // 90: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest - 91, // 91: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest - 92, // 92: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest - 93, // 93: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest - 94, // 94: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest - 95, // 95: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest - 96, // 96: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest - 97, // 97: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest - 98, // 98: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest - 99, // 99: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest - 100, // 100: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest - 101, // 101: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest - 102, // 102: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest - 103, // 103: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest - 104, // 104: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest - 105, // 105: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest - 106, // 106: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest - 107, // 107: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest - 108, // 108: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest - 109, // 109: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest - 110, // 110: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest - 111, // 111: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest - 112, // 112: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest - 113, // 113: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest - 114, // 114: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest - 115, // 115: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest - 116, // 116: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest - 117, // 117: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest - 118, // 118: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest - 119, // 119: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest - 120, // 120: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest - 121, // 121: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest - 122, // 122: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest - 123, // 123: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest - 124, // 124: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse - 125, // 125: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse - 126, // 126: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse - 127, // 127: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse - 128, // 128: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse - 129, // 129: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse - 130, // 130: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse - 131, // 131: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse - 132, // 132: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse - 132, // 133: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse - 133, // 134: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse - 134, // 135: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse - 135, // 136: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse - 136, // 137: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse - 137, // 138: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse - 138, // 139: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse - 139, // 140: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse - 140, // 141: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse - 141, // 142: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse - 142, // 143: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse - 143, // 144: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse - 144, // 145: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse - 145, // 146: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse - 146, // 147: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse - 147, // 148: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse - 148, // 149: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse - 149, // 150: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse - 150, // 151: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse - 151, // 152: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse - 152, // 153: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse - 153, // 154: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse - 154, // 155: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse - 155, // 156: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse - 156, // 157: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse - 157, // 158: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse - 158, // 159: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse - 159, // 160: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse - 160, // 161: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse - 161, // 162: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse - 162, // 163: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse - 163, // 164: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse - 164, // 165: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse - 165, // 166: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse - 166, // 167: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse - 167, // 168: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse - 168, // 169: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse - 169, // 170: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse - 170, // 171: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse - 171, // 172: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse - 172, // 173: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse - 173, // 174: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse - 174, // 175: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse - 175, // 176: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse - 176, // 177: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse - 177, // 178: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse - 178, // 179: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse - 179, // 180: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse - 180, // 181: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse - 181, // 182: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse - 182, // 183: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse - 183, // 184: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse - 184, // 185: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse - 185, // 186: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse - 186, // 187: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse - 187, // 188: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse - 188, // 189: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse - 189, // 190: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse - 190, // 191: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse - 191, // 192: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse - 192, // 193: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse - 193, // 194: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse - 189, // 195: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse - 194, // 196: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse - 195, // 197: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse - 196, // 198: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse - 197, // 199: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse - 198, // 200: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse - 199, // 201: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse - 200, // 202: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse - 201, // 203: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse - 202, // 204: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse - 203, // 205: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse - 204, // 206: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse - 205, // 207: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse - 206, // 208: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse - 207, // 209: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse - 189, // 210: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse - 208, // 211: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse - 209, // 212: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse - 210, // 213: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse - 211, // 214: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse - 212, // 215: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse - 213, // 216: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse - 214, // 217: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse - 215, // 218: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse - 216, // 219: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse - 217, // 220: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse - 218, // 221: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse - 219, // 222: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse - 220, // 223: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse - 221, // 224: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse - 222, // 225: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse - 223, // 226: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse - 224, // 227: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse - 225, // 228: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse - 226, // 229: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse - 227, // 230: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse - 228, // 231: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse - 229, // 232: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse - 230, // 233: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse - 231, // 234: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse - 232, // 235: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse - 233, // 236: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse - 234, // 237: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse - 235, // 238: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse - 236, // 239: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse - 237, // 240: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse - 238, // 241: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse - 239, // 242: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse - 189, // 243: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse - 240, // 244: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse - 241, // 245: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse - 242, // 246: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse - 243, // 247: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse - 124, // [124:248] is the sub-list for method output_type - 0, // [0:124] is the sub-list for method input_type + 17, // 17: vtctlservice.Vtctld.CopySchemaShard:input_type -> vtctldata.CopySchemaShardRequest + 18, // 18: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest + 19, // 19: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest + 20, // 20: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest + 21, // 21: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest + 22, // 22: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest + 23, // 23: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest + 24, // 24: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest + 25, // 25: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest + 26, // 26: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest + 27, // 27: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest + 28, // 28: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest + 29, // 29: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest + 30, // 30: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest + 31, // 31: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest + 32, // 32: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest + 33, // 33: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest + 34, // 34: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest + 35, // 35: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest + 36, // 36: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest + 37, // 37: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest + 38, // 38: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest + 39, // 39: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest + 40, // 40: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest + 41, // 41: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest + 42, // 42: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest + 43, // 43: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest + 44, // 44: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest + 45, // 45: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest + 46, // 46: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest + 47, // 47: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest + 48, // 48: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest + 49, // 49: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest + 50, // 50: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest + 51, // 51: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest + 52, // 52: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest + 53, // 53: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest + 54, // 54: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest + 55, // 55: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest + 56, // 56: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest + 57, // 57: vtctlservice.Vtctld.GetTransactionInfo:input_type -> vtctldata.GetTransactionInfoRequest + 58, // 58: vtctlservice.Vtctld.GetUnresolvedTransactions:input_type -> vtctldata.GetUnresolvedTransactionsRequest + 59, // 59: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest + 60, // 60: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest + 61, // 61: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest + 62, // 62: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest + 63, // 63: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest + 64, // 64: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest + 65, // 65: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest + 66, // 66: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest + 67, // 67: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest + 68, // 68: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest + 69, // 69: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest + 70, // 70: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest + 71, // 71: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest + 72, // 72: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest + 73, // 73: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest + 74, // 74: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest + 75, // 75: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest + 76, // 76: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest + 77, // 77: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest + 78, // 78: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest + 79, // 79: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest + 80, // 80: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest + 81, // 81: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest + 82, // 82: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest + 83, // 83: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest + 84, // 84: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest + 85, // 85: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest + 86, // 86: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest + 87, // 87: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest + 88, // 88: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest + 89, // 89: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest + 90, // 90: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest + 91, // 91: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest + 92, // 92: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest + 93, // 93: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest + 94, // 94: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest + 95, // 95: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest + 96, // 96: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest + 97, // 97: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest + 98, // 98: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest + 99, // 99: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest + 100, // 100: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest + 101, // 101: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest + 102, // 102: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest + 103, // 103: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest + 104, // 104: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest + 105, // 105: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest + 106, // 106: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest + 107, // 107: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest + 108, // 108: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest + 109, // 109: vtctlservice.Vtctld.ValidatePermissionsKeyspace:input_type -> vtctldata.ValidatePermissionsKeyspaceRequest + 110, // 110: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest + 111, // 111: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest + 112, // 112: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest + 113, // 113: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest + 114, // 114: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest + 115, // 115: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest + 116, // 116: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest + 117, // 117: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest + 118, // 118: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest + 119, // 119: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest + 120, // 120: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest + 121, // 121: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest + 122, // 122: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest + 123, // 123: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest + 124, // 124: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest + 125, // 125: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest + 126, // 126: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse + 127, // 127: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse + 128, // 128: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse + 129, // 129: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse + 130, // 130: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse + 131, // 131: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse + 132, // 132: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse + 133, // 133: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse + 134, // 134: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse + 134, // 135: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse + 135, // 136: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse + 136, // 137: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse + 137, // 138: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse + 138, // 139: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse + 139, // 140: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse + 140, // 141: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse + 141, // 142: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse + 142, // 143: vtctlservice.Vtctld.CopySchemaShard:output_type -> vtctldata.CopySchemaShardResponse + 143, // 144: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse + 144, // 145: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse + 145, // 146: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse + 146, // 147: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse + 147, // 148: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse + 148, // 149: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse + 149, // 150: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse + 150, // 151: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse + 151, // 152: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse + 152, // 153: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse + 153, // 154: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse + 154, // 155: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse + 155, // 156: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse + 156, // 157: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse + 157, // 158: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse + 158, // 159: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse + 159, // 160: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse + 160, // 161: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse + 161, // 162: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse + 162, // 163: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse + 163, // 164: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse + 164, // 165: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse + 165, // 166: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse + 166, // 167: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse + 167, // 168: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse + 168, // 169: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse + 169, // 170: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse + 170, // 171: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse + 171, // 172: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse + 172, // 173: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse + 173, // 174: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse + 174, // 175: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse + 175, // 176: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse + 176, // 177: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse + 177, // 178: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse + 178, // 179: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse + 179, // 180: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse + 180, // 181: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse + 181, // 182: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse + 182, // 183: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse + 183, // 184: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse + 184, // 185: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse + 185, // 186: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse + 186, // 187: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse + 187, // 188: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse + 188, // 189: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse + 189, // 190: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse + 190, // 191: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse + 191, // 192: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse + 192, // 193: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse + 193, // 194: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse + 194, // 195: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse + 195, // 196: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse + 196, // 197: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse + 192, // 198: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse + 197, // 199: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse + 198, // 200: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse + 199, // 201: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse + 200, // 202: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse + 201, // 203: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse + 202, // 204: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse + 203, // 205: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse + 204, // 206: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse + 205, // 207: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse + 206, // 208: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse + 207, // 209: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse + 208, // 210: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse + 209, // 211: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse + 210, // 212: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse + 192, // 213: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse + 211, // 214: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse + 212, // 215: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse + 213, // 216: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse + 214, // 217: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse + 215, // 218: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse + 216, // 219: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse + 217, // 220: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse + 218, // 221: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse + 219, // 222: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse + 220, // 223: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse + 221, // 224: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse + 222, // 225: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse + 223, // 226: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse + 224, // 227: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse + 225, // 228: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse + 226, // 229: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse + 227, // 230: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse + 228, // 231: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse + 229, // 232: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse + 230, // 233: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse + 231, // 234: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse + 232, // 235: vtctlservice.Vtctld.ValidatePermissionsKeyspace:output_type -> vtctldata.ValidatePermissionsKeyspaceResponse + 233, // 236: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse + 234, // 237: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse + 235, // 238: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse + 236, // 239: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse + 237, // 240: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse + 238, // 241: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse + 239, // 242: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse + 240, // 243: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse + 241, // 244: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse + 242, // 245: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse + 243, // 246: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse + 192, // 247: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse + 244, // 248: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse + 245, // 249: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse + 246, // 250: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse + 247, // 251: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse + 126, // [126:252] is the sub-list for method output_type + 0, // [0:126] 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/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go index 0b2e5bae7dc..8447dbf10c7 100644 --- a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go @@ -179,6 +179,8 @@ type VtctldClient interface { CompleteSchemaMigration(ctx context.Context, in *vtctldata.CompleteSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CompleteSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. ConcludeTransaction(ctx context.Context, in *vtctldata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + CopySchemaShard(ctx context.Context, in *vtctldata.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldata.CopySchemaShardResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -449,6 +451,8 @@ type VtctldClient interface { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. ValidateKeyspace(ctx context.Context, in *vtctldata.ValidateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateKeyspaceResponse, error) + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + ValidatePermissionsKeyspace(ctx context.Context, in *vtctldata.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. ValidateSchemaKeyspace(ctx context.Context, in *vtctldata.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateSchemaKeyspaceResponse, error) // ValidateShard validates that all nodes reachable from the specified shard @@ -675,6 +679,15 @@ func (c *vtctldClient) ConcludeTransaction(ctx context.Context, in *vtctldata.Co return out, nil } +func (c *vtctldClient) CopySchemaShard(ctx context.Context, in *vtctldata.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldata.CopySchemaShardResponse, error) { + out := new(vtctldata.CopySchemaShardResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/CopySchemaShard", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) CreateKeyspace(ctx context.Context, in *vtctldata.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.CreateKeyspaceResponse, error) { out := new(vtctldata.CreateKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/CreateKeyspace", in, out, opts...) @@ -1517,6 +1530,15 @@ func (c *vtctldClient) ValidateKeyspace(ctx context.Context, in *vtctldata.Valid return out, nil } +func (c *vtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldata.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) { + out := new(vtctldata.ValidatePermissionsKeyspaceResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ValidatePermissionsKeyspace", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldata.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateSchemaKeyspaceResponse, error) { out := new(vtctldata.ValidateSchemaKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ValidateSchemaKeyspace", in, out, opts...) @@ -1708,6 +1730,8 @@ type VtctldServer interface { CompleteSchemaMigration(context.Context, *vtctldata.CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + CopySchemaShard(context.Context, *vtctldata.CopySchemaShardRequest) (*vtctldata.CopySchemaShardResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -1978,6 +2002,8 @@ type VtctldServer interface { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. ValidateKeyspace(context.Context, *vtctldata.ValidateKeyspaceRequest) (*vtctldata.ValidateKeyspaceResponse, error) + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + ValidatePermissionsKeyspace(context.Context, *vtctldata.ValidatePermissionsKeyspaceRequest) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. ValidateSchemaKeyspace(context.Context, *vtctldata.ValidateSchemaKeyspaceRequest) (*vtctldata.ValidateSchemaKeyspaceResponse, error) // ValidateShard validates that all nodes reachable from the specified shard @@ -2059,6 +2085,9 @@ func (UnimplementedVtctldServer) CompleteSchemaMigration(context.Context, *vtctl func (UnimplementedVtctldServer) ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ConcludeTransaction not implemented") } +func (UnimplementedVtctldServer) CopySchemaShard(context.Context, *vtctldata.CopySchemaShardRequest) (*vtctldata.CopySchemaShardResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CopySchemaShard not implemented") +} func (UnimplementedVtctldServer) CreateKeyspace(context.Context, *vtctldata.CreateKeyspaceRequest) (*vtctldata.CreateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateKeyspace not implemented") } @@ -2332,6 +2361,9 @@ func (UnimplementedVtctldServer) Validate(context.Context, *vtctldata.ValidateRe func (UnimplementedVtctldServer) ValidateKeyspace(context.Context, *vtctldata.ValidateKeyspaceRequest) (*vtctldata.ValidateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateKeyspace not implemented") } +func (UnimplementedVtctldServer) ValidatePermissionsKeyspace(context.Context, *vtctldata.ValidatePermissionsKeyspaceRequest) (*vtctldata.ValidatePermissionsKeyspaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePermissionsKeyspace not implemented") +} func (UnimplementedVtctldServer) ValidateSchemaKeyspace(context.Context, *vtctldata.ValidateSchemaKeyspaceRequest) (*vtctldata.ValidateSchemaKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateSchemaKeyspace not implemented") } @@ -2687,6 +2719,24 @@ func _Vtctld_ConcludeTransaction_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Vtctld_CopySchemaShard_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.CopySchemaShardRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).CopySchemaShard(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/CopySchemaShard", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).CopySchemaShard(ctx, req.(*vtctldata.CopySchemaShardRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_CreateKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.CreateKeyspaceRequest) if err := dec(in); err != nil { @@ -4328,6 +4378,24 @@ func _Vtctld_ValidateKeyspace_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Vtctld_ValidatePermissionsKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.ValidatePermissionsKeyspaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).ValidatePermissionsKeyspace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/ValidatePermissionsKeyspace", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).ValidatePermissionsKeyspace(ctx, req.(*vtctldata.ValidatePermissionsKeyspaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_ValidateSchemaKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.ValidateSchemaKeyspaceRequest) if err := dec(in); err != nil { @@ -4679,6 +4747,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "ConcludeTransaction", Handler: _Vtctld_ConcludeTransaction_Handler, }, + { + MethodName: "CopySchemaShard", + Handler: _Vtctld_CopySchemaShard_Handler, + }, { MethodName: "CreateKeyspace", Handler: _Vtctld_CreateKeyspace_Handler, @@ -5039,6 +5111,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidateKeyspace", Handler: _Vtctld_ValidateKeyspace_Handler, }, + { + MethodName: "ValidatePermissionsKeyspace", + Handler: _Vtctld_ValidatePermissionsKeyspace_Handler, + }, { MethodName: "ValidateSchemaKeyspace", Handler: _Vtctld_ValidateSchemaKeyspace_Handler, diff --git a/go/vt/vtctl/grpcvtctldclient/client_gen.go b/go/vt/vtctl/grpcvtctldclient/client_gen.go index c2da0e97c54..415c737ace8 100644 --- a/go/vt/vtctl/grpcvtctldclient/client_gen.go +++ b/go/vt/vtctl/grpcvtctldclient/client_gen.go @@ -173,6 +173,15 @@ func (client *gRPCVtctldClient) ConcludeTransaction(ctx context.Context, in *vtc return client.c.ConcludeTransaction(ctx, in, opts...) } +// CopySchemaShard is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) CopySchemaShard(ctx context.Context, in *vtctldatapb.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldatapb.CopySchemaShardResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.CopySchemaShard(ctx, in, opts...) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { if client.c == nil { @@ -1046,6 +1055,15 @@ func (client *gRPCVtctldClient) ValidateKeyspace(ctx context.Context, in *vtctld return client.c.ValidateKeyspace(ctx, in, opts...) } +// ValidatePermissionsKeyspace is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldatapb.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidatePermissionsKeyspaceResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.ValidatePermissionsKeyspace(ctx, in, opts...) +} + // ValidateSchemaKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldatapb.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidateSchemaKeyspaceResponse, error) { if client.c == nil { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 706e0bec92a..a3d822ce002 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -871,6 +871,28 @@ func (s *VtctldServer) CompleteSchemaMigration(ctx context.Context, req *vtctlda return resp, nil } +// CopySchemaShard is part of the vtctlservicepb.VtctldServer interface. +func (s *VtctldServer) CopySchemaShard(ctx context.Context, req *vtctldatapb.CopySchemaShardRequest) (resp *vtctldatapb.CopySchemaShardResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.CompleteSchemaMigration") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("source_tablet_alias", req.SourceTabletAlias) + span.Annotate("destination_keyspace", req.DestinationKeyspace) + span.Annotate("destination_shard", req.DestinationShard) + + waitReplicasTimeout, _, err := protoutil.DurationFromProto(req.WaitReplicasTimeout) + if err != nil { + return nil, err + } + + err = s.ws.CopySchemaShard(ctx, req.SourceTabletAlias, req.Tables, req.ExcludeTables, req.IncludeViews, + req.DestinationKeyspace, req.DestinationShard, waitReplicasTimeout, req.SkipVerify) + + return &vtctldatapb.CopySchemaShardResponse{}, err +} + // CreateKeyspace is part of the vtctlservicepb.VtctldServer interface. func (s *VtctldServer) CreateKeyspace(ctx context.Context, req *vtctldatapb.CreateKeyspaceRequest) (resp *vtctldatapb.CreateKeyspaceResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.CreateKeyspace") @@ -4692,8 +4714,94 @@ func (s *VtctldServer) ValidateKeyspace(ctx context.Context, req *vtctldatapb.Va return resp, err } +// ValidatePermissionsKeyspace validates that all the permissions are the +// same in a keyspace. +func (s *VtctldServer) ValidatePermissionsKeyspace(ctx context.Context, req *vtctldatapb.ValidatePermissionsKeyspaceRequest) (resp *vtctldatapb.ValidatePermissionsKeyspaceResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.ValidatePermissionsKeyspace") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("keyspace", req.Keyspace) + span.Annotate("shards", req.Shards) + + var shards []string + if len(req.Shards) != 0 { + // If the user has specified a list of specific shards, we'll use that. + shards = req.Shards + } else { + // Validate all of the shards. + shards, err = s.ts.GetShardNames(ctx, req.Keyspace) + if err != nil { + return nil, err + } + } + + if len(shards) == 0 { + return nil, fmt.Errorf("no shards found in keyspace %s", req.Keyspace) + } + sort.Strings(shards) + + // Find the reference permissions using the first shard's primary. + si, err := s.ts.GetShard(ctx, req.Keyspace, shards[0]) + if err != nil { + return nil, err + } + if !si.HasPrimary() { + return nil, fmt.Errorf("no primary tablet in shard %s/%s", req.Keyspace, shards[0]) + } + referenceAlias := si.PrimaryAlias + log.Infof("Gathering permissions for reference primary %s", topoproto.TabletAliasString(referenceAlias)) + pres, err := s.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: si.PrimaryAlias, + }) + if err != nil { + return nil, err + } + referencePermissions := pres.Permissions + + // Then diff the first/reference tablet with all the others. + eg, egctx := errgroup.WithContext(ctx) + for _, shard := range shards { + eg.Go(func() error { + aliases, err := s.ts.FindAllTabletAliasesInShard(egctx, req.Keyspace, shard) + if err != nil { + return err + } + for _, alias := range aliases { + if topoproto.TabletAliasEqual(alias, si.PrimaryAlias) { + continue + } + log.Infof("Gathering permissions for %s", topoproto.TabletAliasString(alias)) + presp, err := s.GetPermissions(ctx, &vtctldatapb.GetPermissionsRequest{ + TabletAlias: alias, + }) + if err != nil { + return err + } + + log.Infof("Diffing permissions between %s and %s", topoproto.TabletAliasString(referenceAlias), + topoproto.TabletAliasString(alias)) + er := &concurrency.AllErrorRecorder{} + tmutils.DiffPermissions(topoproto.TabletAliasString(referenceAlias), referencePermissions, + topoproto.TabletAliasString(alias), presp.Permissions, er) + if er.HasErrors() { + return er.Error() + } + } + return nil + }) + } + if err := eg.Wait(); err != nil { + return nil, fmt.Errorf("permissions diffs: %v", err) + } + + return &vtctldatapb.ValidatePermissionsKeyspaceResponse{}, nil +} + // ValidateSchemaKeyspace is a part of the vtctlservicepb.VtctldServer interface. -// It will diff the schema from all the tablets in the keyspace. +// It will diff the schema between the tablets in all shards -- or a subset if +// any specific shards are specified -- within the keyspace. func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldatapb.ValidateSchemaKeyspaceRequest) (resp *vtctldatapb.ValidateSchemaKeyspaceResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.ValidateSchemaKeyspace") defer span.Finish() @@ -4701,17 +4809,25 @@ func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldat defer panicHandler(&err) span.Annotate("keyspace", req.Keyspace) + span.Annotate("shards", req.Shards) keyspace := req.Keyspace resp = &vtctldatapb.ValidateSchemaKeyspaceResponse{ Results: []string{}, } - shards, err := s.ts.GetShardNames(ctx, keyspace) - if err != nil { - resp.Results = append(resp.Results, fmt.Sprintf("TopologyServer.GetShardNames(%v) failed: %v", req.Keyspace, err)) - err = nil - return resp, err + var shards []string + if len(req.Shards) != 0 { + // If the user has specified a list of specific shards, we'll use that. + shards = req.Shards + } else { + // Otherwise we look at all the shards in the keyspace. + shards, err = s.ts.GetShardNames(ctx, keyspace) + if err != nil { + resp.Results = append(resp.Results, fmt.Sprintf("TopologyServer.GetShardNames(%s) failed: %v", req.Keyspace, err)) + err = nil + return resp, err + } } resp.ResultsByShard = make(map[string]*vtctldatapb.ValidateShardResponse, len(shards)) @@ -4754,7 +4870,7 @@ func (s *VtctldServer) ValidateSchemaKeyspace(ctx context.Context, req *vtctldat ) r := &tabletmanagerdatapb.GetSchemaRequest{ExcludeTables: req.ExcludeTables, IncludeViews: req.IncludeViews} - for _, shard := range shards[0:] { + for _, shard := range shards { wg.Add(1) go func(shard string) { defer wg.Done() diff --git a/go/vt/vtctl/localvtctldclient/client_gen.go b/go/vt/vtctl/localvtctldclient/client_gen.go index 6867f4768f6..fd26dc6e4b1 100644 --- a/go/vt/vtctl/localvtctldclient/client_gen.go +++ b/go/vt/vtctl/localvtctldclient/client_gen.go @@ -201,6 +201,11 @@ func (client *localVtctldClient) ConcludeTransaction(ctx context.Context, in *vt return client.s.ConcludeTransaction(ctx, in) } +// CopySchemaShard is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) CopySchemaShard(ctx context.Context, in *vtctldatapb.CopySchemaShardRequest, opts ...grpc.CallOption) (*vtctldatapb.CopySchemaShardResponse, error) { + return client.s.CopySchemaShard(ctx, in) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { return client.s.CreateKeyspace(ctx, in) @@ -732,6 +737,11 @@ func (client *localVtctldClient) ValidateKeyspace(ctx context.Context, in *vtctl return client.s.ValidateKeyspace(ctx, in) } +// ValidatePermissionsKeyspace is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) ValidatePermissionsKeyspace(ctx context.Context, in *vtctldatapb.ValidatePermissionsKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidatePermissionsKeyspaceResponse, error) { + return client.s.ValidatePermissionsKeyspace(ctx, in) +} + // ValidateSchemaKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) ValidateSchemaKeyspace(ctx context.Context, in *vtctldatapb.ValidateSchemaKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.ValidateSchemaKeyspaceResponse, error) { return client.s.ValidateSchemaKeyspace(ctx, in) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 9ad64c3d4fd..9bf7bb96a8e 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -588,7 +588,7 @@ var commands = []commandGroup{ name: "ValidateSchemaKeyspace", method: commandValidateSchemaKeyspace, params: "[--exclude_tables=''] [--include-views] [--skip-no-primary] [--include-vschema] ", - help: "Validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace.", + help: "Validates that the schema on the primary tablet for the first shard matches the schema on all of the other tablets in the keyspace.", }, { name: "ApplySchema", diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index f27851275b6..0c40c0dd6d6 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -3019,7 +3019,7 @@ func (s *Server) VReplicationExec(ctx context.Context, tabletAlias *topodatapb.T } // CopySchemaShard copies the schema from a source tablet to the -// specified shard. The schema is applied directly on the primary of +// specified shard. The schema is applied directly on the primary of // the destination shard, and is propagated to the replicas through // binlogs. func (s *Server) CopySchemaShard(ctx context.Context, sourceTabletAlias *topodatapb.TabletAlias, tables, excludeTables []string, includeViews bool, destKeyspace, destShard string, waitReplicasTimeout time.Duration, skipVerify bool) error { diff --git a/go/vt/vttablet/grpctmclient/client.go b/go/vt/vttablet/grpctmclient/client.go index 20aa1e5f39f..01d51e2993a 100644 --- a/go/vt/vttablet/grpctmclient/client.go +++ b/go/vt/vttablet/grpctmclient/client.go @@ -63,7 +63,7 @@ var ( name string ) -func registerFlags(fs *pflag.FlagSet) { +func RegisterFlags(fs *pflag.FlagSet) { fs.IntVar(&concurrency, "tablet_manager_grpc_concurrency", concurrency, "concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,App}, CheckThrottler and FullStatus)") fs.StringVar(&cert, "tablet_manager_grpc_cert", cert, "the cert to use to connect") fs.StringVar(&key, "tablet_manager_grpc_key", key, "the key to use to connect") @@ -92,7 +92,7 @@ func init() { }) for _, cmd := range _binaries { - servenv.OnParseFor(cmd, registerFlags) + servenv.OnParseFor(cmd, RegisterFlags) } } diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index b1e5fb215bc..498d6ee093e 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -556,6 +556,20 @@ message CompleteSchemaMigrationResponse { map rows_affected_by_shard = 1; } +message CopySchemaShardRequest { + topodata.TabletAlias source_tablet_alias = 1; + repeated string tables = 2; + repeated string exclude_tables = 3; + bool include_views = 4; + bool skip_verify = 5; + vttime.Duration wait_replicas_timeout = 6; + string destination_keyspace = 7; + string destination_shard = 8; +} + +message CopySchemaShardResponse { +} + message CreateKeyspaceRequest { // Name is the name of the keyspace. string name = 1; @@ -1860,12 +1874,25 @@ message ValidateKeyspaceResponse { map results_by_shard = 2; } +message ValidatePermissionsKeyspaceRequest { + string keyspace = 1; + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + repeated string shards = 2; +} + +message ValidatePermissionsKeyspaceResponse { +} + message ValidateSchemaKeyspaceRequest { string keyspace = 1; repeated string exclude_tables = 2; bool include_views = 3; bool skip_no_primary = 4; bool include_vschema = 5; + // If you only want to validate a subset of the shards in the + // keyspace, then specify a list of shard names. + repeated string shards = 6; } message ValidateSchemaKeyspaceResponse { diff --git a/proto/vtctlservice.proto b/proto/vtctlservice.proto index 3133d4fb4e1..d99e8f1775b 100644 --- a/proto/vtctlservice.proto +++ b/proto/vtctlservice.proto @@ -74,6 +74,8 @@ service Vtctld { rpc CompleteSchemaMigration(vtctldata.CompleteSchemaMigrationRequest) returns (vtctldata.CompleteSchemaMigrationResponse) {}; // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. rpc ConcludeTransaction(vtctldata.ConcludeTransactionRequest) returns (vtctldata.ConcludeTransactionResponse) {}; + // CopySchemaShard copies the schema from a source tablet to all tablets in a keyspace/shard. + rpc CopySchemaShard(vtctldata.CopySchemaShardRequest) returns (vtctldata.CopySchemaShardResponse) {}; // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -349,6 +351,8 @@ service Vtctld { // ValidateKeyspace validates that all nodes reachable from the specified // keyspace are consistent. rpc ValidateKeyspace(vtctldata.ValidateKeyspaceRequest) returns (vtctldata.ValidateKeyspaceResponse) {}; + // ValidatePermissionsKeyspace validates that all the permissions are the same in a keyspace. + rpc ValidatePermissionsKeyspace(vtctldata.ValidatePermissionsKeyspaceRequest) returns (vtctldata.ValidatePermissionsKeyspaceResponse) {}; // ValidateSchemaKeyspace validates that the schema on the primary tablet for shard 0 matches the schema on all of the other tablets in the keyspace. rpc ValidateSchemaKeyspace(vtctldata.ValidateSchemaKeyspaceRequest) returns (vtctldata.ValidateSchemaKeyspaceResponse) {}; // ValidateShard validates that all nodes reachable from the specified shard diff --git a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx index 6b123258d3c..4a8c83a5fe2 100644 --- a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx +++ b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx @@ -79,8 +79,8 @@ const KeyspaceActions: React.FC = ({ keyspace, clusterID } isOpen={currentDialog === 'Validate Schema'} body={
- Validates that the schema on the primary tablet for shard 0 matches the schema on all of the - other tablets in the keyspace {keyspace}. + Validates that the schema on the primary tablet for the first shard matches the schema on all of + the other tablets in the keyspace {keyspace}.
} successBody={ diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 0e6790010bc..e8fd5040baf 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -55980,6 +55980,236 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a CopySchemaShardRequest. */ + interface ICopySchemaShardRequest { + + /** CopySchemaShardRequest source_tablet_alias */ + source_tablet_alias?: (topodata.ITabletAlias|null); + + /** CopySchemaShardRequest tables */ + tables?: (string[]|null); + + /** CopySchemaShardRequest exclude_tables */ + exclude_tables?: (string[]|null); + + /** CopySchemaShardRequest include_views */ + include_views?: (boolean|null); + + /** CopySchemaShardRequest skip_verify */ + skip_verify?: (boolean|null); + + /** CopySchemaShardRequest wait_replicas_timeout */ + wait_replicas_timeout?: (vttime.IDuration|null); + + /** CopySchemaShardRequest destination_keyspace */ + destination_keyspace?: (string|null); + + /** CopySchemaShardRequest destination_shard */ + destination_shard?: (string|null); + } + + /** Represents a CopySchemaShardRequest. */ + class CopySchemaShardRequest implements ICopySchemaShardRequest { + + /** + * Constructs a new CopySchemaShardRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ICopySchemaShardRequest); + + /** CopySchemaShardRequest source_tablet_alias. */ + public source_tablet_alias?: (topodata.ITabletAlias|null); + + /** CopySchemaShardRequest tables. */ + public tables: string[]; + + /** CopySchemaShardRequest exclude_tables. */ + public exclude_tables: string[]; + + /** CopySchemaShardRequest include_views. */ + public include_views: boolean; + + /** CopySchemaShardRequest skip_verify. */ + public skip_verify: boolean; + + /** CopySchemaShardRequest wait_replicas_timeout. */ + public wait_replicas_timeout?: (vttime.IDuration|null); + + /** CopySchemaShardRequest destination_keyspace. */ + public destination_keyspace: string; + + /** CopySchemaShardRequest destination_shard. */ + public destination_shard: string; + + /** + * Creates a new CopySchemaShardRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns CopySchemaShardRequest instance + */ + public static create(properties?: vtctldata.ICopySchemaShardRequest): vtctldata.CopySchemaShardRequest; + + /** + * Encodes the specified CopySchemaShardRequest message. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @param message CopySchemaShardRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ICopySchemaShardRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CopySchemaShardRequest message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @param message CopySchemaShardRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ICopySchemaShardRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.CopySchemaShardRequest; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.CopySchemaShardRequest; + + /** + * Verifies a CopySchemaShardRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CopySchemaShardRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CopySchemaShardRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.CopySchemaShardRequest; + + /** + * Creates a plain object from a CopySchemaShardRequest message. Also converts values to other types if specified. + * @param message CopySchemaShardRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.CopySchemaShardRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CopySchemaShardRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for CopySchemaShardRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a CopySchemaShardResponse. */ + interface ICopySchemaShardResponse { + } + + /** Represents a CopySchemaShardResponse. */ + class CopySchemaShardResponse implements ICopySchemaShardResponse { + + /** + * Constructs a new CopySchemaShardResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ICopySchemaShardResponse); + + /** + * Creates a new CopySchemaShardResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns CopySchemaShardResponse instance + */ + public static create(properties?: vtctldata.ICopySchemaShardResponse): vtctldata.CopySchemaShardResponse; + + /** + * Encodes the specified CopySchemaShardResponse message. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @param message CopySchemaShardResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ICopySchemaShardResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CopySchemaShardResponse message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @param message CopySchemaShardResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ICopySchemaShardResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.CopySchemaShardResponse; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.CopySchemaShardResponse; + + /** + * Verifies a CopySchemaShardResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CopySchemaShardResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CopySchemaShardResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.CopySchemaShardResponse; + + /** + * Creates a plain object from a CopySchemaShardResponse message. Also converts values to other types if specified. + * @param message CopySchemaShardResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.CopySchemaShardResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CopySchemaShardResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for CopySchemaShardResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a CreateKeyspaceRequest. */ interface ICreateKeyspaceRequest { @@ -75760,6 +75990,200 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ValidatePermissionsKeyspaceRequest. */ + interface IValidatePermissionsKeyspaceRequest { + + /** ValidatePermissionsKeyspaceRequest keyspace */ + keyspace?: (string|null); + + /** ValidatePermissionsKeyspaceRequest shards */ + shards?: (string[]|null); + } + + /** Represents a ValidatePermissionsKeyspaceRequest. */ + class ValidatePermissionsKeyspaceRequest implements IValidatePermissionsKeyspaceRequest { + + /** + * Constructs a new ValidatePermissionsKeyspaceRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IValidatePermissionsKeyspaceRequest); + + /** ValidatePermissionsKeyspaceRequest keyspace. */ + public keyspace: string; + + /** ValidatePermissionsKeyspaceRequest shards. */ + public shards: string[]; + + /** + * Creates a new ValidatePermissionsKeyspaceRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidatePermissionsKeyspaceRequest instance + */ + public static create(properties?: vtctldata.IValidatePermissionsKeyspaceRequest): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IValidatePermissionsKeyspaceRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IValidatePermissionsKeyspaceRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Verifies a ValidatePermissionsKeyspaceRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidatePermissionsKeyspaceRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidatePermissionsKeyspaceRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ValidatePermissionsKeyspaceRequest; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceRequest message. Also converts values to other types if specified. + * @param message ValidatePermissionsKeyspaceRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ValidatePermissionsKeyspaceRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidatePermissionsKeyspaceRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ValidatePermissionsKeyspaceResponse. */ + interface IValidatePermissionsKeyspaceResponse { + } + + /** Represents a ValidatePermissionsKeyspaceResponse. */ + class ValidatePermissionsKeyspaceResponse implements IValidatePermissionsKeyspaceResponse { + + /** + * Constructs a new ValidatePermissionsKeyspaceResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IValidatePermissionsKeyspaceResponse); + + /** + * Creates a new ValidatePermissionsKeyspaceResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidatePermissionsKeyspaceResponse instance + */ + public static create(properties?: vtctldata.IValidatePermissionsKeyspaceResponse): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IValidatePermissionsKeyspaceResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @param message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IValidatePermissionsKeyspaceResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Verifies a ValidatePermissionsKeyspaceResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidatePermissionsKeyspaceResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidatePermissionsKeyspaceResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ValidatePermissionsKeyspaceResponse; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceResponse message. Also converts values to other types if specified. + * @param message ValidatePermissionsKeyspaceResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ValidatePermissionsKeyspaceResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidatePermissionsKeyspaceResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a ValidateSchemaKeyspaceRequest. */ interface IValidateSchemaKeyspaceRequest { @@ -75777,6 +76201,9 @@ export namespace vtctldata { /** ValidateSchemaKeyspaceRequest include_vschema */ include_vschema?: (boolean|null); + + /** ValidateSchemaKeyspaceRequest shards */ + shards?: (string[]|null); } /** Represents a ValidateSchemaKeyspaceRequest. */ @@ -75803,6 +76230,9 @@ export namespace vtctldata { /** ValidateSchemaKeyspaceRequest include_vschema. */ public include_vschema: boolean; + /** ValidateSchemaKeyspaceRequest shards. */ + public shards: string[]; + /** * Creates a new ValidateSchemaKeyspaceRequest instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index ed8ce616076..d215662ab7c 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -138383,6 +138383,590 @@ export const vtctldata = $root.vtctldata = (() => { return CompleteSchemaMigrationResponse; })(); + vtctldata.CopySchemaShardRequest = (function() { + + /** + * Properties of a CopySchemaShardRequest. + * @memberof vtctldata + * @interface ICopySchemaShardRequest + * @property {topodata.ITabletAlias|null} [source_tablet_alias] CopySchemaShardRequest source_tablet_alias + * @property {Array.|null} [tables] CopySchemaShardRequest tables + * @property {Array.|null} [exclude_tables] CopySchemaShardRequest exclude_tables + * @property {boolean|null} [include_views] CopySchemaShardRequest include_views + * @property {boolean|null} [skip_verify] CopySchemaShardRequest skip_verify + * @property {vttime.IDuration|null} [wait_replicas_timeout] CopySchemaShardRequest wait_replicas_timeout + * @property {string|null} [destination_keyspace] CopySchemaShardRequest destination_keyspace + * @property {string|null} [destination_shard] CopySchemaShardRequest destination_shard + */ + + /** + * Constructs a new CopySchemaShardRequest. + * @memberof vtctldata + * @classdesc Represents a CopySchemaShardRequest. + * @implements ICopySchemaShardRequest + * @constructor + * @param {vtctldata.ICopySchemaShardRequest=} [properties] Properties to set + */ + function CopySchemaShardRequest(properties) { + this.tables = []; + this.exclude_tables = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CopySchemaShardRequest source_tablet_alias. + * @member {topodata.ITabletAlias|null|undefined} source_tablet_alias + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.source_tablet_alias = null; + + /** + * CopySchemaShardRequest tables. + * @member {Array.} tables + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.tables = $util.emptyArray; + + /** + * CopySchemaShardRequest exclude_tables. + * @member {Array.} exclude_tables + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.exclude_tables = $util.emptyArray; + + /** + * CopySchemaShardRequest include_views. + * @member {boolean} include_views + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.include_views = false; + + /** + * CopySchemaShardRequest skip_verify. + * @member {boolean} skip_verify + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.skip_verify = false; + + /** + * CopySchemaShardRequest wait_replicas_timeout. + * @member {vttime.IDuration|null|undefined} wait_replicas_timeout + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.wait_replicas_timeout = null; + + /** + * CopySchemaShardRequest destination_keyspace. + * @member {string} destination_keyspace + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.destination_keyspace = ""; + + /** + * CopySchemaShardRequest destination_shard. + * @member {string} destination_shard + * @memberof vtctldata.CopySchemaShardRequest + * @instance + */ + CopySchemaShardRequest.prototype.destination_shard = ""; + + /** + * Creates a new CopySchemaShardRequest instance using the specified properties. + * @function create + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest=} [properties] Properties to set + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest instance + */ + CopySchemaShardRequest.create = function create(properties) { + return new CopySchemaShardRequest(properties); + }; + + /** + * Encodes the specified CopySchemaShardRequest message. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest} message CopySchemaShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.source_tablet_alias != null && Object.hasOwnProperty.call(message, "source_tablet_alias")) + $root.topodata.TabletAlias.encode(message.source_tablet_alias, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.tables != null && message.tables.length) + for (let i = 0; i < message.tables.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.tables[i]); + if (message.exclude_tables != null && message.exclude_tables.length) + for (let i = 0; i < message.exclude_tables.length; ++i) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.exclude_tables[i]); + if (message.include_views != null && Object.hasOwnProperty.call(message, "include_views")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.include_views); + if (message.skip_verify != null && Object.hasOwnProperty.call(message, "skip_verify")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.skip_verify); + if (message.wait_replicas_timeout != null && Object.hasOwnProperty.call(message, "wait_replicas_timeout")) + $root.vttime.Duration.encode(message.wait_replicas_timeout, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.destination_keyspace != null && Object.hasOwnProperty.call(message, "destination_keyspace")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.destination_keyspace); + if (message.destination_shard != null && Object.hasOwnProperty.call(message, "destination_shard")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.destination_shard); + return writer; + }; + + /** + * Encodes the specified CopySchemaShardRequest message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.ICopySchemaShardRequest} message CopySchemaShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.CopySchemaShardRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.source_tablet_alias = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } + case 2: { + if (!(message.tables && message.tables.length)) + message.tables = []; + message.tables.push(reader.string()); + break; + } + case 3: { + if (!(message.exclude_tables && message.exclude_tables.length)) + message.exclude_tables = []; + message.exclude_tables.push(reader.string()); + break; + } + case 4: { + message.include_views = reader.bool(); + break; + } + case 5: { + message.skip_verify = reader.bool(); + break; + } + case 6: { + message.wait_replicas_timeout = $root.vttime.Duration.decode(reader, reader.uint32()); + break; + } + case 7: { + message.destination_keyspace = reader.string(); + break; + } + case 8: { + message.destination_shard = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CopySchemaShardRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CopySchemaShardRequest message. + * @function verify + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CopySchemaShardRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.source_tablet_alias != null && message.hasOwnProperty("source_tablet_alias")) { + let error = $root.topodata.TabletAlias.verify(message.source_tablet_alias); + if (error) + return "source_tablet_alias." + error; + } + if (message.tables != null && message.hasOwnProperty("tables")) { + if (!Array.isArray(message.tables)) + return "tables: array expected"; + for (let i = 0; i < message.tables.length; ++i) + if (!$util.isString(message.tables[i])) + return "tables: string[] expected"; + } + if (message.exclude_tables != null && message.hasOwnProperty("exclude_tables")) { + if (!Array.isArray(message.exclude_tables)) + return "exclude_tables: array expected"; + for (let i = 0; i < message.exclude_tables.length; ++i) + if (!$util.isString(message.exclude_tables[i])) + return "exclude_tables: string[] expected"; + } + if (message.include_views != null && message.hasOwnProperty("include_views")) + if (typeof message.include_views !== "boolean") + return "include_views: boolean expected"; + if (message.skip_verify != null && message.hasOwnProperty("skip_verify")) + if (typeof message.skip_verify !== "boolean") + return "skip_verify: boolean expected"; + if (message.wait_replicas_timeout != null && message.hasOwnProperty("wait_replicas_timeout")) { + let error = $root.vttime.Duration.verify(message.wait_replicas_timeout); + if (error) + return "wait_replicas_timeout." + error; + } + if (message.destination_keyspace != null && message.hasOwnProperty("destination_keyspace")) + if (!$util.isString(message.destination_keyspace)) + return "destination_keyspace: string expected"; + if (message.destination_shard != null && message.hasOwnProperty("destination_shard")) + if (!$util.isString(message.destination_shard)) + return "destination_shard: string expected"; + return null; + }; + + /** + * Creates a CopySchemaShardRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.CopySchemaShardRequest} CopySchemaShardRequest + */ + CopySchemaShardRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.CopySchemaShardRequest) + return object; + let message = new $root.vtctldata.CopySchemaShardRequest(); + if (object.source_tablet_alias != null) { + if (typeof object.source_tablet_alias !== "object") + throw TypeError(".vtctldata.CopySchemaShardRequest.source_tablet_alias: object expected"); + message.source_tablet_alias = $root.topodata.TabletAlias.fromObject(object.source_tablet_alias); + } + if (object.tables) { + if (!Array.isArray(object.tables)) + throw TypeError(".vtctldata.CopySchemaShardRequest.tables: array expected"); + message.tables = []; + for (let i = 0; i < object.tables.length; ++i) + message.tables[i] = String(object.tables[i]); + } + if (object.exclude_tables) { + if (!Array.isArray(object.exclude_tables)) + throw TypeError(".vtctldata.CopySchemaShardRequest.exclude_tables: array expected"); + message.exclude_tables = []; + for (let i = 0; i < object.exclude_tables.length; ++i) + message.exclude_tables[i] = String(object.exclude_tables[i]); + } + if (object.include_views != null) + message.include_views = Boolean(object.include_views); + if (object.skip_verify != null) + message.skip_verify = Boolean(object.skip_verify); + if (object.wait_replicas_timeout != null) { + if (typeof object.wait_replicas_timeout !== "object") + throw TypeError(".vtctldata.CopySchemaShardRequest.wait_replicas_timeout: object expected"); + message.wait_replicas_timeout = $root.vttime.Duration.fromObject(object.wait_replicas_timeout); + } + if (object.destination_keyspace != null) + message.destination_keyspace = String(object.destination_keyspace); + if (object.destination_shard != null) + message.destination_shard = String(object.destination_shard); + return message; + }; + + /** + * Creates a plain object from a CopySchemaShardRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {vtctldata.CopySchemaShardRequest} message CopySchemaShardRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CopySchemaShardRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) { + object.tables = []; + object.exclude_tables = []; + } + if (options.defaults) { + object.source_tablet_alias = null; + object.include_views = false; + object.skip_verify = false; + object.wait_replicas_timeout = null; + object.destination_keyspace = ""; + object.destination_shard = ""; + } + if (message.source_tablet_alias != null && message.hasOwnProperty("source_tablet_alias")) + object.source_tablet_alias = $root.topodata.TabletAlias.toObject(message.source_tablet_alias, options); + if (message.tables && message.tables.length) { + object.tables = []; + for (let j = 0; j < message.tables.length; ++j) + object.tables[j] = message.tables[j]; + } + if (message.exclude_tables && message.exclude_tables.length) { + object.exclude_tables = []; + for (let j = 0; j < message.exclude_tables.length; ++j) + object.exclude_tables[j] = message.exclude_tables[j]; + } + if (message.include_views != null && message.hasOwnProperty("include_views")) + object.include_views = message.include_views; + if (message.skip_verify != null && message.hasOwnProperty("skip_verify")) + object.skip_verify = message.skip_verify; + if (message.wait_replicas_timeout != null && message.hasOwnProperty("wait_replicas_timeout")) + object.wait_replicas_timeout = $root.vttime.Duration.toObject(message.wait_replicas_timeout, options); + if (message.destination_keyspace != null && message.hasOwnProperty("destination_keyspace")) + object.destination_keyspace = message.destination_keyspace; + if (message.destination_shard != null && message.hasOwnProperty("destination_shard")) + object.destination_shard = message.destination_shard; + return object; + }; + + /** + * Converts this CopySchemaShardRequest to JSON. + * @function toJSON + * @memberof vtctldata.CopySchemaShardRequest + * @instance + * @returns {Object.} JSON object + */ + CopySchemaShardRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for CopySchemaShardRequest + * @function getTypeUrl + * @memberof vtctldata.CopySchemaShardRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + CopySchemaShardRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.CopySchemaShardRequest"; + }; + + return CopySchemaShardRequest; + })(); + + vtctldata.CopySchemaShardResponse = (function() { + + /** + * Properties of a CopySchemaShardResponse. + * @memberof vtctldata + * @interface ICopySchemaShardResponse + */ + + /** + * Constructs a new CopySchemaShardResponse. + * @memberof vtctldata + * @classdesc Represents a CopySchemaShardResponse. + * @implements ICopySchemaShardResponse + * @constructor + * @param {vtctldata.ICopySchemaShardResponse=} [properties] Properties to set + */ + function CopySchemaShardResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new CopySchemaShardResponse instance using the specified properties. + * @function create + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse=} [properties] Properties to set + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse instance + */ + CopySchemaShardResponse.create = function create(properties) { + return new CopySchemaShardResponse(properties); + }; + + /** + * Encodes the specified CopySchemaShardResponse message. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse} message CopySchemaShardResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified CopySchemaShardResponse message, length delimited. Does not implicitly {@link vtctldata.CopySchemaShardResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.ICopySchemaShardResponse} message CopySchemaShardResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CopySchemaShardResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.CopySchemaShardResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CopySchemaShardResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CopySchemaShardResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CopySchemaShardResponse message. + * @function verify + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CopySchemaShardResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a CopySchemaShardResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.CopySchemaShardResponse} CopySchemaShardResponse + */ + CopySchemaShardResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.CopySchemaShardResponse) + return object; + return new $root.vtctldata.CopySchemaShardResponse(); + }; + + /** + * Creates a plain object from a CopySchemaShardResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {vtctldata.CopySchemaShardResponse} message CopySchemaShardResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CopySchemaShardResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this CopySchemaShardResponse to JSON. + * @function toJSON + * @memberof vtctldata.CopySchemaShardResponse + * @instance + * @returns {Object.} JSON object + */ + CopySchemaShardResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for CopySchemaShardResponse + * @function getTypeUrl + * @memberof vtctldata.CopySchemaShardResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + CopySchemaShardResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.CopySchemaShardResponse"; + }; + + return CopySchemaShardResponse; + })(); + vtctldata.CreateKeyspaceRequest = (function() { /** @@ -184806,6 +185390,424 @@ export const vtctldata = $root.vtctldata = (() => { return ValidateKeyspaceResponse; })(); + vtctldata.ValidatePermissionsKeyspaceRequest = (function() { + + /** + * Properties of a ValidatePermissionsKeyspaceRequest. + * @memberof vtctldata + * @interface IValidatePermissionsKeyspaceRequest + * @property {string|null} [keyspace] ValidatePermissionsKeyspaceRequest keyspace + * @property {Array.|null} [shards] ValidatePermissionsKeyspaceRequest shards + */ + + /** + * Constructs a new ValidatePermissionsKeyspaceRequest. + * @memberof vtctldata + * @classdesc Represents a ValidatePermissionsKeyspaceRequest. + * @implements IValidatePermissionsKeyspaceRequest + * @constructor + * @param {vtctldata.IValidatePermissionsKeyspaceRequest=} [properties] Properties to set + */ + function ValidatePermissionsKeyspaceRequest(properties) { + this.shards = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ValidatePermissionsKeyspaceRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + */ + ValidatePermissionsKeyspaceRequest.prototype.keyspace = ""; + + /** + * ValidatePermissionsKeyspaceRequest shards. + * @member {Array.} shards + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + */ + ValidatePermissionsKeyspaceRequest.prototype.shards = $util.emptyArray; + + /** + * Creates a new ValidatePermissionsKeyspaceRequest instance using the specified properties. + * @function create + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest=} [properties] Properties to set + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest instance + */ + ValidatePermissionsKeyspaceRequest.create = function create(properties) { + return new ValidatePermissionsKeyspaceRequest(properties); + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.shards != null && message.shards.length) + for (let i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.shards[i]); + return writer; + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceRequest message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ValidatePermissionsKeyspaceRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.keyspace = reader.string(); + break; + } + case 2: { + if (!(message.shards && message.shards.length)) + message.shards = []; + message.shards.push(reader.string()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatePermissionsKeyspaceRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatePermissionsKeyspaceRequest message. + * @function verify + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatePermissionsKeyspaceRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (let i = 0; i < message.shards.length; ++i) + if (!$util.isString(message.shards[i])) + return "shards: string[] expected"; + } + return null; + }; + + /** + * Creates a ValidatePermissionsKeyspaceRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ValidatePermissionsKeyspaceRequest} ValidatePermissionsKeyspaceRequest + */ + ValidatePermissionsKeyspaceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ValidatePermissionsKeyspaceRequest) + return object; + let message = new $root.vtctldata.ValidatePermissionsKeyspaceRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".vtctldata.ValidatePermissionsKeyspaceRequest.shards: array expected"); + message.shards = []; + for (let i = 0; i < object.shards.length; ++i) + message.shards[i] = String(object.shards[i]); + } + return message; + }; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {vtctldata.ValidatePermissionsKeyspaceRequest} message ValidatePermissionsKeyspaceRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatePermissionsKeyspaceRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.shards = []; + if (options.defaults) + object.keyspace = ""; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.shards && message.shards.length) { + object.shards = []; + for (let j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } + return object; + }; + + /** + * Converts this ValidatePermissionsKeyspaceRequest to JSON. + * @function toJSON + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @instance + * @returns {Object.} JSON object + */ + ValidatePermissionsKeyspaceRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceRequest + * @function getTypeUrl + * @memberof vtctldata.ValidatePermissionsKeyspaceRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidatePermissionsKeyspaceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ValidatePermissionsKeyspaceRequest"; + }; + + return ValidatePermissionsKeyspaceRequest; + })(); + + vtctldata.ValidatePermissionsKeyspaceResponse = (function() { + + /** + * Properties of a ValidatePermissionsKeyspaceResponse. + * @memberof vtctldata + * @interface IValidatePermissionsKeyspaceResponse + */ + + /** + * Constructs a new ValidatePermissionsKeyspaceResponse. + * @memberof vtctldata + * @classdesc Represents a ValidatePermissionsKeyspaceResponse. + * @implements IValidatePermissionsKeyspaceResponse + * @constructor + * @param {vtctldata.IValidatePermissionsKeyspaceResponse=} [properties] Properties to set + */ + function ValidatePermissionsKeyspaceResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ValidatePermissionsKeyspaceResponse instance using the specified properties. + * @function create + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse=} [properties] Properties to set + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse instance + */ + ValidatePermissionsKeyspaceResponse.create = function create(properties) { + return new ValidatePermissionsKeyspaceResponse(properties); + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ValidatePermissionsKeyspaceResponse message, length delimited. Does not implicitly {@link vtctldata.ValidatePermissionsKeyspaceResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.IValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidatePermissionsKeyspaceResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ValidatePermissionsKeyspaceResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidatePermissionsKeyspaceResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidatePermissionsKeyspaceResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidatePermissionsKeyspaceResponse message. + * @function verify + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidatePermissionsKeyspaceResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ValidatePermissionsKeyspaceResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ValidatePermissionsKeyspaceResponse} ValidatePermissionsKeyspaceResponse + */ + ValidatePermissionsKeyspaceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ValidatePermissionsKeyspaceResponse) + return object; + return new $root.vtctldata.ValidatePermissionsKeyspaceResponse(); + }; + + /** + * Creates a plain object from a ValidatePermissionsKeyspaceResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {vtctldata.ValidatePermissionsKeyspaceResponse} message ValidatePermissionsKeyspaceResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidatePermissionsKeyspaceResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ValidatePermissionsKeyspaceResponse to JSON. + * @function toJSON + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @instance + * @returns {Object.} JSON object + */ + ValidatePermissionsKeyspaceResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidatePermissionsKeyspaceResponse + * @function getTypeUrl + * @memberof vtctldata.ValidatePermissionsKeyspaceResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidatePermissionsKeyspaceResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ValidatePermissionsKeyspaceResponse"; + }; + + return ValidatePermissionsKeyspaceResponse; + })(); + vtctldata.ValidateSchemaKeyspaceRequest = (function() { /** @@ -184817,6 +185819,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [include_views] ValidateSchemaKeyspaceRequest include_views * @property {boolean|null} [skip_no_primary] ValidateSchemaKeyspaceRequest skip_no_primary * @property {boolean|null} [include_vschema] ValidateSchemaKeyspaceRequest include_vschema + * @property {Array.|null} [shards] ValidateSchemaKeyspaceRequest shards */ /** @@ -184829,6 +185832,7 @@ export const vtctldata = $root.vtctldata = (() => { */ function ValidateSchemaKeyspaceRequest(properties) { this.exclude_tables = []; + this.shards = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -184875,6 +185879,14 @@ export const vtctldata = $root.vtctldata = (() => { */ ValidateSchemaKeyspaceRequest.prototype.include_vschema = false; + /** + * ValidateSchemaKeyspaceRequest shards. + * @member {Array.} shards + * @memberof vtctldata.ValidateSchemaKeyspaceRequest + * @instance + */ + ValidateSchemaKeyspaceRequest.prototype.shards = $util.emptyArray; + /** * Creates a new ValidateSchemaKeyspaceRequest instance using the specified properties. * @function create @@ -184910,6 +185922,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 4, wireType 0 =*/32).bool(message.skip_no_primary); if (message.include_vschema != null && Object.hasOwnProperty.call(message, "include_vschema")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.include_vschema); + if (message.shards != null && message.shards.length) + for (let i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.shards[i]); return writer; }; @@ -184966,6 +185981,12 @@ export const vtctldata = $root.vtctldata = (() => { message.include_vschema = reader.bool(); break; } + case 6: { + if (!(message.shards && message.shards.length)) + message.shards = []; + message.shards.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -185020,6 +186041,13 @@ export const vtctldata = $root.vtctldata = (() => { if (message.include_vschema != null && message.hasOwnProperty("include_vschema")) if (typeof message.include_vschema !== "boolean") return "include_vschema: boolean expected"; + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (let i = 0; i < message.shards.length; ++i) + if (!$util.isString(message.shards[i])) + return "shards: string[] expected"; + } return null; }; @@ -185050,6 +186078,13 @@ export const vtctldata = $root.vtctldata = (() => { message.skip_no_primary = Boolean(object.skip_no_primary); if (object.include_vschema != null) message.include_vschema = Boolean(object.include_vschema); + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".vtctldata.ValidateSchemaKeyspaceRequest.shards: array expected"); + message.shards = []; + for (let i = 0; i < object.shards.length; ++i) + message.shards[i] = String(object.shards[i]); + } return message; }; @@ -185066,8 +186101,10 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; - if (options.arrays || options.defaults) + if (options.arrays || options.defaults) { object.exclude_tables = []; + object.shards = []; + } if (options.defaults) { object.keyspace = ""; object.include_views = false; @@ -185087,6 +186124,11 @@ export const vtctldata = $root.vtctldata = (() => { object.skip_no_primary = message.skip_no_primary; if (message.include_vschema != null && message.hasOwnProperty("include_vschema")) object.include_vschema = message.include_vschema; + if (message.shards && message.shards.length) { + object.shards = []; + for (let j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } return object; }; From 9743929544176aa70e534ca9f557f1d4380feb7f Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:11:36 +0530 Subject: [PATCH 56/66] Fix config file not found handling (#17578) Signed-off-by: Manan Gupta --- go/viperutil/config.go | 19 +++++++++---- go/viperutil/config_test.go | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/go/viperutil/config.go b/go/viperutil/config.go index 49e3f960875..33cc112b4af 100644 --- a/go/viperutil/config.go +++ b/go/viperutil/config.go @@ -18,6 +18,7 @@ package viperutil import ( "context" + "errors" "fmt" "os" "reflect" @@ -162,19 +163,19 @@ func LoadConfig() (context.CancelFunc, error) { } if err != nil { - if nferr, ok := err.(viper.ConfigFileNotFoundError); ok { + if isConfigFileNotFoundError(err) { msg := "Failed to read in config %s: %s" switch configFileNotFoundHandling.Get() { case WarnOnConfigFileNotFound: msg += ". This is optional, and can be ignored if you are not using config files. For a detailed explanation, see https://github.com/vitessio/vitess/blob/main/doc/viper/viper.md#config-files." - log.WARN(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.WARN(msg, registry.Static.ConfigFileUsed(), err.Error()) fallthrough // after warning, ignore the error case IgnoreConfigFileNotFound: - err = nil + return func() {}, nil case ErrorOnConfigFileNotFound: - log.ERROR(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.ERROR(msg, registry.Static.ConfigFileUsed(), err.Error()) case ExitOnConfigFileNotFound: - log.CRITICAL(msg, registry.Static.ConfigFileUsed(), nferr.Error()) + log.CRITICAL(msg, registry.Static.ConfigFileUsed(), err.Error()) } } } @@ -186,6 +187,14 @@ func LoadConfig() (context.CancelFunc, error) { return registry.Dynamic.Watch(context.Background(), registry.Static, configPersistenceMinInterval.Get()) } +// isConfigFileNotFoundError checks if the error is caused because the file wasn't found. +func isConfigFileNotFoundError(err error) bool { + if errors.As(err, &viper.ConfigFileNotFoundError{}) { + return true + } + return errors.Is(err, os.ErrNotExist) +} + // NotifyConfigReload adds a subscription that the dynamic registry will attempt // to notify on config changes. The notification fires after the updated config // has been loaded from disk into the live config. diff --git a/go/viperutil/config_test.go b/go/viperutil/config_test.go index 8e00a4700ac..4b67f0791f5 100644 --- a/go/viperutil/config_test.go +++ b/go/viperutil/config_test.go @@ -47,3 +47,60 @@ duration: 10h assert.Equal(t, IgnoreConfigFileNotFound, getHandlingValueFunc("duration"), "failed to get value on duration key") assert.Equal(t, ExitOnConfigFileNotFound, getHandlingValueFunc("default"), "failed to get value on default key") } + +// TestLoadConfig tests that LoadConfig behaves in the way expected when the config file doesn't exist. +func TestLoadConfig(t *testing.T) { + origConfigFile := configFile.Get() + origConfigName := configName.Get() + origConfigFileNotFoundHandling := configFileNotFoundHandling.Get() + defer func() { + configFile.Set(origConfigFile) + configName.Set(origConfigName) + configFileNotFoundHandling.Set(origConfigFileNotFoundHandling) + }() + + t.Run("Ignore file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(IgnoreConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(IgnoreConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Warn file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(WarnOnConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(WarnOnConfigFileNotFound) + _, err := LoadConfig() + require.NoError(t, err) + }) + + t.Run("Error file not found error", func(t *testing.T) { + configFile.Set("notfound.yaml") + configFileNotFoundHandling.Set(ErrorOnConfigFileNotFound) + _, err := LoadConfig() + require.Error(t, err) + }) + + t.Run("Ignore file not found error from config name", func(t *testing.T) { + configFile.Set("") + configName.Set("notfound") + configFileNotFoundHandling.Set(ErrorOnConfigFileNotFound) + _, err := LoadConfig() + require.Error(t, err) + }) +} From aaee12a80f1770dda20ae4dd2490e161e378fede Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 22 Jan 2025 07:48:41 +0200 Subject: [PATCH 57/66] `sendBinlogDumpCommand`: apply BinlogThroughGTID flag (#17580) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/binlog_dump.go | 22 +++++++++---------- go/mysql/flavor_mysql.go | 9 +++++++- go/mysql/replication/mysql56_gtid_set_test.go | 15 +++++++++++++ go/mysql/replication_test.go | 4 +++- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/go/mysql/binlog_dump.go b/go/mysql/binlog_dump.go index d6768056974..de91484fc64 100644 --- a/go/mysql/binlog_dump.go +++ b/go/mysql/binlog_dump.go @@ -72,21 +72,19 @@ func (c *Conn) parseComBinlogDumpGTID(data []byte) (logFile string, logPos uint6 return logFile, logPos, position, readPacketErr } - if flags2&BinlogDumpNonBlock != 0 { - return logFile, logPos, position, io.EOF + dataSize, pos, ok := readUint32(data, pos) + if !ok { + return logFile, logPos, position, readPacketErr } - if flags2&BinlogThroughGTID != 0 { - dataSize, pos, ok := readUint32(data, pos) - if !ok { - return logFile, logPos, position, readPacketErr - } - if gtid := string(data[pos : pos+int(dataSize)]); gtid != "" { - position, err = replication.DecodePosition(gtid) - if err != nil { - return logFile, logPos, position, err - } + if gtid := string(data[pos : pos+int(dataSize)]); gtid != "" { + position, err = replication.DecodePosition(gtid) + if err != nil { + return logFile, logPos, position, err } } + if flags2&BinlogDumpNonBlock != 0 { + return logFile, logPos, position, io.EOF + } return logFile, logPos, position, nil } diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index e405dc401ec..c5424259973 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -219,7 +219,14 @@ func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, binlogFilenam // Build the command. sidBlock := gtidSet.SIDBlock() - return c.WriteComBinlogDumpGTID(serverID, binlogFilename, 4, 0, sidBlock) + var flags2 uint16 + if binlogFilename != "" { + flags2 |= BinlogThroughPosition + } + if len(sidBlock) > 0 { + flags2 |= BinlogThroughGTID + } + return c.WriteComBinlogDumpGTID(serverID, binlogFilename, 4, flags2, sidBlock) } // setReplicationPositionCommands is part of the Flavor interface. diff --git a/go/mysql/replication/mysql56_gtid_set_test.go b/go/mysql/replication/mysql56_gtid_set_test.go index bc5d5a6d6ec..bf87a992d5d 100644 --- a/go/mysql/replication/mysql56_gtid_set_test.go +++ b/go/mysql/replication/mysql56_gtid_set_test.go @@ -854,3 +854,18 @@ func TestMysql56GTIDSet_RemoveUUID(t *testing.T) { }) } } + +func TestSIDs(t *testing.T) { + var set Mysql56GTIDSet // nil + sids := set.SIDs() + assert.NotNil(t, sids) + assert.Empty(t, sids) + + gtid := "8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24" + gtidSet, err := ParseMysql56GTIDSet(gtid) + require.NoError(t, err) + sids = gtidSet.SIDs() + assert.NotNil(t, sids) + require.Len(t, sids, 1) + assert.Equal(t, "8bc65cca-3fe4-11ed-bbfb-091034d48b3e", sids[0].String()) +} diff --git a/go/mysql/replication_test.go b/go/mysql/replication_test.go index 680cb9e68dc..ded22d838f6 100644 --- a/go/mysql/replication_test.go +++ b/go/mysql/replication_test.go @@ -90,7 +90,9 @@ func TestComBinlogDumpGTID(t *testing.T) { t.Run("WriteComBinlogDumpGTID", func(t *testing.T) { // Write ComBinlogDumpGTID packet, read it, compare. - err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, 0x0d0e, []byte{0xfa, 0xfb}) + var flags uint16 = 0x0d0e + assert.Equal(t, flags, flags|BinlogThroughGTID) + err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, flags, []byte{0xfa, 0xfb}) assert.NoError(t, err) data, err := sConn.ReadPacket() require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err) From d1aa2f49f73193b993244e4fd559e98a9269cdf6 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 22 Jan 2025 13:36:51 +0530 Subject: [PATCH 58/66] Add option to log error queries only (#17554) Signed-off-by: Harshit Gangal Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- changelog/22.0/22.0.0/summary.md | 7 +- go/flags/endtoend/vtcombo.txt | 1 + go/flags/endtoend/vtgate.txt | 1 + go/flags/endtoend/vttablet.txt | 1 + go/streamlog/streamlog.go | 96 ++++++------- go/streamlog/streamlog_test.go | 79 ++++------- go/vt/vtexplain/vtexplain_vtgate.go | 7 +- go/vt/vtgate/bench_test.go | 2 +- go/vt/vtgate/executor.go | 94 ++++++------- go/vt/vtgate/executor_dml_test.go | 12 +- go/vt/vtgate/executor_framework_test.go | 38 ++++-- go/vt/vtgate/executor_select_test.go | 129 +++++++----------- go/vt/vtgate/executor_set_test.go | 7 +- go/vt/vtgate/executor_stream_test.go | 2 +- go/vt/vtgate/executor_test.go | 41 ++---- .../executorcontext/vcursor_impl_test.go | 4 +- go/vt/vtgate/logstats/logstats.go | 12 +- go/vt/vtgate/logstats/logstats_test.go | 53 ++++--- go/vt/vtgate/plan_execute.go | 2 +- go/vt/vtgate/querylog.go | 4 +- go/vt/vtgate/querylogz_test.go | 8 +- go/vt/vtgate/vtgate.go | 25 ++-- go/vt/vtgate/vtgate_test.go | 3 +- go/vt/vttablet/filelogger/filelogger_test.go | 9 +- .../sysloglogger/sysloglogger_test.go | 47 +++---- .../vttablet/tabletserver/dt_executor_test.go | 8 +- go/vt/vttablet/tabletserver/query_engine.go | 5 +- .../tabletserver/query_engine_test.go | 30 ++-- .../tabletserver/query_executor_test.go | 8 +- go/vt/vttablet/tabletserver/query_list.go | 13 +- go/vt/vttablet/tabletserver/querylogz_test.go | 5 +- .../stream_consolidator_flaky_test.go | 3 +- .../vttablet/tabletserver/tabletenv/config.go | 5 +- .../tabletserver/tabletenv/logstats.go | 14 +- .../tabletserver/tabletenv/logstats_test.go | 128 ++++++++--------- go/vt/vttablet/tabletserver/tabletserver.go | 9 +- .../tabletserver/tabletserver_test.go | 5 +- go/vt/vttablet/tabletserver/txlogz.go | 5 +- go/vt/vttablet/tabletserver/txlogz_test.go | 17 +-- .../txserializer/tx_serializer.go | 13 +- .../txserializer/tx_serializer_test.go | 7 +- 41 files changed, 457 insertions(+), 502 deletions(-) diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index f96679d4aa8..cbb1f37889c 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -15,6 +15,7 @@ - **[Stalled Disk Recovery in VTOrc](#stall-disk-recovery)** - **[Update default MySQL version to 8.0.40](#mysql-8-0-40)** - **[Update lite images to Debian Bookworm](#debian-bookworm)** + - **[Support for Filtering Query logs on Error](#query-logs)** - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** @@ -25,7 +26,7 @@ These are the RPC changes made in this release - -1. `GetTransactionInfo` RPC has been added to both `VtctldServer`, and `TabletManagerClient` interface. These RPCs are used to fecilitate the users in reading the state of an unresolved distributed transaction. This can be useful in debugging what went wrong and how to fix the problem. +1. `GetTransactionInfo` RPC has been added to both `VtctldServer`, and `TabletManagerClient` interface. These RPCs are used to facilitate the users in reading the state of an unresolved distributed transaction. This can be useful in debugging what went wrong and how to fix the problem. ### Deprecations and Deletions @@ -132,6 +133,10 @@ This is the last time this will be needed in the `8.0.x` series, as starting wit The base system now uses Debian Bookworm instead of Debian Bullseye for the `vitess/lite` images. This change was brought by [Pull Request #17552]. +### Support for Filtering Query logs on Error + +The `querylog-mode` setting can be configured to `error` to log only queries that result in errors. This option is supported in both VTGate and VTTablet. + ## Minor Changes #### VTTablet Flags diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index b9da44a5e79..561f6048ce6 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -272,6 +272,7 @@ Flags: --querylog-buffer-size int Maximum number of buffered query logs before throttling log output (default 10) --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --queryserver-config-acl-exempt-acl string an acl that exempt from table acl checking (this acl is free to access any vitess tables). diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 5d3f35ef7e1..1b3238bca87 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -177,6 +177,7 @@ Flags: --querylog-buffer-size int Maximum number of buffered query logs before throttling log output (default 10) --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --redact-debug-ui-queries redact full queries and bind variables from debug UI diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 1532bf870e0..398d10afd7c 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -264,6 +264,7 @@ Flags: --query-log-stream-handler string URL handler for streaming queries log (default "/debug/querylog") --querylog-filter-tag string string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization --querylog-format string format for query logs ("text" or "json") (default "text") + --querylog-mode string Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged. (default "all") --querylog-row-threshold uint Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged. --querylog-sample-rate float Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries) --queryserver-config-acl-exempt-acl string an acl that exempt from table acl checking (this acl is free to access any vitess tables). diff --git a/go/streamlog/streamlog.go b/go/streamlog/streamlog.go index 40d33b840b4..00fc4dd4478 100644 --- a/go/streamlog/streamlog.go +++ b/go/streamlog/streamlog.go @@ -20,7 +20,7 @@ package streamlog import ( "fmt" "io" - rand "math/rand/v2" + "math/rand/v2" "net/http" "net/url" "os" @@ -47,40 +47,42 @@ var ( []string{"Log", "Subscriber"}) ) -var ( - redactDebugUIQueries bool - queryLogFilterTag string - queryLogRowThreshold uint64 - queryLogFormat = "text" - queryLogSampleRate float64 -) +const ( + // QueryLogFormatText is the format specifier for text querylog output + QueryLogFormatText = "text" -func GetRedactDebugUIQueries() bool { - return redactDebugUIQueries -} + // QueryLogFormatJSON is the format specifier for json querylog output + QueryLogFormatJSON = "json" -func SetRedactDebugUIQueries(newRedactDebugUIQueries bool) { - redactDebugUIQueries = newRedactDebugUIQueries -} + // QueryLogModeAll is the mode specifier for logging all queries + QueryLogModeAll = "all" -func SetQueryLogFilterTag(newQueryLogFilterTag string) { - queryLogFilterTag = newQueryLogFilterTag -} + // QueryLogModeError is the mode specifier for logging only queries that return an error + QueryLogModeError = "error" +) -func SetQueryLogRowThreshold(newQueryLogRowThreshold uint64) { - queryLogRowThreshold = newQueryLogRowThreshold +type QueryLogConfig struct { + RedactDebugUIQueries bool + FilterTag string + Format string + Mode string + RowThreshold uint64 + sampleRate float64 } -func SetQueryLogSampleRate(sampleRate float64) { - queryLogSampleRate = sampleRate +var queryLogConfigInstance = QueryLogConfig{ + Format: QueryLogFormatText, + Mode: QueryLogModeAll, } -func GetQueryLogFormat() string { - return queryLogFormat +func GetQueryLogConfig() QueryLogConfig { + return queryLogConfigInstance } -func SetQueryLogFormat(newQueryLogFormat string) { - queryLogFormat = newQueryLogFormat +func NewQueryLogConfigForTest() QueryLogConfig { + return QueryLogConfig{ + Format: QueryLogFormatText, + } } func init() { @@ -91,28 +93,23 @@ func init() { func registerStreamLogFlags(fs *pflag.FlagSet) { // RedactDebugUIQueries controls whether full queries and bind variables are suppressed from debug UIs. - fs.BoolVar(&redactDebugUIQueries, "redact-debug-ui-queries", redactDebugUIQueries, "redact full queries and bind variables from debug UI") + fs.BoolVar(&queryLogConfigInstance.RedactDebugUIQueries, "redact-debug-ui-queries", queryLogConfigInstance.RedactDebugUIQueries, "redact full queries and bind variables from debug UI") // QueryLogFormat controls the format of the query log (either text or json) - fs.StringVar(&queryLogFormat, "querylog-format", queryLogFormat, "format for query logs (\"text\" or \"json\")") + fs.StringVar(&queryLogConfigInstance.Format, "querylog-format", queryLogConfigInstance.Format, "format for query logs (\"text\" or \"json\")") // QueryLogFilterTag contains an optional string that must be present in the query for it to be logged - fs.StringVar(&queryLogFilterTag, "querylog-filter-tag", queryLogFilterTag, "string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization") + fs.StringVar(&queryLogConfigInstance.FilterTag, "querylog-filter-tag", queryLogConfigInstance.FilterTag, "string that must be present in the query for it to be logged; if using a value as the tag, you need to disable query normalization") // QueryLogRowThreshold only log queries returning or affecting this many rows - fs.Uint64Var(&queryLogRowThreshold, "querylog-row-threshold", queryLogRowThreshold, "Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged.") + fs.Uint64Var(&queryLogConfigInstance.RowThreshold, "querylog-row-threshold", queryLogConfigInstance.RowThreshold, "Number of rows a query has to return or affect before being logged; not useful for streaming queries. 0 means all queries will be logged.") // QueryLogSampleRate causes a sample of queries to be logged - fs.Float64Var(&queryLogSampleRate, "querylog-sample-rate", queryLogSampleRate, "Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries)") -} - -const ( - // QueryLogFormatText is the format specifier for text querylog output - QueryLogFormatText = "text" + fs.Float64Var(&queryLogConfigInstance.sampleRate, "querylog-sample-rate", queryLogConfigInstance.sampleRate, "Sample rate for logging queries. Value must be between 0.0 (no logging) and 1.0 (all queries)") - // QueryLogFormatJSON is the format specifier for json querylog output - QueryLogFormatJSON = "json" -) + // QueryLogMode controls the mode for logging queries (all or error) + fs.StringVar(&queryLogConfigInstance.Mode, "querylog-mode", queryLogConfigInstance.Mode, `Mode for logging queries. "error" will only log queries that return an error. Otherwise all queries will be logged.`) +} // StreamLogger is a non-blocking broadcaster of messages. // Subscribers can use channels or HTTP. @@ -257,27 +254,30 @@ func GetFormatter[T any](logger *StreamLogger[T]) LogFormatter { } } -// shouldSampleQuery returns true if a query should be sampled based on queryLogSampleRate -func shouldSampleQuery() bool { - if queryLogSampleRate <= 0 { +// shouldSampleQuery returns true if a query should be sampled based on sampleRate +func (qlConfig QueryLogConfig) shouldSampleQuery() bool { + if qlConfig.sampleRate <= 0 { return false - } else if queryLogSampleRate >= 1 { + } else if qlConfig.sampleRate >= 1 { return true } - return rand.Float64() <= queryLogSampleRate + return rand.Float64() <= qlConfig.sampleRate } // ShouldEmitLog returns whether the log with the given SQL query // should be emitted or filtered -func ShouldEmitLog(sql string, rowsAffected, rowsReturned uint64) bool { - if shouldSampleQuery() { +func (qlConfig QueryLogConfig) ShouldEmitLog(sql string, rowsAffected, rowsReturned uint64, hasError bool) bool { + if qlConfig.shouldSampleQuery() { return true } - if queryLogRowThreshold > max(rowsAffected, rowsReturned) && queryLogFilterTag == "" { + if qlConfig.RowThreshold > max(rowsAffected, rowsReturned) && qlConfig.FilterTag == "" { return false } - if queryLogFilterTag != "" { - return strings.Contains(sql, queryLogFilterTag) + if qlConfig.FilterTag != "" { + return strings.Contains(sql, qlConfig.FilterTag) + } + if qlConfig.Mode == QueryLogModeError { + return hasError } return true } diff --git a/go/streamlog/streamlog_test.go b/go/streamlog/streamlog_test.go index c1321c92a94..8256ada479e 100644 --- a/go/streamlog/streamlog_test.go +++ b/go/streamlog/streamlog_test.go @@ -266,40 +266,29 @@ func TestFile(t *testing.T) { } func TestShouldSampleQuery(t *testing.T) { - queryLogSampleRate = -1 - assert.False(t, shouldSampleQuery()) + qlConfig := QueryLogConfig{sampleRate: -1} + assert.False(t, qlConfig.shouldSampleQuery()) - queryLogSampleRate = 0 - assert.False(t, shouldSampleQuery()) + qlConfig.sampleRate = 0 + assert.False(t, qlConfig.shouldSampleQuery()) - // for test coverage, can't test a random result - queryLogSampleRate = 0.5 - shouldSampleQuery() + qlConfig.sampleRate = 1.0 + assert.True(t, qlConfig.shouldSampleQuery()) - queryLogSampleRate = 1.0 - assert.True(t, shouldSampleQuery()) - - queryLogSampleRate = 100.0 - assert.True(t, shouldSampleQuery()) + qlConfig.sampleRate = 100.0 + assert.True(t, qlConfig.shouldSampleQuery()) } func TestShouldEmitLog(t *testing.T) { - origQueryLogFilterTag := queryLogFilterTag - origQueryLogRowThreshold := queryLogRowThreshold - origQueryLogSampleRate := queryLogSampleRate - defer func() { - SetQueryLogFilterTag(origQueryLogFilterTag) - SetQueryLogRowThreshold(origQueryLogRowThreshold) - SetQueryLogSampleRate(origQueryLogSampleRate) - }() - tests := []struct { sql string qLogFilterTag string qLogRowThreshold uint64 qLogSampleRate float64 + qLogMode string rowsAffected uint64 rowsReturned uint64 + errored bool ok bool }{ { @@ -356,43 +345,33 @@ func TestShouldEmitLog(t *testing.T) { rowsReturned: 17, ok: true, }, + { + sql: "log only error - no error", + qLogMode: "error", + errored: false, + ok: false, + }, + { + sql: "log only error - errored", + qLogMode: "error", + errored: true, + ok: true, + }, } for _, tt := range tests { t.Run(tt.sql, func(t *testing.T) { - SetQueryLogFilterTag(tt.qLogFilterTag) - SetQueryLogRowThreshold(tt.qLogRowThreshold) - SetQueryLogSampleRate(tt.qLogSampleRate) - - require.Equal(t, tt.ok, ShouldEmitLog(tt.sql, tt.rowsAffected, tt.rowsReturned)) + qlConfig := QueryLogConfig{ + FilterTag: tt.qLogFilterTag, + RowThreshold: tt.qLogRowThreshold, + sampleRate: tt.qLogSampleRate, + Mode: tt.qLogMode, + } + require.Equal(t, tt.ok, qlConfig.ShouldEmitLog(tt.sql, tt.rowsAffected, tt.rowsReturned, tt.errored)) }) } } -func BenchmarkShouldEmitLog(b *testing.B) { - b.Run("default", func(b *testing.B) { - SetQueryLogSampleRate(0.0) - for i := 0; i < b.N; i++ { - ShouldEmitLog("select * from test where user='someone'", 0, 123) - } - }) - b.Run("filter_tag", func(b *testing.B) { - SetQueryLogSampleRate(0.0) - SetQueryLogFilterTag("LOG_QUERY") - defer SetQueryLogFilterTag("") - for i := 0; i < b.N; i++ { - ShouldEmitLog("select /* LOG_QUERY=1 */ * from test where user='someone'", 0, 123) - } - }) - b.Run("50%_sample_rate", func(b *testing.B) { - SetQueryLogSampleRate(0.5) - defer SetQueryLogSampleRate(0.0) - for i := 0; i < b.N; i++ { - ShouldEmitLog("select * from test where user='someone'", 0, 123) - } - }) -} - func TestGetFormatter(t *testing.T) { tests := []struct { name string diff --git a/go/vt/vtexplain/vtexplain_vtgate.go b/go/vt/vtexplain/vtexplain_vtgate.go index d45073cd006..155fe6de743 100644 --- a/go/vt/vtexplain/vtexplain_vtgate.go +++ b/go/vt/vtexplain/vtexplain_vtgate.go @@ -74,7 +74,12 @@ func (vte *VTExplain) initVtgateExecutor(ctx context.Context, ts *topo.Server, v var schemaTracker vtgate.SchemaInfo // no schema tracker for these tests queryLogBufferSize := 10 plans := theine.NewStore[vtgate.PlanCacheKey, *engine.Plan](4*1024*1024, false) - vte.vtgateExecutor = vtgate.NewExecutor(ctx, vte.env, vte.explainTopo, Cell, resolver, opts.Normalize, false, streamSize, plans, schemaTracker, false, opts.PlannerVersion, 0, vtgate.NewDynamicViperConfig()) + eConfig := vtgate.ExecutorConfig{ + Normalize: opts.Normalize, + StreamSize: streamSize, + AllowScatter: true, + } + vte.vtgateExecutor = vtgate.NewExecutor(ctx, vte.env, vte.explainTopo, Cell, resolver, eConfig, false, plans, schemaTracker, opts.PlannerVersion, vtgate.NewDynamicViperConfig()) vte.vtgateExecutor.SetQueryLogger(streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize)) return nil diff --git a/go/vt/vtgate/bench_test.go b/go/vt/vtgate/bench_test.go index 5c64c7e3473..c2336662c69 100644 --- a/go/vt/vtgate/bench_test.go +++ b/go/vt/vtgate/bench_test.go @@ -80,7 +80,7 @@ func BenchmarkWithNormalizer(b *testing.B) { func BenchmarkWithoutNormalizer(b *testing.B) { vtgateInst, _, ctx := createVtgateEnv(b) - vtgateInst.executor.normalize = false + vtgateInst.executor.config.Normalize = false for i := 0; i < b.N; i++ { _, _, err := vtgateInst.Execute( diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index 0281e28700f..c8dfd0b6269 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -107,39 +107,45 @@ func init() { // Executor is the engine that executes queries by utilizing // the abilities of the underlying vttablets. -type Executor struct { - env *vtenv.Environment - serv srvtopo.Server - cell string - resolver *Resolver - scatterConn *ScatterConn - txConn *TxConn +type ( + ExecutorConfig struct { + Normalize bool + StreamSize int + // AllowScatter will fail planning if set to false and a plan contains any scatter queries + AllowScatter bool + WarmingReadsPercent int + QueryLogToFile string + } - mu sync.Mutex - vschema *vindexes.VSchema - streamSize int - vschemaStats *VSchemaStats + Executor struct { + config ExecutorConfig - plans *PlanCache - epoch atomic.Uint32 + env *vtenv.Environment + serv srvtopo.Server + cell string + resolver *Resolver + scatterConn *ScatterConn + txConn *TxConn - normalize bool + mu sync.Mutex + vschema *vindexes.VSchema + vschemaStats *VSchemaStats - vm *VSchemaManager - schemaTracker SchemaInfo + plans *PlanCache + epoch atomic.Uint32 - // allowScatter will fail planning if set to false and a plan contains any scatter queries - allowScatter bool + vm *VSchemaManager + schemaTracker SchemaInfo - // queryLogger is passed in for logging from this vtgate executor. - queryLogger *streamlog.StreamLogger[*logstats.LogStats] + // queryLogger is passed in for logging from this vtgate executor. + queryLogger *streamlog.StreamLogger[*logstats.LogStats] - warmingReadsPercent int - warmingReadsChannel chan bool + warmingReadsChannel chan bool - vConfig econtext.VCursorConfig - ddlConfig dynamicconfig.DDL -} + vConfig econtext.VCursorConfig + ddlConfig dynamicconfig.DDL + } +) var executorOnce sync.Once @@ -163,28 +169,24 @@ func NewExecutor( serv srvtopo.Server, cell string, resolver *Resolver, - normalize, warnOnShardedOnly bool, - streamSize int, + eConfig ExecutorConfig, + warnOnShardedOnly bool, plans *PlanCache, schemaTracker SchemaInfo, - noScatter bool, pv plancontext.PlannerVersion, - warmingReadsPercent int, ddlConfig dynamicconfig.DDL, ) *Executor { e := &Executor{ - env: env, - serv: serv, - cell: cell, - resolver: resolver, - scatterConn: resolver.scatterConn, - txConn: resolver.scatterConn.txConn, - normalize: normalize, - streamSize: streamSize, + config: eConfig, + env: env, + serv: serv, + cell: cell, + resolver: resolver, + scatterConn: resolver.scatterConn, + txConn: resolver.scatterConn.txConn, + schemaTracker: schemaTracker, - allowScatter: !noScatter, plans: plans, - warmingReadsPercent: warmingReadsPercent, warmingReadsChannel: make(chan bool, warmingReadsConcurrency), ddlConfig: ddlConfig, } @@ -234,7 +236,7 @@ func (e *Executor) Execute(ctx context.Context, mysqlCtx vtgateservice.MySQLConn trace.AnnotateSQL(span, sqlparser.Preview(sql)) defer span.Finish() - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) stmtType, result, err := e.execute(ctx, mysqlCtx, safeSession, sql, bindVars, logStats) logStats.Error = err if result == nil { @@ -297,7 +299,7 @@ func (e *Executor) StreamExecute( trace.AnnotateSQL(span, sqlparser.Preview(sql)) defer span.Finish() - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) srr := &streaminResultReceiver{callback: callback} var err error @@ -327,7 +329,7 @@ func (e *Executor) StreamExecute( byteCount += col.Len() } - if byteCount >= e.streamSize { + if byteCount >= e.config.StreamSize { err := callback(result) seenResults.Store(true) result = &sqltypes.Result{} @@ -1340,7 +1342,7 @@ func isValidPayloadSize(query string) bool { // Prepare executes a prepare statements. func (e *Executor) Prepare(ctx context.Context, method string, safeSession *econtext.SafeSession, sql string, bindVars map[string]*querypb.BindVariable) (fld []*querypb.Field, err error) { - logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars) + logStats := logstats.NewLogStats(ctx, method, sql, safeSession.GetSessionUUID(), bindVars, streamlog.GetQueryLogConfig()) fld, err = e.prepare(ctx, safeSession, sql, bindVars, logStats) logStats.Error = err @@ -1419,7 +1421,7 @@ func (e *Executor) initVConfig(warnOnShardedOnly bool, pv plancontext.PlannerVer DBDDLPlugin: dbDDLPlugin, - WarmingReadsPercent: e.warmingReadsPercent, + WarmingReadsPercent: e.config.WarmingReadsPercent, WarmingReadsTimeout: warmingReadsQueryTimeout, WarmingReadsChannel: e.warmingReadsChannel, } @@ -1539,7 +1541,7 @@ func (e *Executor) startVStream(ctx context.Context, rss []*srvtopo.ResolvedShar } func (e *Executor) checkThatPlanIsValid(stmt sqlparser.Statement, plan *engine.Plan) error { - if e.allowScatter || plan.Instructions == nil || sqlparser.AllowScatterDirective(stmt) { + if e.config.AllowScatter || plan.Instructions == nil || sqlparser.AllowScatterDirective(stmt) { return nil } // we go over all the primitives in the plan, searching for a route that is of SelectScatter opcode @@ -1610,7 +1612,7 @@ func (e *Executor) PlanPrepareStmt(ctx context.Context, vcursor *econtext.VCurso } // creating this log stats to not interfere with the original log stats. - lStats := logstats.NewLogStats(ctx, "prepare", query, vcursor.Session().GetSessionUUID(), nil) + lStats := logstats.NewLogStats(ctx, "prepare", query, vcursor.Session().GetSessionUUID(), nil, streamlog.GetQueryLogConfig()) plan, err := e.getPlan( ctx, vcursor, diff --git a/go/vt/vtgate/executor_dml_test.go b/go/vt/vtgate/executor_dml_test.go index 503b5e5cd8b..2846c763ae9 100644 --- a/go/vt/vtgate/executor_dml_test.go +++ b/go/vt/vtgate/executor_dml_test.go @@ -608,9 +608,8 @@ func TestUpdateComments(t *testing.T) { } func TestUpdateNormalize(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - executor.normalize = true session := &vtgatepb.Session{ TargetString: "@primary", } @@ -1337,7 +1336,7 @@ func TestInsertSharded(t *testing.T) { testQueryLog(t, executor, logChan, "TestExecute", "INSERT", "insert into user2(id, `name`, lastname) values (2, 'myname', 'mylastname')", 1) // insert with binary values - executor.normalize = true + executor.config.Normalize = true sbc1.Queries = nil sbc2.Queries = nil sbclookup.Queries = nil @@ -1368,8 +1367,7 @@ func TestInsertSharded(t *testing.T) { } func TestInsertNegativeValue(t *testing.T) { - executor, sbc1, sbc2, sbclookup, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, sbclookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -2528,9 +2526,7 @@ func TestDeleteEqualWithPrepare(t *testing.T) { } func TestUpdateLastInsertID(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "update user set a = last_insert_id() where id = 1" session := &vtgatepb.Session{ diff --git a/go/vt/vtgate/executor_framework_test.go b/go/vt/vtgate/executor_framework_test.go index 43987217039..099b785b446 100644 --- a/go/vt/vtgate/executor_framework_test.go +++ b/go/vt/vtgate/executor_framework_test.go @@ -65,10 +65,6 @@ var badVSchema = ` } ` -const ( - testBufferSize = 10 -) - type DestinationAnyShardPickerFirstShard struct{} func (dp DestinationAnyShardPickerFirstShard) PickShard(shardCount int) int { @@ -130,7 +126,7 @@ func init() { vindexes.Register("keyrange_lookuper_unique", newKeyRangeLookuperUnique) } -func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn)) (executor *Executor, ctx context.Context) { +func createExecutorEnvCallback(t testing.TB, eConfig ExecutorConfig, eachShard func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn)) (executor *Executor, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) cell := "aa" @@ -183,7 +179,7 @@ func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, ta // one-off queries from thrashing the cache. Disable the doorkeeper in the tests to prevent flakiness. plans := theine.NewStore[PlanCacheKey, *engine.Plan](queryPlanCacheMemory, false) - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, eConfig, false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) key.AnyShardPicker = DestinationAnyShardPickerFirstShard{} @@ -198,7 +194,11 @@ func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, ta } func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { - executor, ctx = createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + return createExecutorEnvWithConfig(t, createExecutorConfig()) +} + +func createExecutorEnvWithConfig(t testing.TB, eConfig ExecutorConfig) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { + executor, ctx = createExecutorEnvCallback(t, eConfig, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { switch { case ks == KsTestSharded && shard == "-20": sbc1 = conn @@ -210,7 +210,6 @@ func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup }) return } - func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) @@ -232,7 +231,7 @@ func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (ex plans := DefaultPlanCache() env, err := vtenv.New(vtenv.Options{MySQLServerVersion: mysqlVersion}) require.NoError(t, err) - executor = NewExecutor(ctx, env, serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, env, serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { @@ -244,6 +243,21 @@ func createCustomExecutor(t testing.TB, vschema string, mysqlVersion string) (ex return executor, sbc1, sbc2, sbclookup, ctx } +func createExecutorConfig() ExecutorConfig { + return ExecutorConfig{ + StreamSize: 10, + AllowScatter: true, + } +} + +func createExecutorConfigWithNormalizer() ExecutorConfig { + return ExecutorConfig{ + StreamSize: 10, + AllowScatter: true, + Normalize: true, + } +} + func createCustomExecutorSetValues(t testing.TB, vschema string, values []*sqltypes.Result) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) @@ -269,7 +283,7 @@ func createCustomExecutorSetValues(t testing.TB, vschema string, values []*sqlty sbclookup = hc.AddTestTablet(cell, "0", 1, KsTestUnsharded, "0", topodatapb.TabletType_PRIMARY, true, 1, nil) queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { @@ -294,7 +308,9 @@ func createExecutorEnvWithPrimaryReplicaConn(t testing.TB, ctx context.Context, replica = hc.AddTestTablet(cell, "0-replica", 1, KsTestUnsharded, "0", topodatapb.TabletType_REPLICA, true, 1, nil) queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) - executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, DefaultPlanCache(), nil, false, querypb.ExecuteOptions_Gen4, warmingReadsPercent, NewDynamicViperConfig()) + eConfig := createExecutorConfig() + eConfig.WarmingReadsPercent = warmingReadsPercent + executor = NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, eConfig, false, DefaultPlanCache(), nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) t.Cleanup(func() { diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 16628729ac6..3d8261495fe 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -166,7 +166,7 @@ func TestSelectDBA(t *testing.T) { func TestSystemVariablesMySQLBelow80(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "5.7.0") - executor.normalize = true + executor.config.Normalize = true setVarEnabled = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -200,7 +200,7 @@ func TestSystemVariablesMySQLBelow80(t *testing.T) { func TestSystemVariablesWithSetVarDisabled(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true executor.vConfig.SetVarEnabled = false session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -233,7 +233,7 @@ func TestSystemVariablesWithSetVarDisabled(t *testing.T) { func TestSetSystemVariablesTx(t *testing.T) { executor, sbc1, _, _, _ := createCustomExecutor(t, "{}", "8.0.1") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: "TestExecutor"}) @@ -278,9 +278,7 @@ func TestSetSystemVariablesTx(t *testing.T) { } func TestSetSystemVariables(t *testing.T) { - executor, _, _, lookup, _ := createExecutorEnv(t) - executor.normalize = true - + executor, _, _, lookup, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded, SystemVariables: map[string]string{}}) // Set @@sql_mode and execute a select statement. We should have SET_VAR in the select statement @@ -389,8 +387,7 @@ func TestSetSystemVariables(t *testing.T) { } func TestSetSystemVariablesWithReservedConnection(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}}) @@ -445,8 +442,7 @@ func TestSelectVindexFunc(t *testing.T) { } func TestCreateTableValidTimestamp(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor", SystemVariables: map[string]string{"sql_mode": "ALLOW_INVALID_DATES"}}) @@ -464,8 +460,7 @@ func TestCreateTableValidTimestamp(t *testing.T) { } func TestGen4SelectDBA(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) query := "select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS" _, err := executor.Execute(context.Background(), nil, "TestSelectDBA", @@ -699,18 +694,19 @@ func TestStreamLimitOffset(t *testing.T) { }}, } - executor, _ := createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { - if ks == KsTestSharded { - conn.SetResults([]*sqltypes.Result{{ - Fields: []*querypb.Field{ - {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, - {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.MySQL8().DefaultConnectionCharset())}, - {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, - }, - Rows: returnRows[shard], - }}) - } - }) + executor, _ := createExecutorEnvCallback(t, createExecutorConfig(), + func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + if ks == KsTestSharded { + conn.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.MySQL8().DefaultConnectionCharset())}, + {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, + }, + Rows: returnRows[shard], + }}) + } + }) results := make(chan *sqltypes.Result, 10) session := &vtgatepb.Session{ @@ -756,12 +752,11 @@ func TestStreamLimitOffset(t *testing.T) { } func TestSelectLastInsertId(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", LastInsertId: 52, } - executor.normalize = true logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -780,7 +775,7 @@ func TestSelectLastInsertId(t *testing.T) { } func TestSelectSystemVariables(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -790,7 +785,6 @@ func TestSelectSystemVariables(t *testing.T) { SessionTrackGtids: true, }, } - executor.normalize = true logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -840,8 +834,7 @@ func TestSelectSystemVariables(t *testing.T) { } func TestSelectInitializedVitessAwareVariable(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -872,8 +865,7 @@ func TestSelectInitializedVitessAwareVariable(t *testing.T) { } func TestSelectUserDefinedVariable(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -908,8 +900,7 @@ func TestSelectUserDefinedVariable(t *testing.T) { } func TestFoundRows(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -935,8 +926,7 @@ func TestFoundRows(t *testing.T) { } func TestRowCount(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -968,8 +958,7 @@ func testRowCount(t *testing.T, ctx context.Context, executor *Executor, session } func TestSelectLastInsertIdInUnion(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -1002,8 +991,7 @@ func TestSelectLastInsertIdInUnion(t *testing.T) { } func TestSelectLastInsertIdInWhere(t *testing.T) { - executor, _, _, lookup, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, lookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -1022,8 +1010,7 @@ func TestSelectLastInsertIdInWhere(t *testing.T) { } func TestLastInsertIDInVirtualTable(t *testing.T) { - executor, sbc1, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) result1 := []*sqltypes.Result{{ Fields: []*querypb.Field{ {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, @@ -1050,8 +1037,7 @@ func TestLastInsertIDInVirtualTable(t *testing.T) { } func TestLastInsertIDInSubQueryExpression(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", LastInsertId: 12345, @@ -1074,8 +1060,7 @@ func TestLastInsertIDInSubQueryExpression(t *testing.T) { } func TestSelectDatabase(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "select database()" newSession := &vtgatepb.Session{ TargetString: "@primary", @@ -1334,8 +1319,7 @@ func TestSelectComments(t *testing.T) { } func TestSelectNormalize(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "@primary", @@ -1644,7 +1628,7 @@ func TestSelectListArg(t *testing.T) { func createExecutor(ctx context.Context, serv *sandboxTopo, cell string, resolver *Resolver) *Executor { queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - ex := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + ex := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) ex.SetQueryLogger(queryLogger) return ex } @@ -3123,8 +3107,7 @@ func TestSelectBindvarswithPrepare(t *testing.T) { } func TestSelectDatabasePrepare(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -3137,8 +3120,7 @@ func TestSelectDatabasePrepare(t *testing.T) { } func TestSelectWithUnionAll(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) sql := "select id from user where id in (1, 2, 3) union all select id from user where id in (1, 2, 3)" bv, _ := sqltypes.BuildBindVariable([]int64{1, 2, 3}) bv1, _ := sqltypes.BuildBindVariable([]int64{1, 2}) @@ -3326,7 +3308,7 @@ func TestStreamOrderByWithMultipleResults(t *testing.T) { } queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, true, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfigWithNormalizer(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() // some sleep for all goroutines to start @@ -3369,7 +3351,7 @@ func TestStreamOrderByLimitWithMultipleResults(t *testing.T) { } queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, true, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfigWithNormalizer(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() // some sleep for all goroutines to start @@ -3420,7 +3402,7 @@ func TestSelectScatterFails(t *testing.T) { executor := createExecutor(ctx, serv, cell, resolver) defer executor.Close() - executor.allowScatter = false + executor.config.AllowScatter = false logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -3447,8 +3429,7 @@ func TestSelectScatterFails(t *testing.T) { } func TestGen4SelectStraightJoin(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select u.id from user u straight_join user2 u2 on u.id = u2.id" @@ -3469,8 +3450,7 @@ func TestGen4SelectStraightJoin(t *testing.T) { } func TestGen4MultiColumnVindexEqual(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where cola = 1 and colb = 2" @@ -3507,8 +3487,7 @@ func TestGen4MultiColumnVindexEqual(t *testing.T) { } func TestGen4MultiColumnVindexIn(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where cola IN (1,17984) and colb IN (2,3,4)" @@ -3545,8 +3524,7 @@ func TestGen4MultiColumnVindexIn(t *testing.T) { } func TestGen4MultiColMixedColComparision(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where colb = 2 and cola IN (1,17984)" @@ -3581,8 +3559,7 @@ func TestGen4MultiColMixedColComparision(t *testing.T) { } func TestGen4MultiColBestVindexSel(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where colb = 2 and cola IN (1,17984) and cola = 1" @@ -3626,8 +3603,7 @@ func TestGen4MultiColBestVindexSel(t *testing.T) { } func TestGen4MultiColMultiEqual(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, sbc2, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}) query := "select * from user_region where (cola,colb) in ((17984,2),(17984,3))" @@ -4229,8 +4205,7 @@ func TestSelectAggregationRandom(t *testing.T) { } func TestSelectDateTypes(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) qr, err := executor.Execute(context.Background(), nil, "TestSelectDateTypes", session, "select '2020-01-01' + interval month(date_sub(FROM_UNIXTIME(1234), interval 1 month))-1 month", nil) @@ -4240,8 +4215,7 @@ func TestSelectDateTypes(t *testing.T) { } func TestSelectHexAndBit(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) qr, err := executor.Execute(context.Background(), nil, "TestSelectHexAndBit", session, "select 0b1001, b'1001', 0x9, x'09'", nil) @@ -4256,8 +4230,7 @@ func TestSelectHexAndBit(t *testing.T) { // TestSelectCFC tests validates that cfc vindex plan gets cached and same plan is getting reused. // This also validates that cache_size is able to calculate the cfc vindex plan size. func TestSelectCFC(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) _, err := executor.Execute(context.Background(), nil, "TestSelectCFC", session, "select /*vt+ PLANNER=gen4 */ c2 from tbl_cfc where c1 like 'A%'", nil) @@ -4281,12 +4254,11 @@ func TestSelectCFC(t *testing.T) { } func TestSelectView(t *testing.T) { - executor, sbc, _, _, _ := createExecutorEnv(t) + executor, sbc, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) // add the view to local vschema err := executor.vschema.AddView(KsTestSharded, "user_details_view", "select user.id, user_extra.col from user join user_extra on user.id = user_extra.user_id", executor.vm.parser) require.NoError(t, err) - executor.normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{}) _, err = executor.Execute(context.Background(), nil, "TestSelectView", session, "select * from user_details_view", nil) @@ -4327,7 +4299,7 @@ func TestWarmingReads(t *testing.T) { ctx := utils.LeakCheckContext(t) executor, primary, replica := createExecutorEnvWithPrimaryReplicaConn(t, ctx, 100) - executor.normalize = true + executor.config.Normalize = true session := econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded}) // Since queries on the replica will run in a separate go-routine, we need synchronization for the Queries field in the sandboxconn. replica.RequireQueriesLocking() @@ -4451,8 +4423,7 @@ func TestStreamJoinQuery(t *testing.T) { // It also tests that setting a global variable does not affect the session variable and vice versa. // Also, test what happens on running select @@global and select @@session for a system variable. func TestSysVarGlobalAndSession(t *testing.T) { - executor, sbc1, _, _, _ := createExecutorEnv(t) - executor.normalize = true + executor, sbc1, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}}) sbc1.SetResults([]*sqltypes.Result{ diff --git a/go/vt/vtgate/executor_set_test.go b/go/vt/vtgate/executor_set_test.go index f8ed0b558c3..310d885a134 100644 --- a/go/vt/vtgate/executor_set_test.go +++ b/go/vt/vtgate/executor_set_test.go @@ -514,7 +514,7 @@ func createMap(keys []string, values []any) map[string]*querypb.BindVariable { func TestSetVar(t *testing.T) { executor, _, _, sbc, ctx := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded}) @@ -553,7 +553,7 @@ func TestSetVar(t *testing.T) { func TestSetVarShowVariables(t *testing.T) { executor, _, _, sbc, ctx := createCustomExecutor(t, "{}", "8.0.0") - executor.normalize = true + executor.config.Normalize = true session := econtext.NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, TargetString: KsTestUnsharded}) @@ -576,8 +576,7 @@ func TestSetVarShowVariables(t *testing.T) { } func TestExecutorSetAndSelect(t *testing.T) { - e, _, _, sbc, ctx := createExecutorEnv(t) - e.normalize = true + e, _, _, sbc, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) testcases := []struct { sysVar string diff --git a/go/vt/vtgate/executor_stream_test.go b/go/vt/vtgate/executor_stream_test.go index 8bb10aae8fb..796e0c0466b 100644 --- a/go/vt/vtgate/executor_stream_test.go +++ b/go/vt/vtgate/executor_stream_test.go @@ -68,7 +68,7 @@ func TestStreamSQLSharded(t *testing.T) { queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) plans := DefaultPlanCache() - executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, false, false, testBufferSize, plans, nil, false, querypb.ExecuteOptions_Gen4, 0, NewDynamicViperConfig()) + executor := NewExecutor(ctx, vtenv.NewTestEnv(), serv, cell, resolver, createExecutorConfig(), false, plans, nil, querypb.ExecuteOptions_Gen4, NewDynamicViperConfig()) executor.SetQueryLogger(queryLogger) defer executor.Close() diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 859e6a05973..904805e789b 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -36,6 +36,8 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/streamlog" + econtext "vitess.io/vitess/go/vt/vtgate/executorcontext" "vitess.io/vitess/go/mysql/collations" @@ -196,9 +198,7 @@ func TestExecutorTransactionsNoAutoCommit(t *testing.T) { } func TestDirectTargetRewrites(t *testing.T) { - executor, _, _, sbclookup, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, sbclookup, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "TestUnsharded/0@primary", @@ -1625,7 +1625,7 @@ func assertCacheContains(t *testing.T, e *Executor, vc *econtext.VCursorImpl, sq } func getPlanCached(t *testing.T, ctx context.Context, e *Executor, vcursor *econtext.VCursorImpl, sql string, comments sqlparser.MarginComments, bindVars map[string]*querypb.BindVariable, skipQueryPlanCache bool) (*engine.Plan, *logstats.LogStats) { - logStats := logstats.NewLogStats(ctx, "Test", "", "", nil) + logStats := logstats.NewLogStats(ctx, "Test", "", "", nil, streamlog.NewQueryLogConfigForTest()) vcursor.SafeSession = &econtext.SafeSession{ Session: &vtgatepb.Session{ Options: &querypb.ExecuteOptions{SkipQueryPlanCache: skipQueryPlanCache}}, @@ -1633,7 +1633,7 @@ func getPlanCached(t *testing.T, ctx context.Context, e *Executor, vcursor *econ stmt, reservedVars, err := parseAndValidateQuery(sql, sqlparser.NewTestParser()) require.NoError(t, err) - plan, err := e.getPlan(context.Background(), vcursor, sql, stmt, comments, bindVars, reservedVars /* normalize */, e.normalize, logStats) + plan, err := e.getPlan(context.Background(), vcursor, sql, stmt, comments, bindVars, reservedVars /* normalize */, e.config.Normalize, logStats) require.NoError(t, err) // Wait for cache to settle @@ -1693,8 +1693,7 @@ func TestGetPlanCacheUnnormalized(t *testing.T) { func TestGetPlanCacheNormalized(t *testing.T) { t.Run("Cache", func(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) - r.normalize = true + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) emptyvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, r.vConfig) query1 := "select * from music_user_map where id = 1" @@ -1710,8 +1709,7 @@ func TestGetPlanCacheNormalized(t *testing.T) { t.Run("Skip Cache", func(t *testing.T) { // Skip cache using directive - r, _, _, _, ctx := createExecutorEnv(t) - r.normalize = true + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) unshardedvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, r.vConfig) query1 := "insert /*vt+ SKIP_QUERY_PLAN_CACHE=1 */ into user(id) values (1), (2)" @@ -1735,9 +1733,8 @@ func TestGetPlanCacheNormalized(t *testing.T) { } func TestGetPlanNormalized(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - r.normalize = true emptyvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) unshardedvc, _ := econtext.NewVCursorImpl(econtext.NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "@unknown"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) @@ -1792,10 +1789,9 @@ func TestGetPlanPriority(t *testing.T) { testCase := aTestCase t.Run(testCase.name, func(t *testing.T) { - r, _, _, _, ctx := createExecutorEnv(t) + r, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) - r.normalize = true - logStats := logstats.NewLogStats(ctx, "Test", "", "", nil) + logStats := logstats.NewLogStats(ctx, "Test", "", "", nil, streamlog.NewQueryLogConfigForTest()) vCursor, err := econtext.NewVCursorImpl(session, makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver, nil, nullResultsObserver{}, econtext.VCursorConfig{}) assert.NoError(t, err) @@ -1818,7 +1814,7 @@ func TestGetPlanPriority(t *testing.T) { } func TestPassthroughDDL(t *testing.T) { - executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + executor, sbc1, sbc2, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{ TargetString: "TestExecutor", } @@ -1841,7 +1837,6 @@ func TestPassthroughDDL(t *testing.T) { // Force the query to go to only one shard. Normalization doesn't make any difference. session.TargetString = "TestExecutor/40-60" - executor.normalize = true _, err = executorExec(ctx, executor, session, alterDDL, nil) require.NoError(t, err) @@ -1853,7 +1848,6 @@ func TestPassthroughDDL(t *testing.T) { // Use range query session.TargetString = "TestExecutor[-]" - executor.normalize = true _, err = executorExec(ctx, executor, session, alterDDL, nil) require.NoError(t, err) @@ -2003,10 +1997,7 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { } func TestOlapSelectDatabase(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - - executor.normalize = true - + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := &vtgatepb.Session{Autocommit: true} sql := `select database()` @@ -2284,9 +2275,7 @@ func TestExecutorExplainStmt(t *testing.T) { } func TestExecutorVExplain(t *testing.T) { - executor, _, _, _, ctx := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, _, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) logChan := executor.queryLogger.Subscribe("Test") defer executor.queryLogger.Unsubscribe(logChan) @@ -2756,9 +2745,7 @@ func TestExecutorStartTxnStmt(t *testing.T) { } func TestExecutorPrepareExecute(t *testing.T) { - executor, _, _, _, _ := createExecutorEnv(t) - - executor.normalize = true + executor, _, _, _, _ := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) session := econtext.NewAutocommitSession(&vtgatepb.Session{}) // prepare statement. diff --git a/go/vt/vtgate/executorcontext/vcursor_impl_test.go b/go/vt/vtgate/executorcontext/vcursor_impl_test.go index 08e27be4c51..244a80c9ffe 100644 --- a/go/vt/vtgate/executorcontext/vcursor_impl_test.go +++ b/go/vt/vtgate/executorcontext/vcursor_impl_test.go @@ -27,6 +27,8 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -367,7 +369,7 @@ func TestSetExecQueryTimeout(t *testing.T) { func TestRecordMirrorStats(t *testing.T) { safeSession := NewSafeSession(nil) - logStats := logstats.NewLogStats(context.Background(), t.Name(), "select 1", "", nil) + logStats := logstats.NewLogStats(context.Background(), t.Name(), "select 1", "", nil, streamlog.NewQueryLogConfigForTest()) vc, err := NewVCursorImpl(safeSession, sqlparser.MarginComments{}, nil, logStats, nil, &vindexes.VSchema{}, nil, nil, fakeObserver{}, VCursorConfig{}) require.NoError(t, err) diff --git a/go/vt/vtgate/logstats/logstats.go b/go/vt/vtgate/logstats/logstats.go index fdc0e69c8db..3ad75d07722 100644 --- a/go/vt/vtgate/logstats/logstats.go +++ b/go/vt/vtgate/logstats/logstats.go @@ -33,6 +33,8 @@ import ( // LogStats records the stats for a single vtgate query type LogStats struct { + Config streamlog.QueryLogConfig + Ctx context.Context Method string TabletType string @@ -59,7 +61,7 @@ type LogStats struct { // NewLogStats constructs a new LogStats with supplied Method and ctx // field values, and the StartTime field set to the present time. -func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindVars map[string]*querypb.BindVariable) *LogStats { +func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindVars map[string]*querypb.BindVariable, config streamlog.QueryLogConfig) *LogStats { return &LogStats{ Ctx: ctx, Method: methodName, @@ -67,6 +69,7 @@ func NewLogStats(ctx context.Context, methodName, sql, sessionUUID string, bindV SessionUUID: sessionUUID, BindVariables: bindVars, StartTime: time.Now(), + Config: config, } } @@ -130,16 +133,15 @@ func (stats *LogStats) MirrorTargetErrorStr() string { // Logf formats the log record to the given writer, either as // tab-separated list of logged fields or as JSON. func (stats *LogStats) Logf(w io.Writer, params url.Values) error { - if !streamlog.ShouldEmitLog(stats.SQL, stats.RowsAffected, stats.RowsReturned) { + if !stats.Config.ShouldEmitLog(stats.SQL, stats.RowsAffected, stats.RowsReturned, stats.Error != nil) { return nil } - redacted := streamlog.GetRedactDebugUIQueries() _, fullBindParams := params["full"] remoteAddr, username := stats.RemoteAddrUsername() log := logstats.NewLogger() - log.Init(streamlog.GetQueryLogFormat() == streamlog.QueryLogFormatJSON) + log.Init(stats.Config.Format == streamlog.QueryLogFormatJSON) log.Key("Method") log.StringUnquoted(stats.Method) log.Key("RemoteAddr") @@ -167,7 +169,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("SQL") log.String(stats.SQL) log.Key("BindVars") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.BindVariables(stats.BindVariables, fullBindParams) diff --git a/go/vt/vtgate/logstats/logstats_test.go b/go/vt/vtgate/logstats/logstats_test.go index 872b34c6964..78b27342a7e 100644 --- a/go/vt/vtgate/logstats/logstats_test.go +++ b/go/vt/vtgate/logstats/logstats_test.go @@ -55,11 +55,7 @@ func testFormat(t *testing.T, stats *LogStats, params url.Values) string { } func TestLogStatsFormat(t *testing.T) { - defer func() { - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("text") - }() - logStats := NewLogStats(context.Background(), "test", "sql1", "suuid", nil) + logStats := NewLogStats(context.Background(), "test", "sql1", "suuid", nil, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.TablesUsed = []string{"ks1.tbl1", "ks2.tbl2"} @@ -125,8 +121,8 @@ func TestLogStatsFormat(t *testing.T) { for _, variable := range logStats.BindVariables { fmt.Println("->" + fmt.Sprintf("%v", variable)) } - streamlog.SetRedactDebugUIQueries(test.redact) - streamlog.SetQueryLogFormat(test.format) + logStats.Config.RedactDebugUIQueries = test.redact + logStats.Config.Format = test.format if test.format == "text" { got := testFormat(t, logStats, params) t.Logf("got: %s", got) @@ -148,9 +144,8 @@ func TestLogStatsFormat(t *testing.T) { } func TestLogStatsFilter(t *testing.T) { - defer func() { streamlog.SetQueryLogFilterTag("") }() - - logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}) + logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", + map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) params := map[string][]string{"full": {}} @@ -159,21 +154,20 @@ func TestLogStatsFilter(t *testing.T) { want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogFilterTag("LOG_THIS_QUERY") + logStats.Config.FilterTag = "LOG_THIS_QUERY" got = testFormat(t, logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogFilterTag("NOT_THIS_QUERY") + logStats.Config.FilterTag = "NOT_THIS_QUERY" got = testFormat(t, logStats, params) want = "" assert.Equal(t, want, got) } func TestLogStatsRowThreshold(t *testing.T) { - defer func() { streamlog.SetQueryLogRowThreshold(0) }() - - logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}) + logStats := NewLogStats(context.Background(), "test", "sql1 /* LOG_THIS_QUERY */", "", + map[string]*querypb.BindVariable{"intVal": sqltypes.Int64BindVariable(1)}, streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) params := map[string][]string{"full": {}} @@ -182,11 +176,11 @@ func TestLogStatsRowThreshold(t *testing.T) { want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogRowThreshold(0) got = testFormat(t, logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) - streamlog.SetQueryLogRowThreshold(1) + + logStats.Config.RowThreshold = 1 got = testFormat(t, logStats, params) assert.Empty(t, got) } @@ -197,14 +191,14 @@ func TestLogStatsContextHTML(t *testing.T) { Html: testconversions.MakeHTMLForTest(html), } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats := NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.ContextHTML().String() != html { t.Fatalf("expect to get html: %s, but got: %s", html, logStats.ContextHTML().String()) } } func TestLogStatsErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.ErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -216,7 +210,7 @@ func TestLogStatsErrorStr(t *testing.T) { } func TestLogStatsMirrorTargetErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) if logStats.MirrorTargetErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -228,7 +222,7 @@ func TestLogStatsMirrorTargetErrorStr(t *testing.T) { } func TestLogStatsRemoteAddrUsername(t *testing.T) { - logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) addr, user := logStats.RemoteAddrUsername() if addr != "" { t.Fatalf("remote addr should be empty") @@ -244,7 +238,7 @@ func TestLogStatsRemoteAddrUsername(t *testing.T) { User: username, } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats = NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}) + logStats = NewLogStats(ctx, "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) addr, user = logStats.RemoteAddrUsername() if addr != remoteAddr { t.Fatalf("expected to get remote addr: %s, but got: %s", remoteAddr, addr) @@ -253,3 +247,18 @@ func TestLogStatsRemoteAddrUsername(t *testing.T) { t.Fatalf("expected to get username: %s, but got: %s", username, user) } } + +// TestLogStatsErrorsOnly tests that LogStats only logs errors when the query log mode is set to errors only for VTGate. +func TestLogStatsErrorsOnly(t *testing.T) { + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}, streamlog.NewQueryLogConfigForTest()) + logStats.Config.Mode = streamlog.QueryLogModeError + + // no error, should not log + logOutput := testFormat(t, logStats, url.Values{}) + assert.Empty(t, logOutput) + + // error, should log + logStats.Error = errors.New("test error") + logOutput = testFormat(t, logStats, url.Values{}) + assert.Contains(t, logOutput, "test error") +} diff --git a/go/vt/vtgate/plan_execute.go b/go/vt/vtgate/plan_execute.go index db7923c09f0..75a7af6bf2a 100644 --- a/go/vt/vtgate/plan_execute.go +++ b/go/vt/vtgate/plan_execute.go @@ -131,7 +131,7 @@ func (e *Executor) newExecute( // the vtgate to clear the cached plans when processing the new serving vschema. // When buffering ends, many queries might be getting planned at the same time and we then // take full advatange of the cached plan. - plan, err = e.getPlan(ctx, vcursor, query, stmt, comments, bindVars, reservedVars, e.normalize, logStats) + plan, err = e.getPlan(ctx, vcursor, query, stmt, comments, bindVars, reservedVars, e.config.Normalize, logStats) execStart := e.logPlanningFinished(logStats, plan) if err != nil { diff --git a/go/vt/vtgate/querylog.go b/go/vt/vtgate/querylog.go index bddc799363d..686ff419764 100644 --- a/go/vt/vtgate/querylog.go +++ b/go/vt/vtgate/querylog.go @@ -49,8 +49,8 @@ func (e *Executor) defaultQueryLogger() error { queryzHandler(e, w, r) }) - if queryLogToFile != "" { - _, err := queryLogger.LogToFile(queryLogToFile, streamlog.GetFormatter(queryLogger)) + if e.config.QueryLogToFile != "" { + _, err := queryLogger.LogToFile(e.config.QueryLogToFile, streamlog.GetFormatter(queryLogger)) if err != nil { return err } diff --git a/go/vt/vtgate/querylogz_test.go b/go/vt/vtgate/querylogz_test.go index 9236b2ac840..2bc5d7e2295 100644 --- a/go/vt/vtgate/querylogz_test.go +++ b/go/vt/vtgate/querylogz_test.go @@ -26,16 +26,17 @@ import ( "testing" "time" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/logstats" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" ) func TestQuerylogzHandlerFormatting(t *testing.T) { req, _ := http.NewRequest("GET", "/querylogz?timeout=10&limit=1", nil) - logStats := logstats.NewLogStats(context.Background(), "Execute", "select name, 'inject ' from test_table limit 1000", "suuid", nil) + logStats := logstats.NewLogStats(context.Background(), "Execute", + "select name, 'inject ' from test_table limit 1000", "suuid", nil, streamlog.NewQueryLogConfigForTest()) logStats.StmtType = "select" logStats.RowsAffected = 1000 logStats.ShardQueries = 1 @@ -139,8 +140,7 @@ func TestQuerylogzHandlerFormatting(t *testing.T) { checkQuerylogzHasStats(t, slowQueryPattern, logStats, body) // ensure querylogz is not affected by the filter tag - streamlog.SetQueryLogFilterTag("XXX_SKIP_ME") - defer func() { streamlog.SetQueryLogFilterTag("") }() + logStats.Config.FilterTag = "XXX_SKIP_ME" ch = make(chan *logstats.LogStats, 1) ch <- logStats querylogzHandler(ch, response, req, sqlparser.NewTestParser()) diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index 4a880202b05..8b8302d77d4 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -352,22 +352,15 @@ func Init( plans := DefaultPlanCache() - executor := NewExecutor( - ctx, - env, - serv, - cell, - resolver, - normalizeQueries, - warnShardedOnly, - streamBufferSize, - plans, - si, - noScatter, - pv, - warmingReadsPercent, - dynamicConfig, - ) + eConfig := ExecutorConfig{ + Normalize: normalizeQueries, + StreamSize: streamBufferSize, + AllowScatter: !noScatter, + WarmingReadsPercent: warmingReadsPercent, + QueryLogToFile: queryLogToFile, + } + + executor := NewExecutor(ctx, env, serv, cell, resolver, eConfig, warnShardedOnly, plans, si, pv, dynamicConfig) if err := executor.defaultQueryLogger(); err != nil { log.Fatalf("error initializing query logger: %v", err) diff --git a/go/vt/vtgate/vtgate_test.go b/go/vt/vtgate/vtgate_test.go index c113ed16308..f05f63474d0 100644 --- a/go/vt/vtgate/vtgate_test.go +++ b/go/vt/vtgate/vtgate_test.go @@ -715,8 +715,7 @@ func createVtgateEnv(t testing.TB) (*VTGate, *sandboxconn.SandboxConn, context.C cell := "aa" sb := createSandbox(KsTestSharded) sb.ShardSpec = "-" - executor, _, _, sbc, ctx := createExecutorEnv(t) - executor.normalize = normalizeQueries + executor, _, _, sbc, ctx := createExecutorEnvWithConfig(t, createExecutorConfigWithNormalizer()) vsm := newVStreamManager(executor.resolver.resolver, executor.serv, cell) vtg := newVTGate(executor, executor.resolver, vsm, nil, executor.scatterConn.gateway) diff --git a/go/vt/vttablet/filelogger/filelogger_test.go b/go/vt/vttablet/filelogger/filelogger_test.go index f747ebba93b..47602e1a855 100644 --- a/go/vt/vttablet/filelogger/filelogger_test.go +++ b/go/vt/vttablet/filelogger/filelogger_test.go @@ -75,11 +75,6 @@ func TestFileLog(t *testing.T) { // TestFileLog sends a stream of five query records to the plugin, and verifies that they are logged. func TestFileLogRedacted(t *testing.T) { - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - dir := t.TempDir() logPath := path.Join(dir, "test.log") @@ -94,7 +89,9 @@ func TestFileLogRedacted(t *testing.T) { log1 := &tabletenv.LogStats{ Ctx: ctx, OriginalSQL: "test 1", + Config: streamlog.NewQueryLogConfigForTest(), } + log1.Config.RedactDebugUIQueries = true log1.AddRewrittenSQL("test 1 PII", time.Time{}) log1.MysqlResponseTime = 0 tabletenv.StatsLogger.Send(log1) @@ -102,7 +99,9 @@ func TestFileLogRedacted(t *testing.T) { log2 := &tabletenv.LogStats{ Ctx: ctx, OriginalSQL: "test 2", + Config: streamlog.NewQueryLogConfigForTest(), } + log2.Config.RedactDebugUIQueries = true log2.AddRewrittenSQL("test 2 PII", time.Time{}) log2.MysqlResponseTime = 0 tabletenv.StatsLogger.Send(log2) diff --git a/go/vt/vttablet/sysloglogger/sysloglogger_test.go b/go/vt/vttablet/sysloglogger/sysloglogger_test.go index 3a06b98ed1c..835f6b71b48 100644 --- a/go/vt/vttablet/sysloglogger/sysloglogger_test.go +++ b/go/vt/vttablet/sysloglogger/sysloglogger_test.go @@ -50,13 +50,14 @@ func (fw *fakeWriter) Info(msg string) error { return fw.write(syslog.LOG_INFO, func (fw *fakeWriter) Close() error { return nil } // mockLogStats generates a dummy tabletserver.LogStats message for testing. -func mockLogStats(originalSQL string) *tabletenv.LogStats { - logstats := tabletenv.NewLogStats(context.Background(), "Execute") +func mockLogStats(originalSQL string, redactUIQuery bool) *tabletenv.LogStats { + logstats := tabletenv.NewLogStats(context.Background(), "Execute", streamlog.NewQueryLogConfigForTest()) logstats.StartTime = time.Time{} logstats.PlanType = "PASS_SELECT" logstats.OriginalSQL = originalSQL logstats.AddRewrittenSQL(originalSQL, time.Now()) logstats.MysqlResponseTime = 0 + logstats.Config.RedactDebugUIQueries = redactUIQuery return logstats } @@ -112,11 +113,11 @@ func TestSyslog(t *testing.T) { }() // Send fake messages to the mock channel, and then close the channel to end the plugin loop - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 4", false) + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel @@ -142,10 +143,6 @@ func TestSyslog(t *testing.T) { // when redaction is enabled. func TestSyslogRedacted(t *testing.T) { // Overwrite the usual syslog writer and StatsLogger subscription channel with mocks - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() mock := newFakeWriter() writer = mock ch = make(chan *tabletenv.LogStats, 10) @@ -158,11 +155,11 @@ func TestSyslogRedacted(t *testing.T) { }() // Send fake messages to the mock channel, and then close the channel to end the plugin loop - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", true) + ch <- mockLogStats("select 2", true) + ch <- mockLogStats("select 3", true) + ch <- mockLogStats("select 4", true) + ch <- mockLogStats("select 5", true) close(ch) <-syncChannel @@ -198,10 +195,10 @@ func TestSyslogWithBadData(t *testing.T) { }() // Send 5 records for logging, one of which is bad - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel @@ -239,11 +236,11 @@ func TestSyslogWithInterruptedConnection(t *testing.T) { close(syncChannel) }() - ch <- mockLogStats("select 1") - ch <- mockLogStats("select 2") - ch <- mockLogStats("select 3") - ch <- mockLogStats("select 4") // This record will get dropped due to a syslog outage - ch <- mockLogStats("select 5") + ch <- mockLogStats("select 1", false) + ch <- mockLogStats("select 2", false) + ch <- mockLogStats("select 3", false) + ch <- mockLogStats("select 4", false) // This record will get dropped due to a syslog outage + ch <- mockLogStats("select 5", false) close(ch) <-syncChannel diff --git a/go/vt/vttablet/tabletserver/dt_executor_test.go b/go/vt/vttablet/tabletserver/dt_executor_test.go index b21667392d6..f83d7ff9006 100644 --- a/go/vt/vttablet/tabletserver/dt_executor_test.go +++ b/go/vt/vttablet/tabletserver/dt_executor_test.go @@ -31,6 +31,8 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/event/syslogger" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/mysql/sqlerror" @@ -714,7 +716,7 @@ func TestNoTwopc(t *testing.T) { func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB, closer func()) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, smallTxPool, db) cfg := tabletenv.NewDefaultConfig() cfg.DB = newDBConfigs(db) @@ -741,7 +743,7 @@ func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv // newShortAgeExecutor is same as newTestTxExecutor, but shorter transaction abandon age. func newShortAgeExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, smallTxPool|shortTwopcAge, db) db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) db.AddQueryPattern("insert into _vt\\.redo_statement.*", &sqltypes.Result{}) @@ -758,7 +760,7 @@ func newShortAgeExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, ts // newNoTwopcExecutor is same as newTestTxExecutor, but 2pc disabled. func newNoTwopcExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB) { db = setUpQueryExecutorTest(t) - logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor", streamlog.NewQueryLogConfigForTest()) tsv = newTestTabletServer(ctx, noTwopc, db) return &DTExecutor{ ctx: ctx, diff --git a/go/vt/vttablet/tabletserver/query_engine.go b/go/vt/vttablet/tabletserver/query_engine.go index d0542165878..4168a11f584 100644 --- a/go/vt/vttablet/tabletserver/query_engine.go +++ b/go/vt/vttablet/tabletserver/query_engine.go @@ -196,6 +196,8 @@ type QueryEngine struct { // Loggers accessCheckerLogger *logutil.ThrottledLogger + + redactUIQuery bool } // NewQueryEngine creates a new QueryEngine. @@ -209,6 +211,7 @@ func NewQueryEngine(env tabletenv.Env, se *schema.Engine) *QueryEngine { se: se, queryRuleSources: rules.NewMap(), enablePerWorkloadTableMetrics: config.EnablePerWorkloadTableMetrics, + redactUIQuery: streamlog.NewQueryLogConfigForTest().RedactDebugUIQueries, } // Cache for query plans: user configured size with a doorkeeper by default to prevent one-off queries @@ -737,7 +740,7 @@ func (qe *QueryEngine) handleHTTPConsolidations(response http.ResponseWriter, re response.Write([]byte(fmt.Sprintf("Length: %d\n", len(items)))) for _, v := range items { var query string - if streamlog.GetRedactDebugUIQueries() { + if qe.redactUIQuery { query, _ = qe.env.Environment().Parser().RedactSQLQuery(v.Query) } else { query = v.Query diff --git a/go/vt/vttablet/tabletserver/query_engine_test.go b/go/vt/vttablet/tabletserver/query_engine_test.go index a1c293ea8ba..c86e8aa163a 100644 --- a/go/vt/vttablet/tabletserver/query_engine_test.go +++ b/go/vt/vttablet/tabletserver/query_engine_test.go @@ -108,7 +108,7 @@ func TestGetPlanPanicDuetoEmptyQuery(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) _, err := qe.GetPlan(ctx, logStats, "", false) require.EqualError(t, err, "Query was empty") } @@ -195,7 +195,7 @@ func TestQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) initialHits := qe.queryEnginePlanCacheHits.Get() initialMisses := qe.queryEnginePlanCacheMisses.Get() @@ -244,7 +244,7 @@ func TestNoQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, true) if err != nil { @@ -273,7 +273,7 @@ func TestNoQueryPlanCacheDirective(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetPlan(ctx, logStats, firstQuery, false) if err != nil { @@ -301,7 +301,7 @@ func TestStreamQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, false) require.NoError(t, err) @@ -325,7 +325,7 @@ func TestNoStreamQueryPlanCache(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, true) require.NoError(t, err) require.NotNil(t, firstPlan) @@ -349,7 +349,7 @@ func TestNoStreamQueryPlanCacheDirective(t *testing.T) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) firstPlan, err := qe.GetStreamPlan(ctx, logStats, firstQuery, false) require.NoError(t, err) require.NotNil(t, firstPlan) @@ -369,7 +369,7 @@ func TestStatsURL(t *testing.T) { defer qe.Close() // warm up cache ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) qe.GetPlan(ctx, logStats, query, false) request, _ := http.NewRequest("GET", "/debug/tablet_plans", nil) @@ -425,18 +425,12 @@ func runConsolidatedQuery(t *testing.T, sql string) *QueryEngine { } func TestConsolidationsUIRedaction(t *testing.T) { - // Reset to default redaction state. - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - request, _ := http.NewRequest("GET", "/debug/consolidations", nil) sql := "select * from test_db_01 where col = 'secret'" redactedSQL := "select * from test_db_01 where col = :col" // First with the redaction off - streamlog.SetRedactDebugUIQueries(false) unRedactedResponse := httptest.NewRecorder() qe := runConsolidatedQuery(t, sql) @@ -446,7 +440,7 @@ func TestConsolidationsUIRedaction(t *testing.T) { } // Now with the redaction on - streamlog.SetRedactDebugUIQueries(true) + qe.redactUIQuery = true redactedResponse := httptest.NewRecorder() qe.handleHTTPConsolidations(redactedResponse, request) @@ -473,7 +467,7 @@ func BenchmarkPlanCacheThroughput(b *testing.B) { defer qe.Close() ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) for i := 0; i < b.N; i++ { query := fmt.Sprintf("SELECT (a, b, c) FROM test_table_%d", rand.IntN(500)) @@ -503,7 +497,7 @@ func benchmarkPlanCache(b *testing.B, db *fakesqldb.DB, par int) { b.SetParallelism(par) b.RunParallel(func(pb *testing.PB) { ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) for pb.Next() { query := fmt.Sprintf("SELECT (a, b, c) FROM test_table_%d", rand.IntN(500)) @@ -618,7 +612,7 @@ func TestPlanCachePollution(t *testing.T) { runner := func(totalQueries uint64, stats *Stats, sample func() string) { for i := uint64(0); i < totalQueries; i++ { ctx := context.Background() - logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") + logStats := tabletenv.NewLogStats(ctx, "GetPlanStats", streamlog.NewQueryLogConfigForTest()) query := sample() start := time.Now() diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index ade79ecaef5..6f6becd4038 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -28,6 +28,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/streamlog" + "vitess.io/vitess/go/stats" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtenv" @@ -840,7 +842,7 @@ func TestQueryExecutorMessageStreamACL(t *testing.T) { ctx: ctx, query: "stream from msg", plan: plan, - logStats: tabletenv.NewLogStats(ctx, "TestQueryExecutor"), + logStats: tabletenv.NewLogStats(ctx, "TestQueryExecutor", streamlog.NewQueryLogConfigForTest()), tsv: tsv, } @@ -1556,7 +1558,7 @@ func newTransaction(tsv *TabletServer, options *querypb.ExecuteOptions) int64 { } func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, txID int64) *QueryExecutor { - logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutor") + logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutor", streamlog.NewQueryLogConfigForTest()) plan, err := tsv.qe.GetPlan(ctx, logStats, sql, false) if err != nil { panic(err) @@ -1573,7 +1575,7 @@ func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, tx } func newTestQueryExecutorStreaming(ctx context.Context, tsv *TabletServer, sql string, txID int64) *QueryExecutor { - logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutorStreaming") + logStats := tabletenv.NewLogStats(ctx, "TestQueryExecutorStreaming", streamlog.NewQueryLogConfigForTest()) plan, err := tsv.qe.GetStreamPlan(ctx, logStats, sql, false) if err != nil { panic(err) diff --git a/go/vt/vttablet/tabletserver/query_list.go b/go/vt/vttablet/tabletserver/query_list.go index 60fac1ea3af..7263bea3afc 100644 --- a/go/vt/vttablet/tabletserver/query_list.go +++ b/go/vt/vttablet/tabletserver/query_list.go @@ -63,6 +63,8 @@ type QueryList struct { parser *sqlparser.Parser ca ClusterActionState + + redactUIQuery bool } type ClusterActionState int @@ -76,10 +78,11 @@ const ( // NewQueryList creates a new QueryList func NewQueryList(name string, parser *sqlparser.Parser) *QueryList { return &QueryList{ - name: name, - queryDetails: make(map[int64][]*QueryDetail), - parser: parser, - ca: ClusterActionNotInProgress, + name: name, + queryDetails: make(map[int64][]*QueryDetail), + parser: parser, + ca: ClusterActionNotInProgress, + redactUIQuery: streamlog.GetQueryLogConfig().RedactDebugUIQueries, } } @@ -186,7 +189,7 @@ func (ql *QueryList) AppendQueryzRows(rows []QueryDetailzRow) []QueryDetailzRow for _, qds := range ql.queryDetails { for _, qd := range qds { query := qd.conn.Current() - if streamlog.GetRedactDebugUIQueries() { + if ql.redactUIQuery { query, _ = ql.parser.RedactSQLQuery(query) } row := QueryDetailzRow{ diff --git a/go/vt/vttablet/tabletserver/querylogz_test.go b/go/vt/vttablet/tabletserver/querylogz_test.go index ee26437f330..7f865541295 100644 --- a/go/vt/vttablet/tabletserver/querylogz_test.go +++ b/go/vt/vttablet/tabletserver/querylogz_test.go @@ -35,7 +35,7 @@ import ( func TestQuerylogzHandler(t *testing.T) { req, _ := http.NewRequest("GET", "/querylogz?timeout=10&limit=1", nil) - logStats := tabletenv.NewLogStats(context.Background(), "Execute") + logStats := tabletenv.NewLogStats(context.Background(), "Execute", streamlog.NewQueryLogConfigForTest()) logStats.PlanType = planbuilder.PlanSelect.String() logStats.OriginalSQL = "select name, 'inject ' from test_table limit 1000" logStats.RowsAffected = 1000 @@ -144,8 +144,7 @@ func TestQuerylogzHandler(t *testing.T) { checkQuerylogzHasStats(t, slowQueryPattern, logStats, body) // ensure querylogz is not affected by the filter tag - streamlog.SetQueryLogFilterTag("XXX_SKIP_ME") - defer func() { streamlog.SetQueryLogFilterTag("") }() + logStats.Config.FilterTag = "XXX_SKIP_ME" ch = make(chan *tabletenv.LogStats, 1) ch <- logStats querylogzHandler(ch, response, req, sqlparser.NewTestParser()) diff --git a/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go b/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go index caa519cc477..c8d9f634384 100644 --- a/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go +++ b/go/vt/vttablet/tabletserver/stream_consolidator_flaky_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "vitess.io/vitess/go/streamlog" querypb "vitess.io/vitess/go/vt/proto/query" "github.com/stretchr/testify/require" @@ -126,7 +127,7 @@ func (ct *consolidationTest) run(workers int, generateCallback func(int) (string defer wg.Done() exporter := servenv.NewExporter("ConsolidatorTest", "") timings := exporter.NewTimings("ConsolidatorWaits", "", "StreamConsolidations") - logStats := tabletenv.NewLogStats(context.Background(), "StreamConsolidation") + logStats := tabletenv.NewLogStats(context.Background(), "StreamConsolidation", streamlog.NewQueryLogConfigForTest()) query, callback := generateCallback(worker) start := time.Now() err := ct.cc.Consolidate(timings, logStats, query, func(result *sqltypes.Result) error { diff --git a/go/vt/vttablet/tabletserver/tabletenv/config.go b/go/vt/vttablet/tabletserver/tabletenv/config.go index 42cc300f92d..08bf0b1d7c8 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config.go @@ -278,11 +278,12 @@ func Init() { currentConfig.Healthcheck.UnhealthyThreshold = unhealthyThreshold currentConfig.GracePeriods.Transition = transitionGracePeriod - switch streamlog.GetQueryLogFormat() { + logFormat := streamlog.GetQueryLogConfig().Format + switch logFormat { case streamlog.QueryLogFormatText: case streamlog.QueryLogFormatJSON: default: - log.Exitf("Invalid querylog-format value %v: must be either text or json", streamlog.GetQueryLogFormat()) + log.Exitf("Invalid querylog-format value %v: must be either text or json", logFormat) } if queryLogHandler != "" { diff --git a/go/vt/vttablet/tabletserver/tabletenv/logstats.go b/go/vt/vttablet/tabletserver/tabletenv/logstats.go index ad7e09de169..40156f3bcdc 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/logstats.go +++ b/go/vt/vttablet/tabletserver/tabletenv/logstats.go @@ -43,6 +43,8 @@ const ( // LogStats records the stats for a single query type LogStats struct { + Config streamlog.QueryLogConfig + Ctx context.Context Method string Target *querypb.Target @@ -66,11 +68,12 @@ type LogStats struct { // NewLogStats constructs a new LogStats with supplied Method and ctx // field values, and the StartTime field set to the present time. -func NewLogStats(ctx context.Context, methodName string) *LogStats { +func NewLogStats(ctx context.Context, methodName string, config streamlog.QueryLogConfig) *LogStats { return &LogStats{ Ctx: ctx, Method: methodName, StartTime: time.Now(), + Config: config, } } @@ -177,17 +180,16 @@ func (stats *LogStats) CallInfo() (string, string) { // Logf formats the log record to the given writer, either as // tab-separated list of logged fields or as JSON. func (stats *LogStats) Logf(w io.Writer, params url.Values) error { - if !streamlog.ShouldEmitLog(stats.OriginalSQL, uint64(stats.RowsAffected), uint64(len(stats.Rows))) { + if !stats.Config.ShouldEmitLog(stats.OriginalSQL, uint64(stats.RowsAffected), uint64(len(stats.Rows)), stats.Error != nil) { return nil } - redacted := streamlog.GetRedactDebugUIQueries() _, fullBindParams := params["full"] // TODO: remove username here we fully enforce immediate caller id callInfo, username := stats.CallInfo() log := logstats.NewLogger() - log.Init(streamlog.GetQueryLogFormat() == streamlog.QueryLogFormatJSON) + log.Init(stats.Config.Format == streamlog.QueryLogFormatJSON) log.Key("Method") log.StringUnquoted(stats.Method) log.Key("CallInfo") @@ -209,7 +211,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("OriginalSQL") log.String(stats.OriginalSQL) log.Key("BindVars") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.BindVariables(stats.BindVariables, fullBindParams) @@ -217,7 +219,7 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Key("Queries") log.Int(int64(stats.NumberOfQueries)) log.Key("RewrittenSQL") - if redacted { + if stats.Config.RedactDebugUIQueries { log.Redacted() } else { log.String(stats.RewrittenSQL()) diff --git a/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go b/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go index 7412a0a436c..4c31b890cca 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go +++ b/go/vt/vttablet/tabletserver/tabletenv/logstats_test.go @@ -26,6 +26,8 @@ import ( "time" "github.com/google/safehtml/testconversions" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/streamlog" @@ -35,7 +37,7 @@ import ( ) func TestLogStats(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.QueryLogConfig{}) logStats.AddRewrittenSQL("sql1", time.Now()) if !strings.Contains(logStats.RewrittenSQL(), "sql1") { @@ -59,7 +61,7 @@ func testFormat(stats *LogStats, params url.Values) string { } func TestLogStatsFormat(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.OriginalSQL = "sql" @@ -70,90 +72,65 @@ func TestLogStatsFormat(t *testing.T) { logStats.Rows = [][]sqltypes.Value{{sqltypes.NewVarBinary("a")}} params := map[string][]string{"full": {}} - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("text") - got := testFormat(logStats, url.Values(params)) + got := testFormat(logStats, params) want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) - streamlog.SetRedactDebugUIQueries(true) - streamlog.SetQueryLogFormat("text") - got = testFormat(logStats, url.Values(params)) + logStats.Config.RedactDebugUIQueries = true + + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t\"[REDACTED]\"\t1\t\"[REDACTED]\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) - streamlog.SetRedactDebugUIQueries(false) - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatJSON + + got = testFormat(logStats, params) var parsed map[string]any err := json.Unmarshal([]byte(got), &parsed) if err != nil { t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) } formatted, err := json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": {\n \"intVal\": {\n \"type\": \"INT64\",\n \"value\": 1\n }\n },\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"sql with pii\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } + assert.Equal(t, want, string(formatted)) + + logStats.Config.RedactDebugUIQueries = true + logStats.Config.Format = streamlog.QueryLogFormatJSON - streamlog.SetRedactDebugUIQueries(true) - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) err = json.Unmarshal([]byte(got), &parsed) - if err != nil { - t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) formatted, err = json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": \"[REDACTED]\",\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"[REDACTED]\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } - - streamlog.SetRedactDebugUIQueries(false) + assert.Equal(t, want, string(formatted)) // Make sure formatting works for string bind vars. We can't do this as part of a single // map because the output ordering is undefined. logStats.BindVariables = map[string]*querypb.BindVariable{"strVal": sqltypes.StringBindVariable("abc")} + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatText - streamlog.SetQueryLogFormat("text") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql\"\t{\"strVal\": {\"type\": \"VARCHAR\", \"value\": \"abc\"}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t12345\t1\t\"\"\t\n" - if got != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) - } + assert.Equal(t, want, got) + + logStats.Config.RedactDebugUIQueries = false + logStats.Config.Format = streamlog.QueryLogFormatJSON - streamlog.SetQueryLogFormat("json") - got = testFormat(logStats, url.Values(params)) + got = testFormat(logStats, params) err = json.Unmarshal([]byte(got), &parsed) - if err != nil { - t.Errorf("logstats format: error unmarshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) formatted, err = json.MarshalIndent(parsed, "", " ") - if err != nil { - t.Errorf("logstats format: error marshaling json: %v -- got:\n%v", err, got) - } + require.NoError(t, err) want = "{\n \"BindVars\": {\n \"strVal\": {\n \"type\": \"VARCHAR\",\n \"value\": \"abc\"\n }\n },\n \"CallInfo\": \"\",\n \"ConnWaitTime\": 0,\n \"Effective Caller\": \"\",\n \"End\": \"2017-01-01 01:02:04.000001\",\n \"Error\": \"\",\n \"ImmediateCaller\": \"\",\n \"Method\": \"test\",\n \"MysqlTime\": 0,\n \"OriginalSQL\": \"sql\",\n \"PlanType\": \"\",\n \"Queries\": 1,\n \"QuerySources\": \"mysql\",\n \"ResponseSize\": 1,\n \"RewrittenSQL\": \"sql with pii\",\n \"RowsAffected\": 0,\n \"Start\": \"2017-01-01 01:02:03.000000\",\n \"TotalTime\": 1.000001,\n \"TransactionID\": 12345,\n \"Username\": \"\"\n}" - if string(formatted) != want { - t.Errorf("logstats format: got:\n%q\nwant:\n%v\n", string(formatted), want) - } - - streamlog.SetQueryLogFormat("text") + assert.Equal(t, want, string(formatted)) } func TestLogStatsFilter(t *testing.T) { - defer func() { streamlog.SetQueryLogFilterTag("") }() - - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) logStats.StartTime = time.Date(2017, time.January, 1, 1, 2, 3, 0, time.UTC) logStats.EndTime = time.Date(2017, time.January, 1, 1, 2, 4, 1234, time.UTC) logStats.OriginalSQL = "sql /* LOG_THIS_QUERY */" @@ -163,21 +140,21 @@ func TestLogStatsFilter(t *testing.T) { logStats.Rows = [][]sqltypes.Value{{sqltypes.NewVarBinary("a")}} params := map[string][]string{"full": {}} - got := testFormat(logStats, url.Values(params)) + got := testFormat(logStats, params) want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t0\t1\t\"\"\t\n" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) } - streamlog.SetQueryLogFilterTag("LOG_THIS_QUERY") - got = testFormat(logStats, url.Values(params)) + logStats.Config.FilterTag = "LOG_THIS_QUERY" + got = testFormat(logStats, params) want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t\t\"sql /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t1\t\"sql with pii\"\tmysql\t0.000000\t0.000000\t0\t0\t1\t\"\"\t\n" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) } - streamlog.SetQueryLogFilterTag("NOT_THIS_QUERY") - got = testFormat(logStats, url.Values(params)) + logStats.Config.FilterTag = "NOT_THIS_QUERY" + got = testFormat(logStats, params) want = "" if got != want { t.Errorf("logstats format: got:\n%q\nwant:\n%q\n", got, want) @@ -185,7 +162,7 @@ func TestLogStatsFilter(t *testing.T) { } func TestLogStatsFormatQuerySources(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) if logStats.FmtQuerySources() != "none" { t.Fatalf("should return none since log stats does not have any query source, but got: %s", logStats.FmtQuerySources()) } @@ -207,14 +184,14 @@ func TestLogStatsContextHTML(t *testing.T) { Html: testconversions.MakeHTMLForTest(html), } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats := NewLogStats(ctx, "test") + logStats := NewLogStats(ctx, "test", streamlog.NewQueryLogConfigForTest()) if logStats.ContextHTML().String() != html { t.Fatalf("expect to get html: %s, but got: %s", html, logStats.ContextHTML().String()) } } func TestLogStatsErrorStr(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) if logStats.ErrorStr() != "" { t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) } @@ -226,7 +203,7 @@ func TestLogStatsErrorStr(t *testing.T) { } func TestLogStatsCallInfo(t *testing.T) { - logStats := NewLogStats(context.Background(), "test") + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) caller, user := logStats.CallInfo() if caller != "" { t.Fatalf("caller should be empty") @@ -243,7 +220,7 @@ func TestLogStatsCallInfo(t *testing.T) { User: username, } ctx := callinfo.NewContext(context.Background(), callInfo) - logStats = NewLogStats(ctx, "test") + logStats = NewLogStats(ctx, "test", streamlog.NewQueryLogConfigForTest()) caller, user = logStats.CallInfo() wantCaller := remoteAddr + ":FakeExecute(fakeRPC)" if caller != wantCaller { @@ -253,3 +230,18 @@ func TestLogStatsCallInfo(t *testing.T) { t.Fatalf("expected to get username: %s, but got: %s", username, user) } } + +// TestLogStatsErrorsOnly tests that LogStats only logs errors when the query log mode is set to errors only for VTTablet. +func TestLogStatsErrorsOnly(t *testing.T) { + logStats := NewLogStats(context.Background(), "test", streamlog.NewQueryLogConfigForTest()) + logStats.Config.Mode = streamlog.QueryLogModeError + + // no error, should not log + logOutput := testFormat(logStats, url.Values{}) + assert.Empty(t, logOutput) + + // error, should log + logStats.Error = errors.New("test error") + logOutput = testFormat(logStats, url.Values{}) + assert.Contains(t, logOutput, "test error") +} diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index deeac10bd05..30f73d2d818 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -37,6 +37,7 @@ import ( "vitess.io/vitess/go/pools/smartconnpool" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/tb" "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/callerid" @@ -1551,7 +1552,7 @@ func (tsv *TabletServer) execRequest( defer span.Finish() - logStats := tabletenv.NewLogStats(ctx, requestName) + logStats := tabletenv.NewLogStats(ctx, requestName, streamlog.GetQueryLogConfig()) logStats.Target = target logStats.OriginalSQL = sql logStats.BindVariables = sqltypes.CopyBindVariables(bindVariables) @@ -1875,7 +1876,9 @@ func (tsv *TabletServer) registerQuerylogzHandler() { } func (tsv *TabletServer) registerTxlogzHandler() { - tsv.exporter.HandleFunc("/txlogz", txlogzHandler) + tsv.exporter.HandleFunc("/txlogz", func(w http.ResponseWriter, r *http.Request) { + txlogzHandler(w, r, streamlog.GetQueryLogConfig().RedactDebugUIQueries) + }) } func (tsv *TabletServer) registerQueryListHandlers(queryLists []*QueryList) { @@ -1890,7 +1893,7 @@ func (tsv *TabletServer) registerQueryListHandlers(queryLists []*QueryList) { func (tsv *TabletServer) registerTwopczHandler() { tsv.exporter.HandleFunc("/twopcz", func(w http.ResponseWriter, r *http.Request) { ctx := tabletenv.LocalContext() - txe := NewDTExecutor(ctx, tabletenv.NewLogStats(ctx, "twopcz"), tsv.te, tsv.qe, tsv.getShard) + txe := NewDTExecutor(ctx, tabletenv.NewLogStats(ctx, "twopcz", streamlog.GetQueryLogConfig()), tsv.te, tsv.qe, tsv.getShard) twopczHandler(txe, w, r) }) } diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 621941224a9..e4faf4ee6c9 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -33,6 +33,7 @@ import ( "vitess.io/vitess/go/mysql/config" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/stats" + "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/sidecardb" "vitess.io/vitess/go/vt/vtenv" @@ -1659,7 +1660,7 @@ func TestPurgeMessages(t *testing.T) { func TestHandleExecUnknownError(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - logStats := tabletenv.NewLogStats(ctx, "TestHandleExecError") + logStats := tabletenv.NewLogStats(ctx, "TestHandleExecError", streamlog.NewQueryLogConfigForTest()) cfg := tabletenv.NewDefaultConfig() srvTopoCounts := stats.NewCountersWithSingleLabel("", "Resilient srvtopo server operations", "type") tsv := NewTabletServer(ctx, vtenv.NewTestEnv(), "TabletServerTest", cfg, memorytopo.NewServer(ctx, ""), &topodatapb.TabletAlias{}, srvTopoCounts) @@ -1676,7 +1677,7 @@ func TestHandlePanicAndSendLogStatsMessageTruncation(t *testing.T) { defer cancel() tl := newTestLogger() defer tl.Close() - logStats := tabletenv.NewLogStats(ctx, "TestHandlePanicAndSendLogStatsMessageTruncation") + logStats := tabletenv.NewLogStats(ctx, "TestHandlePanicAndSendLogStatsMessageTruncation", streamlog.NewQueryLogConfigForTest()) env, err := vtenv.New(vtenv.Options{ MySQLServerVersion: config.DefaultMySQLVersion, TruncateErrLen: 32, diff --git a/go/vt/vttablet/tabletserver/txlogz.go b/go/vt/vttablet/tabletserver/txlogz.go index 8d1b88c8c85..9a60812ca0b 100644 --- a/go/vt/vttablet/tabletserver/txlogz.go +++ b/go/vt/vttablet/tabletserver/txlogz.go @@ -25,7 +25,6 @@ import ( "github.com/google/safehtml/template" "vitess.io/vitess/go/acl" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logz" @@ -76,13 +75,13 @@ var ( // Endpoint: /txlogz?timeout=%d&limit=%d // timeout: the txlogz will keep dumping transactions until timeout // limit: txlogz will keep dumping transactions until it hits the limit -func txlogzHandler(w http.ResponseWriter, req *http.Request) { +func txlogzHandler(w http.ResponseWriter, req *http.Request, redactUIQuery bool) { if err := acl.CheckAccessHTTP(req, acl.DEBUGGING); err != nil { acl.SendError(w, err) return } - if streamlog.GetRedactDebugUIQueries() { + if redactUIQuery { io.WriteString(w, ` diff --git a/go/vt/vttablet/tabletserver/txlogz_test.go b/go/vt/vttablet/tabletserver/txlogz_test.go index 8faec74d07b..4556665a52a 100644 --- a/go/vt/vttablet/tabletserver/txlogz_test.go +++ b/go/vt/vttablet/tabletserver/txlogz_test.go @@ -27,8 +27,6 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" "vitess.io/vitess/go/vt/callerid" - - "vitess.io/vitess/go/streamlog" ) func testNotRedacted(t *testing.T, r *httptest.ResponseRecorder) { @@ -45,11 +43,10 @@ func testRedacted(t *testing.T, r *httptest.ResponseRecorder) { func testHandler(req *http.Request, t *testing.T) { // Test with redactions off to start - streamlog.SetRedactDebugUIQueries(false) response := httptest.NewRecorder() tabletenv.TxLogger.Send("test msg") - txlogzHandler(response, req) + txlogzHandler(response, req, false) if !strings.Contains(response.Body.String(), "error") { t.Fatalf("should show an error page since transaction log format is invalid.") } @@ -66,26 +63,22 @@ func testHandler(req *http.Request, t *testing.T) { txConn.txProps.EndTime = txConn.txProps.StartTime response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) txConn.txProps.EndTime = txConn.txProps.StartTime.Add(time.Duration(2) * time.Second) response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) txConn.txProps.EndTime = txConn.txProps.StartTime.Add(time.Duration(500) * time.Millisecond) response = httptest.NewRecorder() tabletenv.TxLogger.Send(txConn) - txlogzHandler(response, req) + txlogzHandler(response, req, false) testNotRedacted(t, response) // Test with redactions on - streamlog.SetRedactDebugUIQueries(true) - txlogzHandler(response, req) + txlogzHandler(response, req, true) testRedacted(t, response) - - // Reset to default redaction state - streamlog.SetRedactDebugUIQueries(false) } func TestTxlogzHandler(t *testing.T) { diff --git a/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go b/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go index 10428ed67c7..d8962f1c2b8 100644 --- a/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go +++ b/go/vt/vttablet/tabletserver/txserializer/tx_serializer.go @@ -19,14 +19,13 @@ limitations under the License. package txserializer import ( + "context" "fmt" "net/http" "strings" "sync" "time" - "context" - "vitess.io/vitess/go/acl" "vitess.io/vitess/go/stats" "vitess.io/vitess/go/streamlog" @@ -87,9 +86,10 @@ type TxSerializer struct { logQueueExceededDryRun *logutil.ThrottledLogger logGlobalQueueExceededDryRun *logutil.ThrottledLogger - mu sync.Mutex - queues map[string]*queue - globalSize int + mu sync.Mutex + queues map[string]*queue + globalSize int + redactUIQuery bool } // New returns a TxSerializer object. @@ -130,6 +130,7 @@ func New(env tabletenv.Env) *TxSerializer { logQueueExceededDryRun: logutil.NewThrottledLogger("HotRowProtection QueueExceeded DryRun", 5*time.Second), logGlobalQueueExceededDryRun: logutil.NewThrottledLogger("HotRowProtection GlobalQueueExceeded DryRun", 5*time.Second), queues: make(map[string]*queue), + redactUIQuery: streamlog.NewQueryLogConfigForTest().RedactDebugUIQueries, } } @@ -328,7 +329,7 @@ func (txs *TxSerializer) Pending(key string) int { // ServeHTTP lists the most recent, cached queries and their count. func (txs *TxSerializer) ServeHTTP(response http.ResponseWriter, request *http.Request) { - if streamlog.GetRedactDebugUIQueries() { + if txs.redactUIQuery { response.Write([]byte(` diff --git a/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go b/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go index e1b4b5a7612..d53c434d9b6 100644 --- a/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go +++ b/go/vt/vttablet/tabletserver/txserializer/tx_serializer_test.go @@ -26,7 +26,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/streamlog" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -71,17 +70,13 @@ func TestTxSerializer_NoHotRow(t *testing.T) { } func TestTxSerializerRedactDebugUI(t *testing.T) { - streamlog.SetRedactDebugUIQueries(true) - defer func() { - streamlog.SetRedactDebugUIQueries(false) - }() - cfg := tabletenv.NewDefaultConfig() cfg.HotRowProtection.MaxQueueSize = 1 cfg.HotRowProtection.MaxGlobalQueueSize = 1 cfg.HotRowProtection.MaxConcurrency = 5 txs := New(tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TxSerializerTest")) resetVariables(txs) + txs.redactUIQuery = true done, waited, err := txs.Wait(context.Background(), "t1 where1", "t1") if err != nil { From 5363f038ace51165afcc8357bc6e1c81ee52a612 Mon Sep 17 00:00:00 2001 From: Noble Mittal <62551163+beingnoble03@users.noreply.github.com> Date: Wed, 22 Jan 2025 19:53:09 +0530 Subject: [PATCH 59/66] LookupVindex: Implement `internalize` command for lookup vindexes (#17429) Signed-off-by: Noble Mittal --- .../vreplication/lookupvindex/lookupvindex.go | 100 +- .../vreplication/lookup_vindex_helper_test.go | 49 +- .../vreplication/lookup_vindex_test.go | 145 + .../vreplication/vreplication_test.go | 8 + .../tabletmanagerdata/tabletmanagerdata.pb.go | 549 +-- .../tabletmanagerdata_vtproto.pb.go | 48 + go/vt/proto/vtctldata/vtctldata.pb.go | 4208 +++++++++-------- go/vt/proto/vtctldata/vtctldata_vtproto.pb.go | 772 +++ go/vt/proto/vtctlservice/vtctlservice.pb.go | 1490 +++--- .../vtctlservice/vtctlservice_grpc.pb.go | 72 + go/vt/vtctl/grpcvtctldclient/client_gen.go | 18 + go/vt/vtctl/grpcvtctldserver/server.go | 30 + go/vt/vtctl/localvtctldclient/client_gen.go | 10 + go/vt/vtctl/workflow/lookup_vindex.go | 51 + go/vt/vtctl/workflow/server.go | 160 +- go/vt/vtctl/workflow/utils.go | 17 +- go/vt/vtctl/workflow/utils_test.go | 3 +- .../vttablet/tabletmanager/framework_test.go | 5 + .../tabletmanager/rpc_vreplication.go | 8 +- .../tabletmanager/rpc_vreplication_test.go | 656 ++- proto/tabletmanagerdata.proto | 1 + proto/vtctldata.proto | 33 +- proto/vtctlservice.proto | 2 + web/vtadmin/src/proto/vtadmin.d.ts | 421 ++ web/vtadmin/src/proto/vtadmin.js | 939 +++- 25 files changed, 6748 insertions(+), 3047 deletions(-) diff --git a/go/cmd/vtctldclient/command/vreplication/lookupvindex/lookupvindex.go b/go/cmd/vtctldclient/command/vreplication/lookupvindex/lookupvindex.go index 9650a52e8a5..82b13cf70b3 100644 --- a/go/cmd/vtctldclient/command/vreplication/lookupvindex/lookupvindex.go +++ b/go/cmd/vtctldclient/command/vreplication/lookupvindex/lookupvindex.go @@ -72,6 +72,15 @@ var ( externalizeOptions = struct { Keyspace string + Delete bool + }{} + + internalizeOptions = struct { + Keyspace string + }{} + + completeOptions = struct { + Keyspace string }{} parseAndValidateCreate = func(cmd *cobra.Command, args []string) error { @@ -142,6 +151,18 @@ var ( RunE: commandCancel, } + // complete makes a LookupVindexComplete call to a vtctld. + complete = &cobra.Command{ + Use: "complete", + Short: "Complete the LookupVindex workflow. The Vindex must have been previously externalized. If you want to delete the workflow without externalizing the Vindex then use the cancel command instead.", + Example: `vtctldclient --server localhost:15999 LookupVindex --name corder_lookup_vdx --table-keyspace customer complete`, + SilenceUsage: true, + DisableFlagsInUseLine: true, + Aliases: []string{"Complete"}, + Args: cobra.NoArgs, + RunE: commandComplete, + } + // create makes a LookupVindexCreate call to a vtctld. create = &cobra.Command{ Use: "create", @@ -158,7 +179,7 @@ var ( // externalize makes a LookupVindexExternalize call to a vtctld. externalize = &cobra.Command{ Use: "externalize", - Short: "Externalize the Lookup Vindex. If the Vindex has an owner the VReplication workflow will also be deleted.", + Short: "Externalize the Lookup Vindex. If the Vindex has an owner the VReplication workflow will also be stopped/deleted.", Example: `vtctldclient --server localhost:15999 LookupVindex --name corder_lookup_vdx --table-keyspace customer externalize`, SilenceUsage: true, DisableFlagsInUseLine: true, @@ -167,6 +188,18 @@ var ( RunE: commandExternalize, } + // internalize makes a LookupVindexInternalize call to a vtctld. + internalize = &cobra.Command{ + Use: "internalize", + Short: "Internalize the Vindex again to continue the backfill, making it unusable for queries again.", + Example: `vtctldclient --server localhost:15999 LookupVindex --name corder_lookup_vdx --table-keyspace customer internalize`, + SilenceUsage: true, + DisableFlagsInUseLine: true, + Aliases: []string{"Internalize"}, + Args: cobra.NoArgs, + RunE: commandInternalize, + } + // show makes a GetWorkflows call to a vtctld. show = &cobra.Command{ Use: "show", @@ -199,6 +232,30 @@ func commandCancel(cmd *cobra.Command, args []string) error { return nil } +func commandComplete(cmd *cobra.Command, args []string) error { + if completeOptions.Keyspace == "" { + completeOptions.Keyspace = baseOptions.TableKeyspace + } + cli.FinishedParsing(cmd) + + _, err := common.GetClient().LookupVindexComplete(common.GetCommandCtx(), &vtctldatapb.LookupVindexCompleteRequest{ + Keyspace: completeOptions.Keyspace, + // The name of the workflow and lookup vindex. + Name: baseOptions.Name, + // Where the lookup table and VReplication workflow were created. + TableKeyspace: baseOptions.TableKeyspace, + }) + + if err != nil { + return err + } + + output := fmt.Sprintf("LookupVindex %s has been completed and the VReplication workflow has been deleted.", baseOptions.Name) + fmt.Println(output) + + return nil +} + func commandCreate(cmd *cobra.Command, args []string) error { tsp := common.GetTabletSelectionPreference(cmd) cli.FinishedParsing(cmd) @@ -236,6 +293,8 @@ func commandExternalize(cmd *cobra.Command, args []string) error { Name: baseOptions.Name, // Where the lookup table and VReplication workflow were created. TableKeyspace: baseOptions.TableKeyspace, + // Delete the workflow after externalizing, instead of stopping. + DeleteWorkflow: externalizeOptions.Delete, }) if err != nil { @@ -243,14 +302,40 @@ func commandExternalize(cmd *cobra.Command, args []string) error { } output := fmt.Sprintf("LookupVindex %s has been externalized", baseOptions.Name) - if resp.WorkflowDeleted { - output = output + fmt.Sprintf(" and the %s VReplication workflow has been deleted", baseOptions.Name) + if resp.WorkflowStopped { + output = output + " and the VReplication workflow has been stopped." + } else if resp.WorkflowDeleted { + output = output + " and the VReplication workflow has been deleted." } fmt.Println(output) return nil } +func commandInternalize(cmd *cobra.Command, args []string) error { + if internalizeOptions.Keyspace == "" { + internalizeOptions.Keyspace = baseOptions.TableKeyspace + } + cli.FinishedParsing(cmd) + + _, err := common.GetClient().LookupVindexInternalize(common.GetCommandCtx(), &vtctldatapb.LookupVindexInternalizeRequest{ + Keyspace: internalizeOptions.Keyspace, + // The name of the workflow and lookup vindex. + Name: baseOptions.Name, + // Where the lookup table and VReplication workflow were created. + TableKeyspace: baseOptions.TableKeyspace, + }) + + if err != nil { + return err + } + + output := fmt.Sprintf("LookupVindex %s has been internalized and the VReplication workflow has been started.", baseOptions.Name) + fmt.Println(output) + + return nil +} + func commandShow(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) @@ -304,12 +389,19 @@ func registerCommands(root *cobra.Command) { // for the VReplication workflow used. base.AddCommand(show) - // This will also delete the VReplication workflow if the + // This will also stop the VReplication workflow if the // vindex has an owner as the lookup vindex will then be // managed by VTGate. externalize.Flags().StringVar(&externalizeOptions.Keyspace, "keyspace", "", "The keyspace containing the Lookup Vindex. If no value is specified then the table-keyspace will be used.") + externalize.Flags().BoolVar(&externalizeOptions.Delete, "delete", false, "Delete the VReplication workflow after externalizing the Vindex, instead of stopping (default false).") base.AddCommand(externalize) + internalize.Flags().StringVar(&internalizeOptions.Keyspace, "keyspace", "", "The keyspace containing the Lookup Vindex. If no value is specified then the table-keyspace will be used.") + base.AddCommand(internalize) + + complete.Flags().StringVar(&completeOptions.Keyspace, "keyspace", "", "The keyspace containing the Lookup Vindex. If no value is specified then the table-keyspace will be used.") + base.AddCommand(complete) + // The cancel command deletes the VReplication workflow used // to backfill the lookup vindex. It ends up making a // WorkflowDelete VtctldServer call. diff --git a/go/test/endtoend/vreplication/lookup_vindex_helper_test.go b/go/test/endtoend/vreplication/lookup_vindex_helper_test.go index 1c74dadc642..359ecc1d21b 100644 --- a/go/test/endtoend/vreplication/lookup_vindex_helper_test.go +++ b/go/test/endtoend/vreplication/lookup_vindex_helper_test.go @@ -66,11 +66,18 @@ func (lv *lookupVindex) create() { err := vc.VtctldClient.ExecuteCommand(args...) require.NoError(lv.t, err, "error executing LookupVindex create: %v", err) waitForWorkflowState(lv.t, vc, fmt.Sprintf("%s.%s", lv.ownerTableKeyspace, lv.name), binlogdatapb.VReplicationWorkflowState_Running.String()) - lv.expectWriteOnly(true) + lv.expectParamsAndOwner(true) } func (lv *lookupVindex) cancel() { - panic("not implemented") + args := []string{ + "LookupVindex", + "--name", lv.name, + "--table-keyspace=" + lv.ownerTableKeyspace, + "cancel", + } + err := vc.VtctldClient.ExecuteCommand(args...) + require.NoError(lv.t, err, "error executing LookupVindex complete: %v", err) } func (lv *lookupVindex) externalize() { @@ -83,20 +90,52 @@ func (lv *lookupVindex) externalize() { } err := vc.VtctldClient.ExecuteCommand(args...) require.NoError(lv.t, err, "error executing LookupVindex externalize: %v", err) - lv.expectWriteOnly(false) + lv.expectParamsAndOwner(false) +} + +func (lv *lookupVindex) internalize() { + args := []string{ + "LookupVindex", + "--name", lv.name, + "--table-keyspace=" + lv.ownerTableKeyspace, + "internalize", + "--keyspace=" + lv.tableKeyspace, + } + err := vc.VtctldClient.ExecuteCommand(args...) + require.NoError(lv.t, err, "error executing LookupVindex internalize: %v", err) + lv.expectParamsAndOwner(true) +} + +func (lv *lookupVindex) complete() { + args := []string{ + "LookupVindex", + "--name", lv.name, + "--table-keyspace=" + lv.ownerTableKeyspace, + "complete", + "--keyspace=" + lv.tableKeyspace, + } + err := vc.VtctldClient.ExecuteCommand(args...) + require.NoError(lv.t, err, "error executing LookupVindex complete: %v", err) + lv.expectParamsAndOwner(false) } func (lv *lookupVindex) show() error { return nil } -func (lv *lookupVindex) expectWriteOnly(expected bool) { +func (lv *lookupVindex) expectParamsAndOwner(expectedWriteOnlyParam bool) { vschema, err := vc.VtctldClient.ExecuteCommandWithOutput("GetVSchema", lv.ownerTableKeyspace) require.NoError(lv.t, err, "error executing GetVSchema: %v", err) vdx := gjson.Get(vschema, fmt.Sprintf("vindexes.%s", lv.name)) require.NotNil(lv.t, vdx, "lookup vindex %s not found", lv.name) + + expectedOwner, expectedFrom, expectedTo := lv.ownerTable, strings.Join(lv.columns, ","), "keyspace_id" + require.Equal(lv.t, expectedOwner, vdx.Get("owner").String(), "expected 'owner' parameter to be %s", expectedOwner) + require.Equal(lv.t, expectedFrom, vdx.Get("params.from").String(), "expected 'from' parameter to be %s", expectedFrom) + require.Equal(lv.t, expectedTo, vdx.Get("params.to").String(), "expected 'to' parameter to be %s", expectedTo) + want := "" - if expected { + if expectedWriteOnlyParam { want = "true" } require.Equal(lv.t, want, vdx.Get("params.write_only").String(), "expected write_only parameter to be %s", want) diff --git a/go/test/endtoend/vreplication/lookup_vindex_test.go b/go/test/endtoend/vreplication/lookup_vindex_test.go index c0864b26cca..0e6810f3887 100644 --- a/go/test/endtoend/vreplication/lookup_vindex_test.go +++ b/go/test/endtoend/vreplication/lookup_vindex_test.go @@ -84,6 +84,8 @@ type lookupTestCase struct { initQuery string runningQuery string postExternalizeQuery string + postInternalizeQuery string + postCompleteQuery string cleanupQuery string } @@ -106,6 +108,8 @@ func TestLookupVindex(t *testing.T) { initQuery := "insert into t1 (c1, c2, val) values (1, 1, 'val1'), (2, 2, 'val2'), (3, 3, 'val3')" runningQuery := "insert into t1 (c1, c2, val) values (4, 4, 'val4'), (5, 5, 'val5'), (6, 6, 'val6')" postExternalizeQuery := "insert into t1 (c1, c2, val) values (7, 7, 'val7'), (8, 8, 'val8'), (9, 9, 'val9')" + postInternalizeQuery := "insert into t1 (c1, c2, val) values (10, 10, 'val10'), (11, 11, 'val11'), (12, 12, 'val12')" + postCompleteQuery := "insert into t1 (c1, c2, val) values (13, 13, 'val13'), (14, 14, 'val14'), (15, 15, 'val15')" cleanupQuery := "delete from t1" testCases := []lookupTestCase{ @@ -158,10 +162,43 @@ func TestLookupVindex(t *testing.T) { tc.initQuery = initQuery tc.runningQuery = runningQuery tc.postExternalizeQuery = postExternalizeQuery + tc.postInternalizeQuery = postInternalizeQuery + tc.postCompleteQuery = postCompleteQuery tc.cleanupQuery = cleanupQuery testLookupVindex(t, &tc) }) } + + for _, tc := range testCases { + // Modify the testcase name, here we cancel just after creating lookupvindex. + tc.name = tc.name + ", cancel" + t.Run(tc.name, func(t *testing.T) { + // Modify the name to avoid error on duplicate lookup vindex/table name. + tc.lv.name = tc.lv.name + "_cancel" + + tc.initQuery = initQuery + tc.runningQuery = runningQuery + tc.postCompleteQuery = postCompleteQuery + tc.cleanupQuery = cleanupQuery + testLookupVindexCancel(t, &tc) + }) + } + + for _, tc := range testCases { + // Modify the testcase name, here we cancel just after externalizing lookupvindex. + tc.name = tc.name + ", externalize and cancel" + t.Run(tc.name, func(t *testing.T) { + // Modify the name to avoid error on duplicate lookup vindex/table name. + tc.lv.name = tc.lv.name + "_externalize_cancel" + + tc.initQuery = initQuery + tc.runningQuery = runningQuery + tc.postExternalizeQuery = postExternalizeQuery + tc.postCompleteQuery = postCompleteQuery + tc.cleanupQuery = cleanupQuery + testLookupVindexCancelAfterExternalize(t, &tc) + }) + } } func testLookupVindex(t *testing.T, tc *lookupTestCase) { @@ -196,6 +233,114 @@ func testLookupVindex(t *testing.T, tc *lookupTestCase) { waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) }) + t.Run("internalize", func(t *testing.T) { + tc.lv.internalize() + totalRows += getNumRowsInQuery(t, tc.postInternalizeQuery) + _, err := vtgateConn.ExecuteFetch(tc.postInternalizeQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("externalize after internalize", func(t *testing.T) { + tc.lv.externalize() + }) + + t.Run("complete", func(t *testing.T) { + tc.lv.complete() + totalRows += getNumRowsInQuery(t, tc.postCompleteQuery) + _, err := vtgateConn.ExecuteFetch(tc.postCompleteQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("cleanup", func(t *testing.T) { + _, err := vtgateConn.ExecuteFetch(tc.cleanupQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, 0) + }) +} + +func testLookupVindexCancel(t *testing.T, tc *lookupTestCase) { + vtgateConn, cancel := getVTGateConn() + defer cancel() + var totalRows int + lv := tc.lv + + t.Run("init data", func(t *testing.T) { + totalRows += getNumRowsInQuery(t, tc.initQuery) + _, err := vtgateConn.ExecuteFetch(tc.initQuery, 1000, false) + require.NoError(t, err) + }) + + t.Run("create", func(t *testing.T) { + tc.lv.create() + lks := lv.tableKeyspace + vindexName := lv.name + waitForRowCount(t, vtgateConn, lks, vindexName, totalRows) + totalRows += getNumRowsInQuery(t, tc.runningQuery) + _, err := vtgateConn.ExecuteFetch(tc.runningQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("cancel", func(t *testing.T) { + tc.lv.cancel() + // Expect true as we cancelled the LookupVindex before externalizing. + lv.expectParamsAndOwner(true) + totalRows += getNumRowsInQuery(t, tc.postCompleteQuery) + _, err := vtgateConn.ExecuteFetch(tc.postCompleteQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("cleanup", func(t *testing.T) { + _, err := vtgateConn.ExecuteFetch(tc.cleanupQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, 0) + }) +} + +func testLookupVindexCancelAfterExternalize(t *testing.T, tc *lookupTestCase) { + vtgateConn, cancel := getVTGateConn() + defer cancel() + var totalRows int + lv := tc.lv + + t.Run("init data", func(t *testing.T) { + totalRows += getNumRowsInQuery(t, tc.initQuery) + _, err := vtgateConn.ExecuteFetch(tc.initQuery, 1000, false) + require.NoError(t, err) + }) + + t.Run("create", func(t *testing.T) { + tc.lv.create() + lks := lv.tableKeyspace + vindexName := lv.name + waitForRowCount(t, vtgateConn, lks, vindexName, totalRows) + totalRows += getNumRowsInQuery(t, tc.runningQuery) + _, err := vtgateConn.ExecuteFetch(tc.runningQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("externalize", func(t *testing.T) { + tc.lv.externalize() + totalRows += getNumRowsInQuery(t, tc.postExternalizeQuery) + _, err := vtgateConn.ExecuteFetch(tc.postExternalizeQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + + t.Run("cancel", func(t *testing.T) { + tc.lv.cancel() + // Expect false as we cancelled the LookupVindex after externalizing. + lv.expectParamsAndOwner(false) + totalRows += getNumRowsInQuery(t, tc.postCompleteQuery) + _, err := vtgateConn.ExecuteFetch(tc.postCompleteQuery, 1000, false) + require.NoError(t, err) + waitForRowCount(t, vtgateConn, tc.lv.ownerTableKeyspace, lv.name, totalRows) + }) + t.Run("cleanup", func(t *testing.T) { _, err := vtgateConn.ExecuteFetch(tc.cleanupQuery, 1000, false) require.NoError(t, err) diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 72888604c2e..617e5f79f6a 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -417,6 +417,14 @@ func testVreplicationWorkflows(t *testing.T, limited bool, binlogRowImage string vdx = gjson.Get(customerVSchema, fmt.Sprintf("vindexes.%s", vindexName)) require.NotNil(t, vdx, "lookup vindex %s not found", vindexName) require.NotEqual(t, "true", vdx.Get("params.write_only").String(), "did not expect write_only parameter to be true") + + err = vc.VtctldClient.ExecuteCommand("LookupVindex", "--name", vindexName, "--table-keyspace=product", "internalize", "--keyspace=customer") + require.NoError(t, err, "error executing LookupVindex internalize: %v", err) + customerVSchema, err = vc.VtctldClient.ExecuteCommandWithOutput("GetVSchema", "customer") + require.NoError(t, err, "error executing GetVSchema: %v", err) + vdx = gjson.Get(customerVSchema, fmt.Sprintf("vindexes.%s", vindexName)) + require.NotNil(t, vdx, "lookup vindex %s not found", vindexName) + require.Equal(t, "true", vdx.Get("params.write_only").String(), "expected write_only parameter to be true") }) } diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 36ad09547f1..459891da850 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -6839,6 +6839,7 @@ type UpdateVReplicationWorkflowRequest struct { OnDdl *binlogdata.OnDDLAction `protobuf:"varint,5,opt,name=on_ddl,json=onDdl,proto3,enum=binlogdata.OnDDLAction,oneof" json:"on_ddl,omitempty"` State *binlogdata.VReplicationWorkflowState `protobuf:"varint,6,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState,oneof" json:"state,omitempty"` ConfigOverrides map[string]string `protobuf:"bytes,8,rep,name=config_overrides,json=configOverrides,proto3" json:"config_overrides,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Message *string `protobuf:"bytes,9,opt,name=message,proto3,oneof" json:"message,omitempty"` } func (x *UpdateVReplicationWorkflowRequest) Reset() { @@ -6920,6 +6921,13 @@ func (x *UpdateVReplicationWorkflowRequest) GetConfigOverrides() map[string]stri return nil } +func (x *UpdateVReplicationWorkflowRequest) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + type UpdateVReplicationWorkflowResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9024,7 +9032,7 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xed, 0x04, 0x0a, 0x21, 0x55, + 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x98, 0x05, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, @@ -9055,285 +9063,288 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, - 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, - 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, - 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1e, + 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, + 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, - 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, - 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, - 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, - 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x40, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, + 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, + 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, + 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, + 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9f, + 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, + 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x10, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, + 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, + 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, + 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, - 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, - 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, - 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, - 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, - 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, - 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, + 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, + 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, + 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, + 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x50, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, + 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xad, + 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, + 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 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, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, - 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, - 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x6b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, + 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, - 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, - 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, - 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, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x1a, + 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, 0x0a, - 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, - 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, - 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, - 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, - 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, - 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, - 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, - 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, - 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x16, + 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45, + 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x50, 0x5f, 0x44, 0x45, + 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x42, 0x30, + 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go index eaedd9c4bc7..6db06374713 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go @@ -2632,6 +2632,10 @@ func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflo } r.ConfigOverrides = tmpContainer } + if rhs := m.Message; rhs != nil { + tmpVal := *rhs + r.Message = &tmpVal + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -9451,6 +9455,13 @@ func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Message != nil { + i -= len(*m.Message) + copy(dAtA[i:], *m.Message) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(*m.Message))) + i-- + dAtA[i] = 0x4a + } if len(m.ConfigOverrides) > 0 { for k := range m.ConfigOverrides { v := m.ConfigOverrides[k] @@ -12901,6 +12912,10 @@ func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -27822,6 +27837,39 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } m.ConfigOverrides[mapkey] = mapvalue iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index 98a791e9534..1ba227db405 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -8541,6 +8541,106 @@ func (x *LaunchSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint return nil } +type LookupVindexCompleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Where the lookup vindex lives. + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + // This is the name of the lookup vindex and the vreplication workflow. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Where the vreplication workflow lives. + TableKeyspace string `protobuf:"bytes,3,opt,name=table_keyspace,json=tableKeyspace,proto3" json:"table_keyspace,omitempty"` +} + +func (x *LookupVindexCompleteRequest) Reset() { + *x = LookupVindexCompleteRequest{} + mi := &file_vtctldata_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupVindexCompleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupVindexCompleteRequest) ProtoMessage() {} + +func (x *LookupVindexCompleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[136] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupVindexCompleteRequest.ProtoReflect.Descriptor instead. +func (*LookupVindexCompleteRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{136} +} + +func (x *LookupVindexCompleteRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *LookupVindexCompleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *LookupVindexCompleteRequest) GetTableKeyspace() string { + if x != nil { + return x.TableKeyspace + } + return "" +} + +type LookupVindexCompleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *LookupVindexCompleteResponse) Reset() { + *x = LookupVindexCompleteResponse{} + mi := &file_vtctldata_proto_msgTypes[137] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupVindexCompleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupVindexCompleteResponse) ProtoMessage() {} + +func (x *LookupVindexCompleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[137] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupVindexCompleteResponse.ProtoReflect.Descriptor instead. +func (*LookupVindexCompleteResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{137} +} + type LookupVindexCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8557,7 +8657,7 @@ type LookupVindexCreateRequest struct { func (x *LookupVindexCreateRequest) Reset() { *x = LookupVindexCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8569,7 +8669,7 @@ func (x *LookupVindexCreateRequest) String() string { func (*LookupVindexCreateRequest) ProtoMessage() {} func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8582,7 +8682,7 @@ func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateRequest.ProtoReflect.Descriptor instead. func (*LookupVindexCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{136} + return file_vtctldata_proto_rawDescGZIP(), []int{138} } func (x *LookupVindexCreateRequest) GetKeyspace() string { @@ -8642,7 +8742,7 @@ type LookupVindexCreateResponse struct { func (x *LookupVindexCreateResponse) Reset() { *x = LookupVindexCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8654,7 +8754,7 @@ func (x *LookupVindexCreateResponse) String() string { func (*LookupVindexCreateResponse) ProtoMessage() {} func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8667,7 +8767,7 @@ func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateResponse.ProtoReflect.Descriptor instead. func (*LookupVindexCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{137} + return file_vtctldata_proto_rawDescGZIP(), []int{139} } type LookupVindexExternalizeRequest struct { @@ -8681,11 +8781,14 @@ type LookupVindexExternalizeRequest struct { Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Where the vreplication workflow lives. TableKeyspace string `protobuf:"bytes,3,opt,name=table_keyspace,json=tableKeyspace,proto3" json:"table_keyspace,omitempty"` + // If this is set true, we directly delete the workflow instead of stopping. + // Also, complete command is not required to delete workflow in that case. + DeleteWorkflow bool `protobuf:"varint,4,opt,name=delete_workflow,json=deleteWorkflow,proto3" json:"delete_workflow,omitempty"` } func (x *LookupVindexExternalizeRequest) Reset() { *x = LookupVindexExternalizeRequest{} - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8697,7 +8800,7 @@ func (x *LookupVindexExternalizeRequest) String() string { func (*LookupVindexExternalizeRequest) ProtoMessage() {} func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8710,7 +8813,7 @@ func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeRequest.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{138} + return file_vtctldata_proto_rawDescGZIP(), []int{140} } func (x *LookupVindexExternalizeRequest) GetKeyspace() string { @@ -8734,18 +8837,27 @@ func (x *LookupVindexExternalizeRequest) GetTableKeyspace() string { return "" } +func (x *LookupVindexExternalizeRequest) GetDeleteWorkflow() bool { + if x != nil { + return x.DeleteWorkflow + } + return false +} + type LookupVindexExternalizeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Was the workflow also deleted. - WorkflowDeleted bool `protobuf:"varint,1,opt,name=workflow_deleted,json=workflowDeleted,proto3" json:"workflow_deleted,omitempty"` + // Was the workflow stopped. + WorkflowStopped bool `protobuf:"varint,1,opt,name=workflow_stopped,json=workflowStopped,proto3" json:"workflow_stopped,omitempty"` + // Was the workflow deleted. + WorkflowDeleted bool `protobuf:"varint,2,opt,name=workflow_deleted,json=workflowDeleted,proto3" json:"workflow_deleted,omitempty"` } func (x *LookupVindexExternalizeResponse) Reset() { *x = LookupVindexExternalizeResponse{} - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8757,7 +8869,7 @@ func (x *LookupVindexExternalizeResponse) String() string { func (*LookupVindexExternalizeResponse) ProtoMessage() {} func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8770,7 +8882,14 @@ func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeResponse.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{139} + return file_vtctldata_proto_rawDescGZIP(), []int{141} +} + +func (x *LookupVindexExternalizeResponse) GetWorkflowStopped() bool { + if x != nil { + return x.WorkflowStopped + } + return false } func (x *LookupVindexExternalizeResponse) GetWorkflowDeleted() bool { @@ -8780,6 +8899,106 @@ func (x *LookupVindexExternalizeResponse) GetWorkflowDeleted() bool { return false } +type LookupVindexInternalizeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Where the lookup vindex lives. + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + // This is the name of the lookup vindex and the vreplication workflow. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Where the vreplication workflow lives. + TableKeyspace string `protobuf:"bytes,3,opt,name=table_keyspace,json=tableKeyspace,proto3" json:"table_keyspace,omitempty"` +} + +func (x *LookupVindexInternalizeRequest) Reset() { + *x = LookupVindexInternalizeRequest{} + mi := &file_vtctldata_proto_msgTypes[142] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupVindexInternalizeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupVindexInternalizeRequest) ProtoMessage() {} + +func (x *LookupVindexInternalizeRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[142] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupVindexInternalizeRequest.ProtoReflect.Descriptor instead. +func (*LookupVindexInternalizeRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{142} +} + +func (x *LookupVindexInternalizeRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *LookupVindexInternalizeRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *LookupVindexInternalizeRequest) GetTableKeyspace() string { + if x != nil { + return x.TableKeyspace + } + return "" +} + +type LookupVindexInternalizeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *LookupVindexInternalizeResponse) Reset() { + *x = LookupVindexInternalizeResponse{} + mi := &file_vtctldata_proto_msgTypes[143] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LookupVindexInternalizeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LookupVindexInternalizeResponse) ProtoMessage() {} + +func (x *LookupVindexInternalizeResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[143] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LookupVindexInternalizeResponse.ProtoReflect.Descriptor instead. +func (*LookupVindexInternalizeResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{143} +} + type MaterializeCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8790,7 +9009,7 @@ type MaterializeCreateRequest struct { func (x *MaterializeCreateRequest) Reset() { *x = MaterializeCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8802,7 +9021,7 @@ func (x *MaterializeCreateRequest) String() string { func (*MaterializeCreateRequest) ProtoMessage() {} func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8815,7 +9034,7 @@ func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateRequest.ProtoReflect.Descriptor instead. func (*MaterializeCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{140} + return file_vtctldata_proto_rawDescGZIP(), []int{144} } func (x *MaterializeCreateRequest) GetSettings() *MaterializeSettings { @@ -8833,7 +9052,7 @@ type MaterializeCreateResponse struct { func (x *MaterializeCreateResponse) Reset() { *x = MaterializeCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8845,7 +9064,7 @@ func (x *MaterializeCreateResponse) String() string { func (*MaterializeCreateResponse) ProtoMessage() {} func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8858,7 +9077,7 @@ func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateResponse.ProtoReflect.Descriptor instead. func (*MaterializeCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{141} + return file_vtctldata_proto_rawDescGZIP(), []int{145} } type MigrateCreateRequest struct { @@ -8896,7 +9115,7 @@ type MigrateCreateRequest struct { func (x *MigrateCreateRequest) Reset() { *x = MigrateCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8908,7 +9127,7 @@ func (x *MigrateCreateRequest) String() string { func (*MigrateCreateRequest) ProtoMessage() {} func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8921,7 +9140,7 @@ func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCreateRequest.ProtoReflect.Descriptor instead. func (*MigrateCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{142} + return file_vtctldata_proto_rawDescGZIP(), []int{146} } func (x *MigrateCreateRequest) GetWorkflow() string { @@ -9058,7 +9277,7 @@ type MigrateCompleteRequest struct { func (x *MigrateCompleteRequest) Reset() { *x = MigrateCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9070,7 +9289,7 @@ func (x *MigrateCompleteRequest) String() string { func (*MigrateCompleteRequest) ProtoMessage() {} func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9083,7 +9302,7 @@ func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteRequest.ProtoReflect.Descriptor instead. func (*MigrateCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{143} + return file_vtctldata_proto_rawDescGZIP(), []int{147} } func (x *MigrateCompleteRequest) GetWorkflow() string { @@ -9139,7 +9358,7 @@ type MigrateCompleteResponse struct { func (x *MigrateCompleteResponse) Reset() { *x = MigrateCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9151,7 +9370,7 @@ func (x *MigrateCompleteResponse) String() string { func (*MigrateCompleteResponse) ProtoMessage() {} func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9164,7 +9383,7 @@ func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteResponse.ProtoReflect.Descriptor instead. func (*MigrateCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{144} + return file_vtctldata_proto_rawDescGZIP(), []int{148} } func (x *MigrateCompleteResponse) GetSummary() string { @@ -9194,7 +9413,7 @@ type MountRegisterRequest struct { func (x *MountRegisterRequest) Reset() { *x = MountRegisterRequest{} - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9206,7 +9425,7 @@ func (x *MountRegisterRequest) String() string { func (*MountRegisterRequest) ProtoMessage() {} func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9219,7 +9438,7 @@ func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterRequest.ProtoReflect.Descriptor instead. func (*MountRegisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{145} + return file_vtctldata_proto_rawDescGZIP(), []int{149} } func (x *MountRegisterRequest) GetTopoType() string { @@ -9258,7 +9477,7 @@ type MountRegisterResponse struct { func (x *MountRegisterResponse) Reset() { *x = MountRegisterResponse{} - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9270,7 +9489,7 @@ func (x *MountRegisterResponse) String() string { func (*MountRegisterResponse) ProtoMessage() {} func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9283,7 +9502,7 @@ func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterResponse.ProtoReflect.Descriptor instead. func (*MountRegisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{146} + return file_vtctldata_proto_rawDescGZIP(), []int{150} } type MountUnregisterRequest struct { @@ -9296,7 +9515,7 @@ type MountUnregisterRequest struct { func (x *MountUnregisterRequest) Reset() { *x = MountUnregisterRequest{} - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9308,7 +9527,7 @@ func (x *MountUnregisterRequest) String() string { func (*MountUnregisterRequest) ProtoMessage() {} func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9321,7 +9540,7 @@ func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterRequest.ProtoReflect.Descriptor instead. func (*MountUnregisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{147} + return file_vtctldata_proto_rawDescGZIP(), []int{151} } func (x *MountUnregisterRequest) GetName() string { @@ -9339,7 +9558,7 @@ type MountUnregisterResponse struct { func (x *MountUnregisterResponse) Reset() { *x = MountUnregisterResponse{} - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9351,7 +9570,7 @@ func (x *MountUnregisterResponse) String() string { func (*MountUnregisterResponse) ProtoMessage() {} func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9364,7 +9583,7 @@ func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterResponse.ProtoReflect.Descriptor instead. func (*MountUnregisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{148} + return file_vtctldata_proto_rawDescGZIP(), []int{152} } type MountShowRequest struct { @@ -9377,7 +9596,7 @@ type MountShowRequest struct { func (x *MountShowRequest) Reset() { *x = MountShowRequest{} - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9389,7 +9608,7 @@ func (x *MountShowRequest) String() string { func (*MountShowRequest) ProtoMessage() {} func (x *MountShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9402,7 +9621,7 @@ func (x *MountShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowRequest.ProtoReflect.Descriptor instead. func (*MountShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{149} + return file_vtctldata_proto_rawDescGZIP(), []int{153} } func (x *MountShowRequest) GetName() string { @@ -9425,7 +9644,7 @@ type MountShowResponse struct { func (x *MountShowResponse) Reset() { *x = MountShowResponse{} - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9437,7 +9656,7 @@ func (x *MountShowResponse) String() string { func (*MountShowResponse) ProtoMessage() {} func (x *MountShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9450,7 +9669,7 @@ func (x *MountShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowResponse.ProtoReflect.Descriptor instead. func (*MountShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{150} + return file_vtctldata_proto_rawDescGZIP(), []int{154} } func (x *MountShowResponse) GetTopoType() string { @@ -9489,7 +9708,7 @@ type MountListRequest struct { func (x *MountListRequest) Reset() { *x = MountListRequest{} - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9501,7 +9720,7 @@ func (x *MountListRequest) String() string { func (*MountListRequest) ProtoMessage() {} func (x *MountListRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9514,7 +9733,7 @@ func (x *MountListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListRequest.ProtoReflect.Descriptor instead. func (*MountListRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{151} + return file_vtctldata_proto_rawDescGZIP(), []int{155} } type MountListResponse struct { @@ -9527,7 +9746,7 @@ type MountListResponse struct { func (x *MountListResponse) Reset() { *x = MountListResponse{} - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9539,7 +9758,7 @@ func (x *MountListResponse) String() string { func (*MountListResponse) ProtoMessage() {} func (x *MountListResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9552,7 +9771,7 @@ func (x *MountListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListResponse.ProtoReflect.Descriptor instead. func (*MountListResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152} + return file_vtctldata_proto_rawDescGZIP(), []int{156} } func (x *MountListResponse) GetNames() []string { @@ -9602,7 +9821,7 @@ type MoveTablesCreateRequest struct { func (x *MoveTablesCreateRequest) Reset() { *x = MoveTablesCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9614,7 +9833,7 @@ func (x *MoveTablesCreateRequest) String() string { func (*MoveTablesCreateRequest) ProtoMessage() {} func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9627,7 +9846,7 @@ func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{153} + return file_vtctldata_proto_rawDescGZIP(), []int{157} } func (x *MoveTablesCreateRequest) GetWorkflow() string { @@ -9781,7 +10000,7 @@ type MoveTablesCreateResponse struct { func (x *MoveTablesCreateResponse) Reset() { *x = MoveTablesCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9793,7 +10012,7 @@ func (x *MoveTablesCreateResponse) String() string { func (*MoveTablesCreateResponse) ProtoMessage() {} func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9806,7 +10025,7 @@ func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{154} + return file_vtctldata_proto_rawDescGZIP(), []int{158} } func (x *MoveTablesCreateResponse) GetSummary() string { @@ -9839,7 +10058,7 @@ type MoveTablesCompleteRequest struct { func (x *MoveTablesCompleteRequest) Reset() { *x = MoveTablesCompleteRequest{} - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9851,7 +10070,7 @@ func (x *MoveTablesCompleteRequest) String() string { func (*MoveTablesCompleteRequest) ProtoMessage() {} func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9864,7 +10083,7 @@ func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{155} + return file_vtctldata_proto_rawDescGZIP(), []int{159} } func (x *MoveTablesCompleteRequest) GetWorkflow() string { @@ -9927,7 +10146,7 @@ type MoveTablesCompleteResponse struct { func (x *MoveTablesCompleteResponse) Reset() { *x = MoveTablesCompleteResponse{} - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9939,7 +10158,7 @@ func (x *MoveTablesCompleteResponse) String() string { func (*MoveTablesCompleteResponse) ProtoMessage() {} func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9952,7 +10171,7 @@ func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{156} + return file_vtctldata_proto_rawDescGZIP(), []int{160} } func (x *MoveTablesCompleteResponse) GetSummary() string { @@ -9979,7 +10198,7 @@ type PingTabletRequest struct { func (x *PingTabletRequest) Reset() { *x = PingTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9991,7 +10210,7 @@ func (x *PingTabletRequest) String() string { func (*PingTabletRequest) ProtoMessage() {} func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10004,7 +10223,7 @@ func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. func (*PingTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{157} + return file_vtctldata_proto_rawDescGZIP(), []int{161} } func (x *PingTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10022,7 +10241,7 @@ type PingTabletResponse struct { func (x *PingTabletResponse) Reset() { *x = PingTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10034,7 +10253,7 @@ func (x *PingTabletResponse) String() string { func (*PingTabletResponse) ProtoMessage() {} func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10047,7 +10266,7 @@ func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. func (*PingTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{158} + return file_vtctldata_proto_rawDescGZIP(), []int{162} } type PlannedReparentShardRequest struct { @@ -10090,7 +10309,7 @@ type PlannedReparentShardRequest struct { func (x *PlannedReparentShardRequest) Reset() { *x = PlannedReparentShardRequest{} - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10102,7 +10321,7 @@ func (x *PlannedReparentShardRequest) String() string { func (*PlannedReparentShardRequest) ProtoMessage() {} func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10115,7 +10334,7 @@ func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardRequest.ProtoReflect.Descriptor instead. func (*PlannedReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{159} + return file_vtctldata_proto_rawDescGZIP(), []int{163} } func (x *PlannedReparentShardRequest) GetKeyspace() string { @@ -10193,7 +10412,7 @@ type PlannedReparentShardResponse struct { func (x *PlannedReparentShardResponse) Reset() { *x = PlannedReparentShardResponse{} - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10205,7 +10424,7 @@ func (x *PlannedReparentShardResponse) String() string { func (*PlannedReparentShardResponse) ProtoMessage() {} func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10218,7 +10437,7 @@ func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardResponse.ProtoReflect.Descriptor instead. func (*PlannedReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{160} + return file_vtctldata_proto_rawDescGZIP(), []int{164} } func (x *PlannedReparentShardResponse) GetKeyspace() string { @@ -10263,7 +10482,7 @@ type RebuildKeyspaceGraphRequest struct { func (x *RebuildKeyspaceGraphRequest) Reset() { *x = RebuildKeyspaceGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10275,7 +10494,7 @@ func (x *RebuildKeyspaceGraphRequest) String() string { func (*RebuildKeyspaceGraphRequest) ProtoMessage() {} func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10288,7 +10507,7 @@ func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{161} + return file_vtctldata_proto_rawDescGZIP(), []int{165} } func (x *RebuildKeyspaceGraphRequest) GetKeyspace() string { @@ -10320,7 +10539,7 @@ type RebuildKeyspaceGraphResponse struct { func (x *RebuildKeyspaceGraphResponse) Reset() { *x = RebuildKeyspaceGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10332,7 +10551,7 @@ func (x *RebuildKeyspaceGraphResponse) String() string { func (*RebuildKeyspaceGraphResponse) ProtoMessage() {} func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10345,7 +10564,7 @@ func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{162} + return file_vtctldata_proto_rawDescGZIP(), []int{166} } type RebuildVSchemaGraphRequest struct { @@ -10360,7 +10579,7 @@ type RebuildVSchemaGraphRequest struct { func (x *RebuildVSchemaGraphRequest) Reset() { *x = RebuildVSchemaGraphRequest{} - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10372,7 +10591,7 @@ func (x *RebuildVSchemaGraphRequest) String() string { func (*RebuildVSchemaGraphRequest) ProtoMessage() {} func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10385,7 +10604,7 @@ func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{163} + return file_vtctldata_proto_rawDescGZIP(), []int{167} } func (x *RebuildVSchemaGraphRequest) GetCells() []string { @@ -10403,7 +10622,7 @@ type RebuildVSchemaGraphResponse struct { func (x *RebuildVSchemaGraphResponse) Reset() { *x = RebuildVSchemaGraphResponse{} - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10415,7 +10634,7 @@ func (x *RebuildVSchemaGraphResponse) String() string { func (*RebuildVSchemaGraphResponse) ProtoMessage() {} func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[168] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10428,7 +10647,7 @@ func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{164} + return file_vtctldata_proto_rawDescGZIP(), []int{168} } type RefreshStateRequest struct { @@ -10441,7 +10660,7 @@ type RefreshStateRequest struct { func (x *RefreshStateRequest) Reset() { *x = RefreshStateRequest{} - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10453,7 +10672,7 @@ func (x *RefreshStateRequest) String() string { func (*RefreshStateRequest) ProtoMessage() {} func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10466,7 +10685,7 @@ func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateRequest.ProtoReflect.Descriptor instead. func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{165} + return file_vtctldata_proto_rawDescGZIP(), []int{169} } func (x *RefreshStateRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10484,7 +10703,7 @@ type RefreshStateResponse struct { func (x *RefreshStateResponse) Reset() { *x = RefreshStateResponse{} - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10496,7 +10715,7 @@ func (x *RefreshStateResponse) String() string { func (*RefreshStateResponse) ProtoMessage() {} func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[170] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10509,7 +10728,7 @@ func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateResponse.ProtoReflect.Descriptor instead. func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{166} + return file_vtctldata_proto_rawDescGZIP(), []int{170} } type RefreshStateByShardRequest struct { @@ -10524,7 +10743,7 @@ type RefreshStateByShardRequest struct { func (x *RefreshStateByShardRequest) Reset() { *x = RefreshStateByShardRequest{} - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10536,7 +10755,7 @@ func (x *RefreshStateByShardRequest) String() string { func (*RefreshStateByShardRequest) ProtoMessage() {} func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[171] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10549,7 +10768,7 @@ func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardRequest.ProtoReflect.Descriptor instead. func (*RefreshStateByShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{167} + return file_vtctldata_proto_rawDescGZIP(), []int{171} } func (x *RefreshStateByShardRequest) GetKeyspace() string { @@ -10585,7 +10804,7 @@ type RefreshStateByShardResponse struct { func (x *RefreshStateByShardResponse) Reset() { *x = RefreshStateByShardResponse{} - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10597,7 +10816,7 @@ func (x *RefreshStateByShardResponse) String() string { func (*RefreshStateByShardResponse) ProtoMessage() {} func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10610,7 +10829,7 @@ func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardResponse.ProtoReflect.Descriptor instead. func (*RefreshStateByShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{168} + return file_vtctldata_proto_rawDescGZIP(), []int{172} } func (x *RefreshStateByShardResponse) GetIsPartialRefresh() bool { @@ -10637,7 +10856,7 @@ type ReloadSchemaRequest struct { func (x *ReloadSchemaRequest) Reset() { *x = ReloadSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10649,7 +10868,7 @@ func (x *ReloadSchemaRequest) String() string { func (*ReloadSchemaRequest) ProtoMessage() {} func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10662,7 +10881,7 @@ func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{169} + return file_vtctldata_proto_rawDescGZIP(), []int{173} } func (x *ReloadSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10680,7 +10899,7 @@ type ReloadSchemaResponse struct { func (x *ReloadSchemaResponse) Reset() { *x = ReloadSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10692,7 +10911,7 @@ func (x *ReloadSchemaResponse) String() string { func (*ReloadSchemaResponse) ProtoMessage() {} func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[174] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10705,7 +10924,7 @@ func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{170} + return file_vtctldata_proto_rawDescGZIP(), []int{174} } type ReloadSchemaKeyspaceRequest struct { @@ -10724,7 +10943,7 @@ type ReloadSchemaKeyspaceRequest struct { func (x *ReloadSchemaKeyspaceRequest) Reset() { *x = ReloadSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10736,7 +10955,7 @@ func (x *ReloadSchemaKeyspaceRequest) String() string { func (*ReloadSchemaKeyspaceRequest) ProtoMessage() {} func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10749,7 +10968,7 @@ func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{171} + return file_vtctldata_proto_rawDescGZIP(), []int{175} } func (x *ReloadSchemaKeyspaceRequest) GetKeyspace() string { @@ -10790,7 +11009,7 @@ type ReloadSchemaKeyspaceResponse struct { func (x *ReloadSchemaKeyspaceResponse) Reset() { *x = ReloadSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10802,7 +11021,7 @@ func (x *ReloadSchemaKeyspaceResponse) String() string { func (*ReloadSchemaKeyspaceResponse) ProtoMessage() {} func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10815,7 +11034,7 @@ func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{172} + return file_vtctldata_proto_rawDescGZIP(), []int{176} } func (x *ReloadSchemaKeyspaceResponse) GetEvents() []*logutil.Event { @@ -10840,7 +11059,7 @@ type ReloadSchemaShardRequest struct { func (x *ReloadSchemaShardRequest) Reset() { *x = ReloadSchemaShardRequest{} - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10852,7 +11071,7 @@ func (x *ReloadSchemaShardRequest) String() string { func (*ReloadSchemaShardRequest) ProtoMessage() {} func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10865,7 +11084,7 @@ func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{173} + return file_vtctldata_proto_rawDescGZIP(), []int{177} } func (x *ReloadSchemaShardRequest) GetKeyspace() string { @@ -10913,7 +11132,7 @@ type ReloadSchemaShardResponse struct { func (x *ReloadSchemaShardResponse) Reset() { *x = ReloadSchemaShardResponse{} - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10925,7 +11144,7 @@ func (x *ReloadSchemaShardResponse) String() string { func (*ReloadSchemaShardResponse) ProtoMessage() {} func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10938,7 +11157,7 @@ func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{174} + return file_vtctldata_proto_rawDescGZIP(), []int{178} } func (x *ReloadSchemaShardResponse) GetEvents() []*logutil.Event { @@ -10960,7 +11179,7 @@ type RemoveBackupRequest struct { func (x *RemoveBackupRequest) Reset() { *x = RemoveBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10972,7 +11191,7 @@ func (x *RemoveBackupRequest) String() string { func (*RemoveBackupRequest) ProtoMessage() {} func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10985,7 +11204,7 @@ func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupRequest.ProtoReflect.Descriptor instead. func (*RemoveBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{175} + return file_vtctldata_proto_rawDescGZIP(), []int{179} } func (x *RemoveBackupRequest) GetKeyspace() string { @@ -11017,7 +11236,7 @@ type RemoveBackupResponse struct { func (x *RemoveBackupResponse) Reset() { *x = RemoveBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11029,7 +11248,7 @@ func (x *RemoveBackupResponse) String() string { func (*RemoveBackupResponse) ProtoMessage() {} func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11042,7 +11261,7 @@ func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupResponse.ProtoReflect.Descriptor instead. func (*RemoveBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{176} + return file_vtctldata_proto_rawDescGZIP(), []int{180} } type RemoveKeyspaceCellRequest struct { @@ -11063,7 +11282,7 @@ type RemoveKeyspaceCellRequest struct { func (x *RemoveKeyspaceCellRequest) Reset() { *x = RemoveKeyspaceCellRequest{} - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11075,7 +11294,7 @@ func (x *RemoveKeyspaceCellRequest) String() string { func (*RemoveKeyspaceCellRequest) ProtoMessage() {} func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11088,7 +11307,7 @@ func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellRequest.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{177} + return file_vtctldata_proto_rawDescGZIP(), []int{181} } func (x *RemoveKeyspaceCellRequest) GetKeyspace() string { @@ -11127,7 +11346,7 @@ type RemoveKeyspaceCellResponse struct { func (x *RemoveKeyspaceCellResponse) Reset() { *x = RemoveKeyspaceCellResponse{} - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11139,7 +11358,7 @@ func (x *RemoveKeyspaceCellResponse) String() string { func (*RemoveKeyspaceCellResponse) ProtoMessage() {} func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11152,7 +11371,7 @@ func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellResponse.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{178} + return file_vtctldata_proto_rawDescGZIP(), []int{182} } type RemoveShardCellRequest struct { @@ -11174,7 +11393,7 @@ type RemoveShardCellRequest struct { func (x *RemoveShardCellRequest) Reset() { *x = RemoveShardCellRequest{} - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11186,7 +11405,7 @@ func (x *RemoveShardCellRequest) String() string { func (*RemoveShardCellRequest) ProtoMessage() {} func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11199,7 +11418,7 @@ func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellRequest.ProtoReflect.Descriptor instead. func (*RemoveShardCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{179} + return file_vtctldata_proto_rawDescGZIP(), []int{183} } func (x *RemoveShardCellRequest) GetKeyspace() string { @@ -11245,7 +11464,7 @@ type RemoveShardCellResponse struct { func (x *RemoveShardCellResponse) Reset() { *x = RemoveShardCellResponse{} - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11257,7 +11476,7 @@ func (x *RemoveShardCellResponse) String() string { func (*RemoveShardCellResponse) ProtoMessage() {} func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11270,7 +11489,7 @@ func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellResponse.ProtoReflect.Descriptor instead. func (*RemoveShardCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{180} + return file_vtctldata_proto_rawDescGZIP(), []int{184} } type ReparentTabletRequest struct { @@ -11285,7 +11504,7 @@ type ReparentTabletRequest struct { func (x *ReparentTabletRequest) Reset() { *x = ReparentTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11297,7 +11516,7 @@ func (x *ReparentTabletRequest) String() string { func (*ReparentTabletRequest) ProtoMessage() {} func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11310,7 +11529,7 @@ func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletRequest.ProtoReflect.Descriptor instead. func (*ReparentTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{181} + return file_vtctldata_proto_rawDescGZIP(), []int{185} } func (x *ReparentTabletRequest) GetTablet() *topodata.TabletAlias { @@ -11335,7 +11554,7 @@ type ReparentTabletResponse struct { func (x *ReparentTabletResponse) Reset() { *x = ReparentTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11347,7 +11566,7 @@ func (x *ReparentTabletResponse) String() string { func (*ReparentTabletResponse) ProtoMessage() {} func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11360,7 +11579,7 @@ func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletResponse.ProtoReflect.Descriptor instead. func (*ReparentTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{182} + return file_vtctldata_proto_rawDescGZIP(), []int{186} } func (x *ReparentTabletResponse) GetKeyspace() string { @@ -11412,7 +11631,7 @@ type ReshardCreateRequest struct { func (x *ReshardCreateRequest) Reset() { *x = ReshardCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11424,7 +11643,7 @@ func (x *ReshardCreateRequest) String() string { func (*ReshardCreateRequest) ProtoMessage() {} func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11437,7 +11656,7 @@ func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReshardCreateRequest.ProtoReflect.Descriptor instead. func (*ReshardCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{183} + return file_vtctldata_proto_rawDescGZIP(), []int{187} } func (x *ReshardCreateRequest) GetWorkflow() string { @@ -11555,7 +11774,7 @@ type RestoreFromBackupRequest struct { func (x *RestoreFromBackupRequest) Reset() { *x = RestoreFromBackupRequest{} - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11567,7 +11786,7 @@ func (x *RestoreFromBackupRequest) String() string { func (*RestoreFromBackupRequest) ProtoMessage() {} func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11580,7 +11799,7 @@ func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupRequest.ProtoReflect.Descriptor instead. func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{184} + return file_vtctldata_proto_rawDescGZIP(), []int{188} } func (x *RestoreFromBackupRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11639,7 +11858,7 @@ type RestoreFromBackupResponse struct { func (x *RestoreFromBackupResponse) Reset() { *x = RestoreFromBackupResponse{} - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11651,7 +11870,7 @@ func (x *RestoreFromBackupResponse) String() string { func (*RestoreFromBackupResponse) ProtoMessage() {} func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[189] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11664,7 +11883,7 @@ func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupResponse.ProtoReflect.Descriptor instead. func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{185} + return file_vtctldata_proto_rawDescGZIP(), []int{189} } func (x *RestoreFromBackupResponse) GetTabletAlias() *topodata.TabletAlias { @@ -11706,7 +11925,7 @@ type RetrySchemaMigrationRequest struct { func (x *RetrySchemaMigrationRequest) Reset() { *x = RetrySchemaMigrationRequest{} - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11718,7 +11937,7 @@ func (x *RetrySchemaMigrationRequest) String() string { func (*RetrySchemaMigrationRequest) ProtoMessage() {} func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11731,7 +11950,7 @@ func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{186} + return file_vtctldata_proto_rawDescGZIP(), []int{190} } func (x *RetrySchemaMigrationRequest) GetKeyspace() string { @@ -11758,7 +11977,7 @@ type RetrySchemaMigrationResponse struct { func (x *RetrySchemaMigrationResponse) Reset() { *x = RetrySchemaMigrationResponse{} - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11770,7 +11989,7 @@ func (x *RetrySchemaMigrationResponse) String() string { func (*RetrySchemaMigrationResponse) ProtoMessage() {} func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11783,7 +12002,7 @@ func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{187} + return file_vtctldata_proto_rawDescGZIP(), []int{191} } func (x *RetrySchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -11803,7 +12022,7 @@ type RunHealthCheckRequest struct { func (x *RunHealthCheckRequest) Reset() { *x = RunHealthCheckRequest{} - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11815,7 +12034,7 @@ func (x *RunHealthCheckRequest) String() string { func (*RunHealthCheckRequest) ProtoMessage() {} func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11828,7 +12047,7 @@ func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckRequest.ProtoReflect.Descriptor instead. func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{188} + return file_vtctldata_proto_rawDescGZIP(), []int{192} } func (x *RunHealthCheckRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11846,7 +12065,7 @@ type RunHealthCheckResponse struct { func (x *RunHealthCheckResponse) Reset() { *x = RunHealthCheckResponse{} - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11858,7 +12077,7 @@ func (x *RunHealthCheckResponse) String() string { func (*RunHealthCheckResponse) ProtoMessage() {} func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[193] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11871,7 +12090,7 @@ func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckResponse.ProtoReflect.Descriptor instead. func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{189} + return file_vtctldata_proto_rawDescGZIP(), []int{193} } type SetKeyspaceDurabilityPolicyRequest struct { @@ -11885,7 +12104,7 @@ type SetKeyspaceDurabilityPolicyRequest struct { func (x *SetKeyspaceDurabilityPolicyRequest) Reset() { *x = SetKeyspaceDurabilityPolicyRequest{} - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11897,7 +12116,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) String() string { func (*SetKeyspaceDurabilityPolicyRequest) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[194] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11910,7 +12129,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message // Deprecated: Use SetKeyspaceDurabilityPolicyRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{190} + return file_vtctldata_proto_rawDescGZIP(), []int{194} } func (x *SetKeyspaceDurabilityPolicyRequest) GetKeyspace() string { @@ -11938,7 +12157,7 @@ type SetKeyspaceDurabilityPolicyResponse struct { func (x *SetKeyspaceDurabilityPolicyResponse) Reset() { *x = SetKeyspaceDurabilityPolicyResponse{} - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11950,7 +12169,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) String() string { func (*SetKeyspaceDurabilityPolicyResponse) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[195] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11963,7 +12182,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use SetKeyspaceDurabilityPolicyResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{191} + return file_vtctldata_proto_rawDescGZIP(), []int{195} } func (x *SetKeyspaceDurabilityPolicyResponse) GetKeyspace() *topodata.Keyspace { @@ -11984,7 +12203,7 @@ type SetKeyspaceShardingInfoRequest struct { func (x *SetKeyspaceShardingInfoRequest) Reset() { *x = SetKeyspaceShardingInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11996,7 +12215,7 @@ func (x *SetKeyspaceShardingInfoRequest) String() string { func (*SetKeyspaceShardingInfoRequest) ProtoMessage() {} func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[196] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12009,7 +12228,7 @@ func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{192} + return file_vtctldata_proto_rawDescGZIP(), []int{196} } func (x *SetKeyspaceShardingInfoRequest) GetKeyspace() string { @@ -12037,7 +12256,7 @@ type SetKeyspaceShardingInfoResponse struct { func (x *SetKeyspaceShardingInfoResponse) Reset() { *x = SetKeyspaceShardingInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12049,7 +12268,7 @@ func (x *SetKeyspaceShardingInfoResponse) String() string { func (*SetKeyspaceShardingInfoResponse) ProtoMessage() {} func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[197] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12062,7 +12281,7 @@ func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{193} + return file_vtctldata_proto_rawDescGZIP(), []int{197} } func (x *SetKeyspaceShardingInfoResponse) GetKeyspace() *topodata.Keyspace { @@ -12084,7 +12303,7 @@ type SetShardIsPrimaryServingRequest struct { func (x *SetShardIsPrimaryServingRequest) Reset() { *x = SetShardIsPrimaryServingRequest{} - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12096,7 +12315,7 @@ func (x *SetShardIsPrimaryServingRequest) String() string { func (*SetShardIsPrimaryServingRequest) ProtoMessage() {} func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[198] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12109,7 +12328,7 @@ func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingRequest.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{194} + return file_vtctldata_proto_rawDescGZIP(), []int{198} } func (x *SetShardIsPrimaryServingRequest) GetKeyspace() string { @@ -12144,7 +12363,7 @@ type SetShardIsPrimaryServingResponse struct { func (x *SetShardIsPrimaryServingResponse) Reset() { *x = SetShardIsPrimaryServingResponse{} - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12156,7 +12375,7 @@ func (x *SetShardIsPrimaryServingResponse) String() string { func (*SetShardIsPrimaryServingResponse) ProtoMessage() {} func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[199] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12169,7 +12388,7 @@ func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingResponse.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{195} + return file_vtctldata_proto_rawDescGZIP(), []int{199} } func (x *SetShardIsPrimaryServingResponse) GetShard() *topodata.Shard { @@ -12209,7 +12428,7 @@ type SetShardTabletControlRequest struct { func (x *SetShardTabletControlRequest) Reset() { *x = SetShardTabletControlRequest{} - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12221,7 +12440,7 @@ func (x *SetShardTabletControlRequest) String() string { func (*SetShardTabletControlRequest) ProtoMessage() {} func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[200] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12234,7 +12453,7 @@ func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlRequest.ProtoReflect.Descriptor instead. func (*SetShardTabletControlRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{196} + return file_vtctldata_proto_rawDescGZIP(), []int{200} } func (x *SetShardTabletControlRequest) GetKeyspace() string { @@ -12297,7 +12516,7 @@ type SetShardTabletControlResponse struct { func (x *SetShardTabletControlResponse) Reset() { *x = SetShardTabletControlResponse{} - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12309,7 +12528,7 @@ func (x *SetShardTabletControlResponse) String() string { func (*SetShardTabletControlResponse) ProtoMessage() {} func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[201] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12322,7 +12541,7 @@ func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlResponse.ProtoReflect.Descriptor instead. func (*SetShardTabletControlResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{197} + return file_vtctldata_proto_rawDescGZIP(), []int{201} } func (x *SetShardTabletControlResponse) GetShard() *topodata.Shard { @@ -12343,7 +12562,7 @@ type SetWritableRequest struct { func (x *SetWritableRequest) Reset() { *x = SetWritableRequest{} - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12355,7 +12574,7 @@ func (x *SetWritableRequest) String() string { func (*SetWritableRequest) ProtoMessage() {} func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[202] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12368,7 +12587,7 @@ func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableRequest.ProtoReflect.Descriptor instead. func (*SetWritableRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{198} + return file_vtctldata_proto_rawDescGZIP(), []int{202} } func (x *SetWritableRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12393,7 +12612,7 @@ type SetWritableResponse struct { func (x *SetWritableResponse) Reset() { *x = SetWritableResponse{} - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12405,7 +12624,7 @@ func (x *SetWritableResponse) String() string { func (*SetWritableResponse) ProtoMessage() {} func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[203] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12418,7 +12637,7 @@ func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableResponse.ProtoReflect.Descriptor instead. func (*SetWritableResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{199} + return file_vtctldata_proto_rawDescGZIP(), []int{203} } type ShardReplicationAddRequest struct { @@ -12433,7 +12652,7 @@ type ShardReplicationAddRequest struct { func (x *ShardReplicationAddRequest) Reset() { *x = ShardReplicationAddRequest{} - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12445,7 +12664,7 @@ func (x *ShardReplicationAddRequest) String() string { func (*ShardReplicationAddRequest) ProtoMessage() {} func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[204] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12458,7 +12677,7 @@ func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{200} + return file_vtctldata_proto_rawDescGZIP(), []int{204} } func (x *ShardReplicationAddRequest) GetKeyspace() string { @@ -12490,7 +12709,7 @@ type ShardReplicationAddResponse struct { func (x *ShardReplicationAddResponse) Reset() { *x = ShardReplicationAddResponse{} - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12502,7 +12721,7 @@ func (x *ShardReplicationAddResponse) String() string { func (*ShardReplicationAddResponse) ProtoMessage() {} func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[205] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12515,7 +12734,7 @@ func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{201} + return file_vtctldata_proto_rawDescGZIP(), []int{205} } type ShardReplicationFixRequest struct { @@ -12530,7 +12749,7 @@ type ShardReplicationFixRequest struct { func (x *ShardReplicationFixRequest) Reset() { *x = ShardReplicationFixRequest{} - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12542,7 +12761,7 @@ func (x *ShardReplicationFixRequest) String() string { func (*ShardReplicationFixRequest) ProtoMessage() {} func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[206] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12555,7 +12774,7 @@ func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationFixRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{202} + return file_vtctldata_proto_rawDescGZIP(), []int{206} } func (x *ShardReplicationFixRequest) GetKeyspace() string { @@ -12592,7 +12811,7 @@ type ShardReplicationFixResponse struct { func (x *ShardReplicationFixResponse) Reset() { *x = ShardReplicationFixResponse{} - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12604,7 +12823,7 @@ func (x *ShardReplicationFixResponse) String() string { func (*ShardReplicationFixResponse) ProtoMessage() {} func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[207] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12617,7 +12836,7 @@ func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationFixResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{203} + return file_vtctldata_proto_rawDescGZIP(), []int{207} } func (x *ShardReplicationFixResponse) GetError() *topodata.ShardReplicationError { @@ -12638,7 +12857,7 @@ type ShardReplicationPositionsRequest struct { func (x *ShardReplicationPositionsRequest) Reset() { *x = ShardReplicationPositionsRequest{} - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12650,7 +12869,7 @@ func (x *ShardReplicationPositionsRequest) String() string { func (*ShardReplicationPositionsRequest) ProtoMessage() {} func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[208] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12663,7 +12882,7 @@ func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationPositionsRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{204} + return file_vtctldata_proto_rawDescGZIP(), []int{208} } func (x *ShardReplicationPositionsRequest) GetKeyspace() string { @@ -12695,7 +12914,7 @@ type ShardReplicationPositionsResponse struct { func (x *ShardReplicationPositionsResponse) Reset() { *x = ShardReplicationPositionsResponse{} - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12707,7 +12926,7 @@ func (x *ShardReplicationPositionsResponse) String() string { func (*ShardReplicationPositionsResponse) ProtoMessage() {} func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[209] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12720,7 +12939,7 @@ func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ShardReplicationPositionsResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{205} + return file_vtctldata_proto_rawDescGZIP(), []int{209} } func (x *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string]*replicationdata.Status { @@ -12749,7 +12968,7 @@ type ShardReplicationRemoveRequest struct { func (x *ShardReplicationRemoveRequest) Reset() { *x = ShardReplicationRemoveRequest{} - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12761,7 +12980,7 @@ func (x *ShardReplicationRemoveRequest) String() string { func (*ShardReplicationRemoveRequest) ProtoMessage() {} func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[210] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12774,7 +12993,7 @@ func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{206} + return file_vtctldata_proto_rawDescGZIP(), []int{210} } func (x *ShardReplicationRemoveRequest) GetKeyspace() string { @@ -12806,7 +13025,7 @@ type ShardReplicationRemoveResponse struct { func (x *ShardReplicationRemoveResponse) Reset() { *x = ShardReplicationRemoveResponse{} - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12818,7 +13037,7 @@ func (x *ShardReplicationRemoveResponse) String() string { func (*ShardReplicationRemoveResponse) ProtoMessage() {} func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[211] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12831,7 +13050,7 @@ func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{207} + return file_vtctldata_proto_rawDescGZIP(), []int{211} } type SleepTabletRequest struct { @@ -12845,7 +13064,7 @@ type SleepTabletRequest struct { func (x *SleepTabletRequest) Reset() { *x = SleepTabletRequest{} - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12857,7 +13076,7 @@ func (x *SleepTabletRequest) String() string { func (*SleepTabletRequest) ProtoMessage() {} func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[212] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12870,7 +13089,7 @@ func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletRequest.ProtoReflect.Descriptor instead. func (*SleepTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{208} + return file_vtctldata_proto_rawDescGZIP(), []int{212} } func (x *SleepTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12895,7 +13114,7 @@ type SleepTabletResponse struct { func (x *SleepTabletResponse) Reset() { *x = SleepTabletResponse{} - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12907,7 +13126,7 @@ func (x *SleepTabletResponse) String() string { func (*SleepTabletResponse) ProtoMessage() {} func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[213] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12920,7 +13139,7 @@ func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletResponse.ProtoReflect.Descriptor instead. func (*SleepTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{209} + return file_vtctldata_proto_rawDescGZIP(), []int{213} } type SourceShardAddRequest struct { @@ -12943,7 +13162,7 @@ type SourceShardAddRequest struct { func (x *SourceShardAddRequest) Reset() { *x = SourceShardAddRequest{} - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12955,7 +13174,7 @@ func (x *SourceShardAddRequest) String() string { func (*SourceShardAddRequest) ProtoMessage() {} func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[214] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12968,7 +13187,7 @@ func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddRequest.ProtoReflect.Descriptor instead. func (*SourceShardAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{210} + return file_vtctldata_proto_rawDescGZIP(), []int{214} } func (x *SourceShardAddRequest) GetKeyspace() string { @@ -13031,7 +13250,7 @@ type SourceShardAddResponse struct { func (x *SourceShardAddResponse) Reset() { *x = SourceShardAddResponse{} - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13043,7 +13262,7 @@ func (x *SourceShardAddResponse) String() string { func (*SourceShardAddResponse) ProtoMessage() {} func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[215] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13056,7 +13275,7 @@ func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddResponse.ProtoReflect.Descriptor instead. func (*SourceShardAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{211} + return file_vtctldata_proto_rawDescGZIP(), []int{215} } func (x *SourceShardAddResponse) GetShard() *topodata.Shard { @@ -13078,7 +13297,7 @@ type SourceShardDeleteRequest struct { func (x *SourceShardDeleteRequest) Reset() { *x = SourceShardDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13090,7 +13309,7 @@ func (x *SourceShardDeleteRequest) String() string { func (*SourceShardDeleteRequest) ProtoMessage() {} func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[216] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13103,7 +13322,7 @@ func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteRequest.ProtoReflect.Descriptor instead. func (*SourceShardDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{212} + return file_vtctldata_proto_rawDescGZIP(), []int{216} } func (x *SourceShardDeleteRequest) GetKeyspace() string { @@ -13138,7 +13357,7 @@ type SourceShardDeleteResponse struct { func (x *SourceShardDeleteResponse) Reset() { *x = SourceShardDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13150,7 +13369,7 @@ func (x *SourceShardDeleteResponse) String() string { func (*SourceShardDeleteResponse) ProtoMessage() {} func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[217] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13163,7 +13382,7 @@ func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteResponse.ProtoReflect.Descriptor instead. func (*SourceShardDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{213} + return file_vtctldata_proto_rawDescGZIP(), []int{217} } func (x *SourceShardDeleteResponse) GetShard() *topodata.Shard { @@ -13183,7 +13402,7 @@ type StartReplicationRequest struct { func (x *StartReplicationRequest) Reset() { *x = StartReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13195,7 +13414,7 @@ func (x *StartReplicationRequest) String() string { func (*StartReplicationRequest) ProtoMessage() {} func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[218] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13208,7 +13427,7 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. func (*StartReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{214} + return file_vtctldata_proto_rawDescGZIP(), []int{218} } func (x *StartReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13226,7 +13445,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13238,7 +13457,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[219] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13251,7 +13470,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{215} + return file_vtctldata_proto_rawDescGZIP(), []int{219} } type StopReplicationRequest struct { @@ -13264,7 +13483,7 @@ type StopReplicationRequest struct { func (x *StopReplicationRequest) Reset() { *x = StopReplicationRequest{} - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13276,7 +13495,7 @@ func (x *StopReplicationRequest) String() string { func (*StopReplicationRequest) ProtoMessage() {} func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[220] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13289,7 +13508,7 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. func (*StopReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{216} + return file_vtctldata_proto_rawDescGZIP(), []int{220} } func (x *StopReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -13307,7 +13526,7 @@ type StopReplicationResponse struct { func (x *StopReplicationResponse) Reset() { *x = StopReplicationResponse{} - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13319,7 +13538,7 @@ func (x *StopReplicationResponse) String() string { func (*StopReplicationResponse) ProtoMessage() {} func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[221] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13332,7 +13551,7 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. func (*StopReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{217} + return file_vtctldata_proto_rawDescGZIP(), []int{221} } type TabletExternallyReparentedRequest struct { @@ -13347,7 +13566,7 @@ type TabletExternallyReparentedRequest struct { func (x *TabletExternallyReparentedRequest) Reset() { *x = TabletExternallyReparentedRequest{} - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13359,7 +13578,7 @@ func (x *TabletExternallyReparentedRequest) String() string { func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[222] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13372,7 +13591,7 @@ func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{218} + return file_vtctldata_proto_rawDescGZIP(), []int{222} } func (x *TabletExternallyReparentedRequest) GetTablet() *topodata.TabletAlias { @@ -13395,7 +13614,7 @@ type TabletExternallyReparentedResponse struct { func (x *TabletExternallyReparentedResponse) Reset() { *x = TabletExternallyReparentedResponse{} - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13407,7 +13626,7 @@ func (x *TabletExternallyReparentedResponse) String() string { func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[223] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13420,7 +13639,7 @@ func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedResponse.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{219} + return file_vtctldata_proto_rawDescGZIP(), []int{223} } func (x *TabletExternallyReparentedResponse) GetKeyspace() string { @@ -13462,7 +13681,7 @@ type UpdateCellInfoRequest struct { func (x *UpdateCellInfoRequest) Reset() { *x = UpdateCellInfoRequest{} - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13474,7 +13693,7 @@ func (x *UpdateCellInfoRequest) String() string { func (*UpdateCellInfoRequest) ProtoMessage() {} func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[224] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13487,7 +13706,7 @@ func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoRequest.ProtoReflect.Descriptor instead. func (*UpdateCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{220} + return file_vtctldata_proto_rawDescGZIP(), []int{224} } func (x *UpdateCellInfoRequest) GetName() string { @@ -13515,7 +13734,7 @@ type UpdateCellInfoResponse struct { func (x *UpdateCellInfoResponse) Reset() { *x = UpdateCellInfoResponse{} - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13527,7 +13746,7 @@ func (x *UpdateCellInfoResponse) String() string { func (*UpdateCellInfoResponse) ProtoMessage() {} func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[225] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13540,7 +13759,7 @@ func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoResponse.ProtoReflect.Descriptor instead. func (*UpdateCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{221} + return file_vtctldata_proto_rawDescGZIP(), []int{225} } func (x *UpdateCellInfoResponse) GetName() string { @@ -13568,7 +13787,7 @@ type UpdateCellsAliasRequest struct { func (x *UpdateCellsAliasRequest) Reset() { *x = UpdateCellsAliasRequest{} - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13580,7 +13799,7 @@ func (x *UpdateCellsAliasRequest) String() string { func (*UpdateCellsAliasRequest) ProtoMessage() {} func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[226] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13593,7 +13812,7 @@ func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasRequest.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{222} + return file_vtctldata_proto_rawDescGZIP(), []int{226} } func (x *UpdateCellsAliasRequest) GetName() string { @@ -13621,7 +13840,7 @@ type UpdateCellsAliasResponse struct { func (x *UpdateCellsAliasResponse) Reset() { *x = UpdateCellsAliasResponse{} - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13633,7 +13852,7 @@ func (x *UpdateCellsAliasResponse) String() string { func (*UpdateCellsAliasResponse) ProtoMessage() {} func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[227] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13646,7 +13865,7 @@ func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasResponse.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{223} + return file_vtctldata_proto_rawDescGZIP(), []int{227} } func (x *UpdateCellsAliasResponse) GetName() string { @@ -13673,7 +13892,7 @@ type ValidateRequest struct { func (x *ValidateRequest) Reset() { *x = ValidateRequest{} - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13685,7 +13904,7 @@ func (x *ValidateRequest) String() string { func (*ValidateRequest) ProtoMessage() {} func (x *ValidateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[228] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13698,7 +13917,7 @@ func (x *ValidateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. func (*ValidateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{224} + return file_vtctldata_proto_rawDescGZIP(), []int{228} } func (x *ValidateRequest) GetPingTablets() bool { @@ -13719,7 +13938,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[229] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13731,7 +13950,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[229] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13744,7 +13963,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{225} + return file_vtctldata_proto_rawDescGZIP(), []int{229} } func (x *ValidateResponse) GetResults() []string { @@ -13772,7 +13991,7 @@ type ValidateKeyspaceRequest struct { func (x *ValidateKeyspaceRequest) Reset() { *x = ValidateKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[226] + mi := &file_vtctldata_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13784,7 +14003,7 @@ func (x *ValidateKeyspaceRequest) String() string { func (*ValidateKeyspaceRequest) ProtoMessage() {} func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[226] + mi := &file_vtctldata_proto_msgTypes[230] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13797,7 +14016,7 @@ func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{226} + return file_vtctldata_proto_rawDescGZIP(), []int{230} } func (x *ValidateKeyspaceRequest) GetKeyspace() string { @@ -13825,7 +14044,7 @@ type ValidateKeyspaceResponse struct { func (x *ValidateKeyspaceResponse) Reset() { *x = ValidateKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13837,7 +14056,7 @@ func (x *ValidateKeyspaceResponse) String() string { func (*ValidateKeyspaceResponse) ProtoMessage() {} func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[231] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13850,7 +14069,7 @@ func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{227} + return file_vtctldata_proto_rawDescGZIP(), []int{231} } func (x *ValidateKeyspaceResponse) GetResults() []string { @@ -13880,7 +14099,7 @@ type ValidatePermissionsKeyspaceRequest struct { func (x *ValidatePermissionsKeyspaceRequest) Reset() { *x = ValidatePermissionsKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13892,7 +14111,7 @@ func (x *ValidatePermissionsKeyspaceRequest) String() string { func (*ValidatePermissionsKeyspaceRequest) ProtoMessage() {} func (x *ValidatePermissionsKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[232] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13905,7 +14124,7 @@ func (x *ValidatePermissionsKeyspaceRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ValidatePermissionsKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidatePermissionsKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{228} + return file_vtctldata_proto_rawDescGZIP(), []int{232} } func (x *ValidatePermissionsKeyspaceRequest) GetKeyspace() string { @@ -13930,7 +14149,7 @@ type ValidatePermissionsKeyspaceResponse struct { func (x *ValidatePermissionsKeyspaceResponse) Reset() { *x = ValidatePermissionsKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13942,7 +14161,7 @@ func (x *ValidatePermissionsKeyspaceResponse) String() string { func (*ValidatePermissionsKeyspaceResponse) ProtoMessage() {} func (x *ValidatePermissionsKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[233] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13955,7 +14174,7 @@ func (x *ValidatePermissionsKeyspaceResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ValidatePermissionsKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidatePermissionsKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{229} + return file_vtctldata_proto_rawDescGZIP(), []int{233} } type ValidateSchemaKeyspaceRequest struct { @@ -13975,7 +14194,7 @@ type ValidateSchemaKeyspaceRequest struct { func (x *ValidateSchemaKeyspaceRequest) Reset() { *x = ValidateSchemaKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13987,7 +14206,7 @@ func (x *ValidateSchemaKeyspaceRequest) String() string { func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[234] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14000,7 +14219,7 @@ func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{230} + return file_vtctldata_proto_rawDescGZIP(), []int{234} } func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { @@ -14056,7 +14275,7 @@ type ValidateSchemaKeyspaceResponse struct { func (x *ValidateSchemaKeyspaceResponse) Reset() { *x = ValidateSchemaKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14068,7 +14287,7 @@ func (x *ValidateSchemaKeyspaceResponse) String() string { func (*ValidateSchemaKeyspaceResponse) ProtoMessage() {} func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[235] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14081,7 +14300,7 @@ func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{231} + return file_vtctldata_proto_rawDescGZIP(), []int{235} } func (x *ValidateSchemaKeyspaceResponse) GetResults() []string { @@ -14110,7 +14329,7 @@ type ValidateShardRequest struct { func (x *ValidateShardRequest) Reset() { *x = ValidateShardRequest{} - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14122,7 +14341,7 @@ func (x *ValidateShardRequest) String() string { func (*ValidateShardRequest) ProtoMessage() {} func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[236] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14135,7 +14354,7 @@ func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. func (*ValidateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{232} + return file_vtctldata_proto_rawDescGZIP(), []int{236} } func (x *ValidateShardRequest) GetKeyspace() string { @@ -14169,7 +14388,7 @@ type ValidateShardResponse struct { func (x *ValidateShardResponse) Reset() { *x = ValidateShardResponse{} - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14181,7 +14400,7 @@ func (x *ValidateShardResponse) String() string { func (*ValidateShardResponse) ProtoMessage() {} func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[237] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14194,7 +14413,7 @@ func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardResponse.ProtoReflect.Descriptor instead. func (*ValidateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{233} + return file_vtctldata_proto_rawDescGZIP(), []int{237} } func (x *ValidateShardResponse) GetResults() []string { @@ -14214,7 +14433,7 @@ type ValidateVersionKeyspaceRequest struct { func (x *ValidateVersionKeyspaceRequest) Reset() { *x = ValidateVersionKeyspaceRequest{} - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14226,7 +14445,7 @@ func (x *ValidateVersionKeyspaceRequest) String() string { func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[238] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14239,7 +14458,7 @@ func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{234} + return file_vtctldata_proto_rawDescGZIP(), []int{238} } func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { @@ -14260,7 +14479,7 @@ type ValidateVersionKeyspaceResponse struct { func (x *ValidateVersionKeyspaceResponse) Reset() { *x = ValidateVersionKeyspaceResponse{} - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14272,7 +14491,7 @@ func (x *ValidateVersionKeyspaceResponse) String() string { func (*ValidateVersionKeyspaceResponse) ProtoMessage() {} func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[239] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14285,7 +14504,7 @@ func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{235} + return file_vtctldata_proto_rawDescGZIP(), []int{239} } func (x *ValidateVersionKeyspaceResponse) GetResults() []string { @@ -14313,7 +14532,7 @@ type ValidateVersionShardRequest struct { func (x *ValidateVersionShardRequest) Reset() { *x = ValidateVersionShardRequest{} - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14325,7 +14544,7 @@ func (x *ValidateVersionShardRequest) String() string { func (*ValidateVersionShardRequest) ProtoMessage() {} func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[240] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14338,7 +14557,7 @@ func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{236} + return file_vtctldata_proto_rawDescGZIP(), []int{240} } func (x *ValidateVersionShardRequest) GetKeyspace() string { @@ -14365,7 +14584,7 @@ type ValidateVersionShardResponse struct { func (x *ValidateVersionShardResponse) Reset() { *x = ValidateVersionShardResponse{} - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14377,7 +14596,7 @@ func (x *ValidateVersionShardResponse) String() string { func (*ValidateVersionShardResponse) ProtoMessage() {} func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[241] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14390,7 +14609,7 @@ func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{237} + return file_vtctldata_proto_rawDescGZIP(), []int{241} } func (x *ValidateVersionShardResponse) GetResults() []string { @@ -14413,7 +14632,7 @@ type ValidateVSchemaRequest struct { func (x *ValidateVSchemaRequest) Reset() { *x = ValidateVSchemaRequest{} - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14425,7 +14644,7 @@ func (x *ValidateVSchemaRequest) String() string { func (*ValidateVSchemaRequest) ProtoMessage() {} func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[242] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14438,7 +14657,7 @@ func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaRequest.ProtoReflect.Descriptor instead. func (*ValidateVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{238} + return file_vtctldata_proto_rawDescGZIP(), []int{242} } func (x *ValidateVSchemaRequest) GetKeyspace() string { @@ -14480,7 +14699,7 @@ type ValidateVSchemaResponse struct { func (x *ValidateVSchemaResponse) Reset() { *x = ValidateVSchemaResponse{} - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14492,7 +14711,7 @@ func (x *ValidateVSchemaResponse) String() string { func (*ValidateVSchemaResponse) ProtoMessage() {} func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[243] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14505,7 +14724,7 @@ func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaResponse.ProtoReflect.Descriptor instead. func (*ValidateVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{239} + return file_vtctldata_proto_rawDescGZIP(), []int{243} } func (x *ValidateVSchemaResponse) GetResults() []string { @@ -14611,7 +14830,7 @@ type VDiffCreateRequest struct { func (x *VDiffCreateRequest) Reset() { *x = VDiffCreateRequest{} - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14623,7 +14842,7 @@ func (x *VDiffCreateRequest) String() string { func (*VDiffCreateRequest) ProtoMessage() {} func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[244] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14636,7 +14855,7 @@ func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateRequest.ProtoReflect.Descriptor instead. func (*VDiffCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240} + return file_vtctldata_proto_rawDescGZIP(), []int{244} } func (x *VDiffCreateRequest) GetWorkflow() string { @@ -14805,7 +15024,7 @@ type VDiffCreateResponse struct { func (x *VDiffCreateResponse) Reset() { *x = VDiffCreateResponse{} - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14817,7 +15036,7 @@ func (x *VDiffCreateResponse) String() string { func (*VDiffCreateResponse) ProtoMessage() {} func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[245] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14830,7 +15049,7 @@ func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateResponse.ProtoReflect.Descriptor instead. func (*VDiffCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{241} + return file_vtctldata_proto_rawDescGZIP(), []int{245} } func (x *VDiffCreateResponse) GetUUID() string { @@ -14853,7 +15072,7 @@ type VDiffDeleteRequest struct { func (x *VDiffDeleteRequest) Reset() { *x = VDiffDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14865,7 +15084,7 @@ func (x *VDiffDeleteRequest) String() string { func (*VDiffDeleteRequest) ProtoMessage() {} func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[246] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14878,7 +15097,7 @@ func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteRequest.ProtoReflect.Descriptor instead. func (*VDiffDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{242} + return file_vtctldata_proto_rawDescGZIP(), []int{246} } func (x *VDiffDeleteRequest) GetWorkflow() string { @@ -14910,7 +15129,7 @@ type VDiffDeleteResponse struct { func (x *VDiffDeleteResponse) Reset() { *x = VDiffDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14922,7 +15141,7 @@ func (x *VDiffDeleteResponse) String() string { func (*VDiffDeleteResponse) ProtoMessage() {} func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[247] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14935,7 +15154,7 @@ func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteResponse.ProtoReflect.Descriptor instead. func (*VDiffDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{243} + return file_vtctldata_proto_rawDescGZIP(), []int{247} } type VDiffResumeRequest struct { @@ -14951,7 +15170,7 @@ type VDiffResumeRequest struct { func (x *VDiffResumeRequest) Reset() { *x = VDiffResumeRequest{} - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14963,7 +15182,7 @@ func (x *VDiffResumeRequest) String() string { func (*VDiffResumeRequest) ProtoMessage() {} func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[248] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14976,7 +15195,7 @@ func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeRequest.ProtoReflect.Descriptor instead. func (*VDiffResumeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{244} + return file_vtctldata_proto_rawDescGZIP(), []int{248} } func (x *VDiffResumeRequest) GetWorkflow() string { @@ -15015,7 +15234,7 @@ type VDiffResumeResponse struct { func (x *VDiffResumeResponse) Reset() { *x = VDiffResumeResponse{} - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15027,7 +15246,7 @@ func (x *VDiffResumeResponse) String() string { func (*VDiffResumeResponse) ProtoMessage() {} func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[249] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15040,7 +15259,7 @@ func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeResponse.ProtoReflect.Descriptor instead. func (*VDiffResumeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{245} + return file_vtctldata_proto_rawDescGZIP(), []int{249} } type VDiffShowRequest struct { @@ -15056,7 +15275,7 @@ type VDiffShowRequest struct { func (x *VDiffShowRequest) Reset() { *x = VDiffShowRequest{} - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15068,7 +15287,7 @@ func (x *VDiffShowRequest) String() string { func (*VDiffShowRequest) ProtoMessage() {} func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[250] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15081,7 +15300,7 @@ func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowRequest.ProtoReflect.Descriptor instead. func (*VDiffShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{246} + return file_vtctldata_proto_rawDescGZIP(), []int{250} } func (x *VDiffShowRequest) GetWorkflow() string { @@ -15116,7 +15335,7 @@ type VDiffShowResponse struct { func (x *VDiffShowResponse) Reset() { *x = VDiffShowResponse{} - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15128,7 +15347,7 @@ func (x *VDiffShowResponse) String() string { func (*VDiffShowResponse) ProtoMessage() {} func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[251] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15141,7 +15360,7 @@ func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowResponse.ProtoReflect.Descriptor instead. func (*VDiffShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247} + return file_vtctldata_proto_rawDescGZIP(), []int{251} } func (x *VDiffShowResponse) GetTabletResponses() map[string]*tabletmanagerdata.VDiffResponse { @@ -15164,7 +15383,7 @@ type VDiffStopRequest struct { func (x *VDiffStopRequest) Reset() { *x = VDiffStopRequest{} - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15176,7 +15395,7 @@ func (x *VDiffStopRequest) String() string { func (*VDiffStopRequest) ProtoMessage() {} func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[252] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15189,7 +15408,7 @@ func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopRequest.ProtoReflect.Descriptor instead. func (*VDiffStopRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{248} + return file_vtctldata_proto_rawDescGZIP(), []int{252} } func (x *VDiffStopRequest) GetWorkflow() string { @@ -15228,7 +15447,7 @@ type VDiffStopResponse struct { func (x *VDiffStopResponse) Reset() { *x = VDiffStopResponse{} - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15240,7 +15459,7 @@ func (x *VDiffStopResponse) String() string { func (*VDiffStopResponse) ProtoMessage() {} func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[249] + mi := &file_vtctldata_proto_msgTypes[253] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15253,7 +15472,7 @@ func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopResponse.ProtoReflect.Descriptor instead. func (*VDiffStopResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{249} + return file_vtctldata_proto_rawDescGZIP(), []int{253} } type WorkflowDeleteRequest struct { @@ -15274,7 +15493,7 @@ type WorkflowDeleteRequest struct { func (x *WorkflowDeleteRequest) Reset() { *x = WorkflowDeleteRequest{} - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15286,7 +15505,7 @@ func (x *WorkflowDeleteRequest) String() string { func (*WorkflowDeleteRequest) ProtoMessage() {} func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[254] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15299,7 +15518,7 @@ func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteRequest.ProtoReflect.Descriptor instead. func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{250} + return file_vtctldata_proto_rawDescGZIP(), []int{254} } func (x *WorkflowDeleteRequest) GetKeyspace() string { @@ -15355,7 +15574,7 @@ type WorkflowDeleteResponse struct { func (x *WorkflowDeleteResponse) Reset() { *x = WorkflowDeleteResponse{} - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15367,7 +15586,7 @@ func (x *WorkflowDeleteResponse) String() string { func (*WorkflowDeleteResponse) ProtoMessage() {} func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[255] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15380,7 +15599,7 @@ func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteResponse.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{251} + return file_vtctldata_proto_rawDescGZIP(), []int{255} } func (x *WorkflowDeleteResponse) GetSummary() string { @@ -15409,7 +15628,7 @@ type WorkflowStatusRequest struct { func (x *WorkflowStatusRequest) Reset() { *x = WorkflowStatusRequest{} - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15421,7 +15640,7 @@ func (x *WorkflowStatusRequest) String() string { func (*WorkflowStatusRequest) ProtoMessage() {} func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[256] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15434,7 +15653,7 @@ func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusRequest.ProtoReflect.Descriptor instead. func (*WorkflowStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{252} + return file_vtctldata_proto_rawDescGZIP(), []int{256} } func (x *WorkflowStatusRequest) GetKeyspace() string { @@ -15471,7 +15690,7 @@ type WorkflowStatusResponse struct { func (x *WorkflowStatusResponse) Reset() { *x = WorkflowStatusResponse{} - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15483,7 +15702,7 @@ func (x *WorkflowStatusResponse) String() string { func (*WorkflowStatusResponse) ProtoMessage() {} func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[257] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15496,7 +15715,7 @@ func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusResponse.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253} + return file_vtctldata_proto_rawDescGZIP(), []int{257} } func (x *WorkflowStatusResponse) GetTableCopyState() map[string]*WorkflowStatusResponse_TableCopyState { @@ -15541,7 +15760,7 @@ type WorkflowSwitchTrafficRequest struct { func (x *WorkflowSwitchTrafficRequest) Reset() { *x = WorkflowSwitchTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15553,7 +15772,7 @@ func (x *WorkflowSwitchTrafficRequest) String() string { func (*WorkflowSwitchTrafficRequest) ProtoMessage() {} func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[258] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15566,7 +15785,7 @@ func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{254} + return file_vtctldata_proto_rawDescGZIP(), []int{258} } func (x *WorkflowSwitchTrafficRequest) GetKeyspace() string { @@ -15666,7 +15885,7 @@ type WorkflowSwitchTrafficResponse struct { func (x *WorkflowSwitchTrafficResponse) Reset() { *x = WorkflowSwitchTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15678,7 +15897,7 @@ func (x *WorkflowSwitchTrafficResponse) String() string { func (*WorkflowSwitchTrafficResponse) ProtoMessage() {} func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[259] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15691,7 +15910,7 @@ func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{255} + return file_vtctldata_proto_rawDescGZIP(), []int{259} } func (x *WorkflowSwitchTrafficResponse) GetSummary() string { @@ -15735,7 +15954,7 @@ type WorkflowUpdateRequest struct { func (x *WorkflowUpdateRequest) Reset() { *x = WorkflowUpdateRequest{} - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15747,7 +15966,7 @@ func (x *WorkflowUpdateRequest) String() string { func (*WorkflowUpdateRequest) ProtoMessage() {} func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[256] + mi := &file_vtctldata_proto_msgTypes[260] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15760,7 +15979,7 @@ func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateRequest.ProtoReflect.Descriptor instead. func (*WorkflowUpdateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{256} + return file_vtctldata_proto_rawDescGZIP(), []int{260} } func (x *WorkflowUpdateRequest) GetKeyspace() string { @@ -15788,7 +16007,7 @@ type WorkflowUpdateResponse struct { func (x *WorkflowUpdateResponse) Reset() { *x = WorkflowUpdateResponse{} - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15800,7 +16019,7 @@ func (x *WorkflowUpdateResponse) String() string { func (*WorkflowUpdateResponse) ProtoMessage() {} func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[257] + mi := &file_vtctldata_proto_msgTypes[261] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15813,7 +16032,7 @@ func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateResponse.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{257} + return file_vtctldata_proto_rawDescGZIP(), []int{261} } func (x *WorkflowUpdateResponse) GetSummary() string { @@ -15838,7 +16057,7 @@ type GetMirrorRulesRequest struct { func (x *GetMirrorRulesRequest) Reset() { *x = GetMirrorRulesRequest{} - mi := &file_vtctldata_proto_msgTypes[258] + mi := &file_vtctldata_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15850,7 +16069,7 @@ func (x *GetMirrorRulesRequest) String() string { func (*GetMirrorRulesRequest) ProtoMessage() {} func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[258] + mi := &file_vtctldata_proto_msgTypes[262] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15863,7 +16082,7 @@ func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesRequest.ProtoReflect.Descriptor instead. func (*GetMirrorRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{258} + return file_vtctldata_proto_rawDescGZIP(), []int{262} } type GetMirrorRulesResponse struct { @@ -15876,7 +16095,7 @@ type GetMirrorRulesResponse struct { func (x *GetMirrorRulesResponse) Reset() { *x = GetMirrorRulesResponse{} - mi := &file_vtctldata_proto_msgTypes[259] + mi := &file_vtctldata_proto_msgTypes[263] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15888,7 +16107,7 @@ func (x *GetMirrorRulesResponse) String() string { func (*GetMirrorRulesResponse) ProtoMessage() {} func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[259] + mi := &file_vtctldata_proto_msgTypes[263] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15901,7 +16120,7 @@ func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesResponse.ProtoReflect.Descriptor instead. func (*GetMirrorRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{259} + return file_vtctldata_proto_rawDescGZIP(), []int{263} } func (x *GetMirrorRulesResponse) GetMirrorRules() *vschema.MirrorRules { @@ -15924,7 +16143,7 @@ type WorkflowMirrorTrafficRequest struct { func (x *WorkflowMirrorTrafficRequest) Reset() { *x = WorkflowMirrorTrafficRequest{} - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15936,7 +16155,7 @@ func (x *WorkflowMirrorTrafficRequest) String() string { func (*WorkflowMirrorTrafficRequest) ProtoMessage() {} func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[260] + mi := &file_vtctldata_proto_msgTypes[264] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15949,7 +16168,7 @@ func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{260} + return file_vtctldata_proto_rawDescGZIP(), []int{264} } func (x *WorkflowMirrorTrafficRequest) GetKeyspace() string { @@ -15992,7 +16211,7 @@ type WorkflowMirrorTrafficResponse struct { func (x *WorkflowMirrorTrafficResponse) Reset() { *x = WorkflowMirrorTrafficResponse{} - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16004,7 +16223,7 @@ func (x *WorkflowMirrorTrafficResponse) String() string { func (*WorkflowMirrorTrafficResponse) ProtoMessage() {} func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[261] + mi := &file_vtctldata_proto_msgTypes[265] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16017,7 +16236,7 @@ func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{261} + return file_vtctldata_proto_rawDescGZIP(), []int{265} } func (x *WorkflowMirrorTrafficResponse) GetSummary() string { @@ -16052,7 +16271,7 @@ type Workflow_ReplicationLocation struct { func (x *Workflow_ReplicationLocation) Reset() { *x = Workflow_ReplicationLocation{} - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16064,7 +16283,7 @@ func (x *Workflow_ReplicationLocation) String() string { func (*Workflow_ReplicationLocation) ProtoMessage() {} func (x *Workflow_ReplicationLocation) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[264] + mi := &file_vtctldata_proto_msgTypes[268] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16106,7 +16325,7 @@ type Workflow_ShardStream struct { func (x *Workflow_ShardStream) Reset() { *x = Workflow_ShardStream{} - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16118,7 +16337,7 @@ func (x *Workflow_ShardStream) String() string { func (*Workflow_ShardStream) ProtoMessage() {} func (x *Workflow_ShardStream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[265] + mi := &file_vtctldata_proto_msgTypes[269] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16192,7 +16411,7 @@ type Workflow_Stream struct { func (x *Workflow_Stream) Reset() { *x = Workflow_Stream{} - mi := &file_vtctldata_proto_msgTypes[266] + mi := &file_vtctldata_proto_msgTypes[270] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16204,7 +16423,7 @@ func (x *Workflow_Stream) String() string { func (*Workflow_Stream) ProtoMessage() {} func (x *Workflow_Stream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[266] + mi := &file_vtctldata_proto_msgTypes[270] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16372,7 +16591,7 @@ type Workflow_Stream_CopyState struct { func (x *Workflow_Stream_CopyState) Reset() { *x = Workflow_Stream_CopyState{} - mi := &file_vtctldata_proto_msgTypes[267] + mi := &file_vtctldata_proto_msgTypes[271] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16384,7 +16603,7 @@ func (x *Workflow_Stream_CopyState) String() string { func (*Workflow_Stream_CopyState) ProtoMessage() {} func (x *Workflow_Stream_CopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[267] + mi := &file_vtctldata_proto_msgTypes[271] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16438,7 +16657,7 @@ type Workflow_Stream_Log struct { func (x *Workflow_Stream_Log) Reset() { *x = Workflow_Stream_Log{} - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16450,7 +16669,7 @@ func (x *Workflow_Stream_Log) String() string { func (*Workflow_Stream_Log) ProtoMessage() {} func (x *Workflow_Stream_Log) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[268] + mi := &file_vtctldata_proto_msgTypes[272] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16533,7 +16752,7 @@ type Workflow_Stream_ThrottlerStatus struct { func (x *Workflow_Stream_ThrottlerStatus) Reset() { *x = Workflow_Stream_ThrottlerStatus{} - mi := &file_vtctldata_proto_msgTypes[269] + mi := &file_vtctldata_proto_msgTypes[273] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16545,7 +16764,7 @@ func (x *Workflow_Stream_ThrottlerStatus) String() string { func (*Workflow_Stream_ThrottlerStatus) ProtoMessage() {} func (x *Workflow_Stream_ThrottlerStatus) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[269] + mi := &file_vtctldata_proto_msgTypes[273] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16585,7 +16804,7 @@ type ApplyVSchemaResponse_ParamList struct { func (x *ApplyVSchemaResponse_ParamList) Reset() { *x = ApplyVSchemaResponse_ParamList{} - mi := &file_vtctldata_proto_msgTypes[272] + mi := &file_vtctldata_proto_msgTypes[276] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16597,7 +16816,7 @@ func (x *ApplyVSchemaResponse_ParamList) String() string { func (*ApplyVSchemaResponse_ParamList) ProtoMessage() {} func (x *ApplyVSchemaResponse_ParamList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[272] + mi := &file_vtctldata_proto_msgTypes[276] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16630,7 +16849,7 @@ type GetSrvKeyspaceNamesResponse_NameList struct { func (x *GetSrvKeyspaceNamesResponse_NameList) Reset() { *x = GetSrvKeyspaceNamesResponse_NameList{} - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16642,7 +16861,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) String() string { func (*GetSrvKeyspaceNamesResponse_NameList) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[288] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16677,7 +16896,7 @@ type MoveTablesCreateResponse_TabletInfo struct { func (x *MoveTablesCreateResponse_TabletInfo) Reset() { *x = MoveTablesCreateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[288] + mi := &file_vtctldata_proto_msgTypes[292] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16689,7 +16908,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) String() string { func (*MoveTablesCreateResponse_TabletInfo) ProtoMessage() {} func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[288] + mi := &file_vtctldata_proto_msgTypes[292] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16702,7 +16921,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Messag // Deprecated: Use MoveTablesCreateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{154, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{158, 0} } func (x *MoveTablesCreateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16731,7 +16950,7 @@ type WorkflowDeleteResponse_TabletInfo struct { func (x *WorkflowDeleteResponse_TabletInfo) Reset() { *x = WorkflowDeleteResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[298] + mi := &file_vtctldata_proto_msgTypes[302] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16743,7 +16962,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) String() string { func (*WorkflowDeleteResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[298] + mi := &file_vtctldata_proto_msgTypes[302] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16756,7 +16975,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowDeleteResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{251, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{255, 0} } func (x *WorkflowDeleteResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16788,7 +17007,7 @@ type WorkflowStatusResponse_TableCopyState struct { func (x *WorkflowStatusResponse_TableCopyState) Reset() { *x = WorkflowStatusResponse_TableCopyState{} - mi := &file_vtctldata_proto_msgTypes[299] + mi := &file_vtctldata_proto_msgTypes[303] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16800,7 +17019,7 @@ func (x *WorkflowStatusResponse_TableCopyState) String() string { func (*WorkflowStatusResponse_TableCopyState) ProtoMessage() {} func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[299] + mi := &file_vtctldata_proto_msgTypes[303] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16813,7 +17032,7 @@ func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Mess // Deprecated: Use WorkflowStatusResponse_TableCopyState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_TableCopyState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{257, 0} } func (x *WorkflowStatusResponse_TableCopyState) GetRowsCopied() int64 { @@ -16873,7 +17092,7 @@ type WorkflowStatusResponse_ShardStreamState struct { func (x *WorkflowStatusResponse_ShardStreamState) Reset() { *x = WorkflowStatusResponse_ShardStreamState{} - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16885,7 +17104,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) String() string { func (*WorkflowStatusResponse_ShardStreamState) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[300] + mi := &file_vtctldata_proto_msgTypes[304] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16898,7 +17117,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Me // Deprecated: Use WorkflowStatusResponse_ShardStreamState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreamState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{257, 1} } func (x *WorkflowStatusResponse_ShardStreamState) GetId() int32 { @@ -16953,7 +17172,7 @@ type WorkflowStatusResponse_ShardStreams struct { func (x *WorkflowStatusResponse_ShardStreams) Reset() { *x = WorkflowStatusResponse_ShardStreams{} - mi := &file_vtctldata_proto_msgTypes[301] + mi := &file_vtctldata_proto_msgTypes[305] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16965,7 +17184,7 @@ func (x *WorkflowStatusResponse_ShardStreams) String() string { func (*WorkflowStatusResponse_ShardStreams) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[301] + mi := &file_vtctldata_proto_msgTypes[305] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16978,7 +17197,7 @@ func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Messag // Deprecated: Use WorkflowStatusResponse_ShardStreams.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreams) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{253, 2} + return file_vtctldata_proto_rawDescGZIP(), []int{257, 2} } func (x *WorkflowStatusResponse_ShardStreams) GetStreams() []*WorkflowStatusResponse_ShardStreamState { @@ -17001,7 +17220,7 @@ type WorkflowUpdateResponse_TabletInfo struct { func (x *WorkflowUpdateResponse_TabletInfo) Reset() { *x = WorkflowUpdateResponse_TabletInfo{} - mi := &file_vtctldata_proto_msgTypes[304] + mi := &file_vtctldata_proto_msgTypes[308] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17013,7 +17232,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) String() string { func (*WorkflowUpdateResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[304] + mi := &file_vtctldata_proto_msgTypes[308] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17026,7 +17245,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowUpdateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{257, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{261, 0} } func (x *WorkflowUpdateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -18477,1188 +18696,1213 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, - 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, - 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, - 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x74, 0x0a, 0x1b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x1e, 0x0a, 0x1c, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xff, 0x02, 0x0a, + 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, + 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, + 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa0, 0x01, 0x0a, + 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, + 0x77, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, - 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, + 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x29, 0x0a, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, + 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, + 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, + 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, + 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, + 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, + 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, + 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, + 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, + 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, + 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, + 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, + 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, + 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, - 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, + 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, + 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, + 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, - 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, - 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, - 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, + 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, + 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, 0x1b, + 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, + 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, - 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, - 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, - 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, - 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, - 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, - 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, - 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, - 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, - 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, - 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, - 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, - 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, - 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, - 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, + 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, - 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, - 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, - 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, - 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, - 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, - 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, - 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, - 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, - 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, - 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, - 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, - 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, - 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, - 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, - 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, - 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, - 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, - 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, - 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, - 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, - 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, - 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, + 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, + 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, + 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, + 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, + 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, + 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, + 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, + 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, + 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, + 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, 0x18, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, + 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, - 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, - 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, - 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, + 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 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, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, - 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x22, + 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, 0x53, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, 0x0a, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, + 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, - 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, - 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, - 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, - 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, + 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x18, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x65, 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, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, + 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x01, + 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, + 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, 0x0a, + 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, + 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x09, + 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xc6, + 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, - 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, + 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, + 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x25, 0x0a, 0x23, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xf0, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x22, 0x25, 0x0a, 0x23, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, - 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, - 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x1e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, - 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, + 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, + 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, + 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, - 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, - 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, - 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, - 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, - 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, - 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, - 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, - 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, - 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, - 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, - 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, - 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, - 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3c, 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, - 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, - 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x22, 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, - 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, - 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x92, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, + 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, + 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, + 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, + 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, + 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, + 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, + 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, + 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, + 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, + 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, - 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, - 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, - 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, + 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, + 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 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, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, + 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, + 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, + 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, + 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, + 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, - 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, - 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, - 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, - 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, - 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 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, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x85, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, - 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, - 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, - 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x22, 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, - 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, - 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, - 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, - 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, - 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, + 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, + 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, + 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, + 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, + 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, + 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, + 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, + 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, + 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, + 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, + 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, + 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, + 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -19674,7 +19918,7 @@ func file_vtctldata_proto_rawDescGZIP() []byte { } var file_vtctldata_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 305) +var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 309) var file_vtctldata_proto_goTypes = []any{ (MaterializationIntent)(0), // 0: vtctldata.MaterializationIntent (QueryOrdering)(0), // 1: vtctldata.QueryOrdering @@ -19817,460 +20061,464 @@ var file_vtctldata_proto_goTypes = []any{ (*InitShardPrimaryResponse)(nil), // 138: vtctldata.InitShardPrimaryResponse (*LaunchSchemaMigrationRequest)(nil), // 139: vtctldata.LaunchSchemaMigrationRequest (*LaunchSchemaMigrationResponse)(nil), // 140: vtctldata.LaunchSchemaMigrationResponse - (*LookupVindexCreateRequest)(nil), // 141: vtctldata.LookupVindexCreateRequest - (*LookupVindexCreateResponse)(nil), // 142: vtctldata.LookupVindexCreateResponse - (*LookupVindexExternalizeRequest)(nil), // 143: vtctldata.LookupVindexExternalizeRequest - (*LookupVindexExternalizeResponse)(nil), // 144: vtctldata.LookupVindexExternalizeResponse - (*MaterializeCreateRequest)(nil), // 145: vtctldata.MaterializeCreateRequest - (*MaterializeCreateResponse)(nil), // 146: vtctldata.MaterializeCreateResponse - (*MigrateCreateRequest)(nil), // 147: vtctldata.MigrateCreateRequest - (*MigrateCompleteRequest)(nil), // 148: vtctldata.MigrateCompleteRequest - (*MigrateCompleteResponse)(nil), // 149: vtctldata.MigrateCompleteResponse - (*MountRegisterRequest)(nil), // 150: vtctldata.MountRegisterRequest - (*MountRegisterResponse)(nil), // 151: vtctldata.MountRegisterResponse - (*MountUnregisterRequest)(nil), // 152: vtctldata.MountUnregisterRequest - (*MountUnregisterResponse)(nil), // 153: vtctldata.MountUnregisterResponse - (*MountShowRequest)(nil), // 154: vtctldata.MountShowRequest - (*MountShowResponse)(nil), // 155: vtctldata.MountShowResponse - (*MountListRequest)(nil), // 156: vtctldata.MountListRequest - (*MountListResponse)(nil), // 157: vtctldata.MountListResponse - (*MoveTablesCreateRequest)(nil), // 158: vtctldata.MoveTablesCreateRequest - (*MoveTablesCreateResponse)(nil), // 159: vtctldata.MoveTablesCreateResponse - (*MoveTablesCompleteRequest)(nil), // 160: vtctldata.MoveTablesCompleteRequest - (*MoveTablesCompleteResponse)(nil), // 161: vtctldata.MoveTablesCompleteResponse - (*PingTabletRequest)(nil), // 162: vtctldata.PingTabletRequest - (*PingTabletResponse)(nil), // 163: vtctldata.PingTabletResponse - (*PlannedReparentShardRequest)(nil), // 164: vtctldata.PlannedReparentShardRequest - (*PlannedReparentShardResponse)(nil), // 165: vtctldata.PlannedReparentShardResponse - (*RebuildKeyspaceGraphRequest)(nil), // 166: vtctldata.RebuildKeyspaceGraphRequest - (*RebuildKeyspaceGraphResponse)(nil), // 167: vtctldata.RebuildKeyspaceGraphResponse - (*RebuildVSchemaGraphRequest)(nil), // 168: vtctldata.RebuildVSchemaGraphRequest - (*RebuildVSchemaGraphResponse)(nil), // 169: vtctldata.RebuildVSchemaGraphResponse - (*RefreshStateRequest)(nil), // 170: vtctldata.RefreshStateRequest - (*RefreshStateResponse)(nil), // 171: vtctldata.RefreshStateResponse - (*RefreshStateByShardRequest)(nil), // 172: vtctldata.RefreshStateByShardRequest - (*RefreshStateByShardResponse)(nil), // 173: vtctldata.RefreshStateByShardResponse - (*ReloadSchemaRequest)(nil), // 174: vtctldata.ReloadSchemaRequest - (*ReloadSchemaResponse)(nil), // 175: vtctldata.ReloadSchemaResponse - (*ReloadSchemaKeyspaceRequest)(nil), // 176: vtctldata.ReloadSchemaKeyspaceRequest - (*ReloadSchemaKeyspaceResponse)(nil), // 177: vtctldata.ReloadSchemaKeyspaceResponse - (*ReloadSchemaShardRequest)(nil), // 178: vtctldata.ReloadSchemaShardRequest - (*ReloadSchemaShardResponse)(nil), // 179: vtctldata.ReloadSchemaShardResponse - (*RemoveBackupRequest)(nil), // 180: vtctldata.RemoveBackupRequest - (*RemoveBackupResponse)(nil), // 181: vtctldata.RemoveBackupResponse - (*RemoveKeyspaceCellRequest)(nil), // 182: vtctldata.RemoveKeyspaceCellRequest - (*RemoveKeyspaceCellResponse)(nil), // 183: vtctldata.RemoveKeyspaceCellResponse - (*RemoveShardCellRequest)(nil), // 184: vtctldata.RemoveShardCellRequest - (*RemoveShardCellResponse)(nil), // 185: vtctldata.RemoveShardCellResponse - (*ReparentTabletRequest)(nil), // 186: vtctldata.ReparentTabletRequest - (*ReparentTabletResponse)(nil), // 187: vtctldata.ReparentTabletResponse - (*ReshardCreateRequest)(nil), // 188: vtctldata.ReshardCreateRequest - (*RestoreFromBackupRequest)(nil), // 189: vtctldata.RestoreFromBackupRequest - (*RestoreFromBackupResponse)(nil), // 190: vtctldata.RestoreFromBackupResponse - (*RetrySchemaMigrationRequest)(nil), // 191: vtctldata.RetrySchemaMigrationRequest - (*RetrySchemaMigrationResponse)(nil), // 192: vtctldata.RetrySchemaMigrationResponse - (*RunHealthCheckRequest)(nil), // 193: vtctldata.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 194: vtctldata.RunHealthCheckResponse - (*SetKeyspaceDurabilityPolicyRequest)(nil), // 195: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*SetKeyspaceDurabilityPolicyResponse)(nil), // 196: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*SetKeyspaceShardingInfoRequest)(nil), // 197: vtctldata.SetKeyspaceShardingInfoRequest - (*SetKeyspaceShardingInfoResponse)(nil), // 198: vtctldata.SetKeyspaceShardingInfoResponse - (*SetShardIsPrimaryServingRequest)(nil), // 199: vtctldata.SetShardIsPrimaryServingRequest - (*SetShardIsPrimaryServingResponse)(nil), // 200: vtctldata.SetShardIsPrimaryServingResponse - (*SetShardTabletControlRequest)(nil), // 201: vtctldata.SetShardTabletControlRequest - (*SetShardTabletControlResponse)(nil), // 202: vtctldata.SetShardTabletControlResponse - (*SetWritableRequest)(nil), // 203: vtctldata.SetWritableRequest - (*SetWritableResponse)(nil), // 204: vtctldata.SetWritableResponse - (*ShardReplicationAddRequest)(nil), // 205: vtctldata.ShardReplicationAddRequest - (*ShardReplicationAddResponse)(nil), // 206: vtctldata.ShardReplicationAddResponse - (*ShardReplicationFixRequest)(nil), // 207: vtctldata.ShardReplicationFixRequest - (*ShardReplicationFixResponse)(nil), // 208: vtctldata.ShardReplicationFixResponse - (*ShardReplicationPositionsRequest)(nil), // 209: vtctldata.ShardReplicationPositionsRequest - (*ShardReplicationPositionsResponse)(nil), // 210: vtctldata.ShardReplicationPositionsResponse - (*ShardReplicationRemoveRequest)(nil), // 211: vtctldata.ShardReplicationRemoveRequest - (*ShardReplicationRemoveResponse)(nil), // 212: vtctldata.ShardReplicationRemoveResponse - (*SleepTabletRequest)(nil), // 213: vtctldata.SleepTabletRequest - (*SleepTabletResponse)(nil), // 214: vtctldata.SleepTabletResponse - (*SourceShardAddRequest)(nil), // 215: vtctldata.SourceShardAddRequest - (*SourceShardAddResponse)(nil), // 216: vtctldata.SourceShardAddResponse - (*SourceShardDeleteRequest)(nil), // 217: vtctldata.SourceShardDeleteRequest - (*SourceShardDeleteResponse)(nil), // 218: vtctldata.SourceShardDeleteResponse - (*StartReplicationRequest)(nil), // 219: vtctldata.StartReplicationRequest - (*StartReplicationResponse)(nil), // 220: vtctldata.StartReplicationResponse - (*StopReplicationRequest)(nil), // 221: vtctldata.StopReplicationRequest - (*StopReplicationResponse)(nil), // 222: vtctldata.StopReplicationResponse - (*TabletExternallyReparentedRequest)(nil), // 223: vtctldata.TabletExternallyReparentedRequest - (*TabletExternallyReparentedResponse)(nil), // 224: vtctldata.TabletExternallyReparentedResponse - (*UpdateCellInfoRequest)(nil), // 225: vtctldata.UpdateCellInfoRequest - (*UpdateCellInfoResponse)(nil), // 226: vtctldata.UpdateCellInfoResponse - (*UpdateCellsAliasRequest)(nil), // 227: vtctldata.UpdateCellsAliasRequest - (*UpdateCellsAliasResponse)(nil), // 228: vtctldata.UpdateCellsAliasResponse - (*ValidateRequest)(nil), // 229: vtctldata.ValidateRequest - (*ValidateResponse)(nil), // 230: vtctldata.ValidateResponse - (*ValidateKeyspaceRequest)(nil), // 231: vtctldata.ValidateKeyspaceRequest - (*ValidateKeyspaceResponse)(nil), // 232: vtctldata.ValidateKeyspaceResponse - (*ValidatePermissionsKeyspaceRequest)(nil), // 233: vtctldata.ValidatePermissionsKeyspaceRequest - (*ValidatePermissionsKeyspaceResponse)(nil), // 234: vtctldata.ValidatePermissionsKeyspaceResponse - (*ValidateSchemaKeyspaceRequest)(nil), // 235: vtctldata.ValidateSchemaKeyspaceRequest - (*ValidateSchemaKeyspaceResponse)(nil), // 236: vtctldata.ValidateSchemaKeyspaceResponse - (*ValidateShardRequest)(nil), // 237: vtctldata.ValidateShardRequest - (*ValidateShardResponse)(nil), // 238: vtctldata.ValidateShardResponse - (*ValidateVersionKeyspaceRequest)(nil), // 239: vtctldata.ValidateVersionKeyspaceRequest - (*ValidateVersionKeyspaceResponse)(nil), // 240: vtctldata.ValidateVersionKeyspaceResponse - (*ValidateVersionShardRequest)(nil), // 241: vtctldata.ValidateVersionShardRequest - (*ValidateVersionShardResponse)(nil), // 242: vtctldata.ValidateVersionShardResponse - (*ValidateVSchemaRequest)(nil), // 243: vtctldata.ValidateVSchemaRequest - (*ValidateVSchemaResponse)(nil), // 244: vtctldata.ValidateVSchemaResponse - (*VDiffCreateRequest)(nil), // 245: vtctldata.VDiffCreateRequest - (*VDiffCreateResponse)(nil), // 246: vtctldata.VDiffCreateResponse - (*VDiffDeleteRequest)(nil), // 247: vtctldata.VDiffDeleteRequest - (*VDiffDeleteResponse)(nil), // 248: vtctldata.VDiffDeleteResponse - (*VDiffResumeRequest)(nil), // 249: vtctldata.VDiffResumeRequest - (*VDiffResumeResponse)(nil), // 250: vtctldata.VDiffResumeResponse - (*VDiffShowRequest)(nil), // 251: vtctldata.VDiffShowRequest - (*VDiffShowResponse)(nil), // 252: vtctldata.VDiffShowResponse - (*VDiffStopRequest)(nil), // 253: vtctldata.VDiffStopRequest - (*VDiffStopResponse)(nil), // 254: vtctldata.VDiffStopResponse - (*WorkflowDeleteRequest)(nil), // 255: vtctldata.WorkflowDeleteRequest - (*WorkflowDeleteResponse)(nil), // 256: vtctldata.WorkflowDeleteResponse - (*WorkflowStatusRequest)(nil), // 257: vtctldata.WorkflowStatusRequest - (*WorkflowStatusResponse)(nil), // 258: vtctldata.WorkflowStatusResponse - (*WorkflowSwitchTrafficRequest)(nil), // 259: vtctldata.WorkflowSwitchTrafficRequest - (*WorkflowSwitchTrafficResponse)(nil), // 260: vtctldata.WorkflowSwitchTrafficResponse - (*WorkflowUpdateRequest)(nil), // 261: vtctldata.WorkflowUpdateRequest - (*WorkflowUpdateResponse)(nil), // 262: vtctldata.WorkflowUpdateResponse - (*GetMirrorRulesRequest)(nil), // 263: vtctldata.GetMirrorRulesRequest - (*GetMirrorRulesResponse)(nil), // 264: vtctldata.GetMirrorRulesResponse - (*WorkflowMirrorTrafficRequest)(nil), // 265: vtctldata.WorkflowMirrorTrafficRequest - (*WorkflowMirrorTrafficResponse)(nil), // 266: vtctldata.WorkflowMirrorTrafficResponse - nil, // 267: vtctldata.WorkflowOptions.ConfigEntry - nil, // 268: vtctldata.Workflow.ShardStreamsEntry - (*Workflow_ReplicationLocation)(nil), // 269: vtctldata.Workflow.ReplicationLocation - (*Workflow_ShardStream)(nil), // 270: vtctldata.Workflow.ShardStream - (*Workflow_Stream)(nil), // 271: vtctldata.Workflow.Stream - (*Workflow_Stream_CopyState)(nil), // 272: vtctldata.Workflow.Stream.CopyState - (*Workflow_Stream_Log)(nil), // 273: vtctldata.Workflow.Stream.Log - (*Workflow_Stream_ThrottlerStatus)(nil), // 274: vtctldata.Workflow.Stream.ThrottlerStatus - nil, // 275: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - nil, // 276: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - (*ApplyVSchemaResponse_ParamList)(nil), // 277: vtctldata.ApplyVSchemaResponse.ParamList - nil, // 278: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 279: vtctldata.ChangeTabletTagsRequest.TagsEntry - nil, // 280: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - nil, // 281: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - nil, // 282: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 283: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 284: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - nil, // 285: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 286: vtctldata.GetCellsAliasesResponse.AliasesEntry - nil, // 287: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - nil, // 288: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 289: vtctldata.GetSrvKeyspaceNamesResponse.NameList - nil, // 290: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - nil, // 291: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - nil, // 292: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - (*MoveTablesCreateResponse_TabletInfo)(nil), // 293: vtctldata.MoveTablesCreateResponse.TabletInfo - nil, // 294: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 295: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - nil, // 296: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - nil, // 297: vtctldata.ValidateResponse.ResultsByKeyspaceEntry - nil, // 298: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - nil, // 299: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - nil, // 300: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - nil, // 301: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - nil, // 302: vtctldata.VDiffShowResponse.TabletResponsesEntry - (*WorkflowDeleteResponse_TabletInfo)(nil), // 303: vtctldata.WorkflowDeleteResponse.TabletInfo - (*WorkflowStatusResponse_TableCopyState)(nil), // 304: vtctldata.WorkflowStatusResponse.TableCopyState - (*WorkflowStatusResponse_ShardStreamState)(nil), // 305: vtctldata.WorkflowStatusResponse.ShardStreamState - (*WorkflowStatusResponse_ShardStreams)(nil), // 306: vtctldata.WorkflowStatusResponse.ShardStreams - nil, // 307: vtctldata.WorkflowStatusResponse.TableCopyStateEntry - nil, // 308: vtctldata.WorkflowStatusResponse.ShardStreamsEntry - (*WorkflowUpdateResponse_TabletInfo)(nil), // 309: vtctldata.WorkflowUpdateResponse.TabletInfo - (*logutil.Event)(nil), // 310: logutil.Event - (tabletmanagerdata.TabletSelectionPreference)(0), // 311: tabletmanagerdata.TabletSelectionPreference - (*topodata.Keyspace)(nil), // 312: topodata.Keyspace - (*vttime.Time)(nil), // 313: vttime.Time - (*topodata.TabletAlias)(nil), // 314: topodata.TabletAlias - (*vttime.Duration)(nil), // 315: vttime.Duration - (*topodata.Shard)(nil), // 316: topodata.Shard - (*topodata.CellInfo)(nil), // 317: topodata.CellInfo - (*vschema.KeyspaceRoutingRules)(nil), // 318: vschema.KeyspaceRoutingRules - (*vschema.RoutingRules)(nil), // 319: vschema.RoutingRules - (*vschema.ShardRoutingRules)(nil), // 320: vschema.ShardRoutingRules - (*vtrpc.CallerID)(nil), // 321: vtrpc.CallerID - (*vschema.Keyspace)(nil), // 322: vschema.Keyspace - (topodata.TabletType)(0), // 323: topodata.TabletType - (*topodata.Tablet)(nil), // 324: topodata.Tablet - (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 325: tabletmanagerdata.CheckThrottlerResponse - (topodata.KeyspaceType)(0), // 326: topodata.KeyspaceType - (*query.QueryResult)(nil), // 327: query.QueryResult - (*tabletmanagerdata.ExecuteHookRequest)(nil), // 328: tabletmanagerdata.ExecuteHookRequest - (*tabletmanagerdata.ExecuteHookResponse)(nil), // 329: tabletmanagerdata.ExecuteHookResponse - (*mysqlctl.BackupInfo)(nil), // 330: mysqlctl.BackupInfo - (*replicationdata.FullStatus)(nil), // 331: replicationdata.FullStatus - (*tabletmanagerdata.Permissions)(nil), // 332: tabletmanagerdata.Permissions - (*tabletmanagerdata.SchemaDefinition)(nil), // 333: tabletmanagerdata.SchemaDefinition - (*topodata.ThrottledAppRule)(nil), // 334: topodata.ThrottledAppRule - (*vschema.SrvVSchema)(nil), // 335: vschema.SrvVSchema - (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 336: tabletmanagerdata.GetThrottlerStatusResponse - (*query.TransactionMetadata)(nil), // 337: query.TransactionMetadata - (*query.Target)(nil), // 338: query.Target - (*topodata.ShardReplicationError)(nil), // 339: topodata.ShardReplicationError - (*topodata.KeyRange)(nil), // 340: topodata.KeyRange - (*topodata.CellsAlias)(nil), // 341: topodata.CellsAlias - (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 342: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*vschema.MirrorRules)(nil), // 343: vschema.MirrorRules - (*topodata.Shard_TabletControl)(nil), // 344: topodata.Shard.TabletControl - (*binlogdata.BinlogSource)(nil), // 345: binlogdata.BinlogSource - (*topodata.ShardReplication)(nil), // 346: topodata.ShardReplication - (*topodata.SrvKeyspace)(nil), // 347: topodata.SrvKeyspace - (*replicationdata.Status)(nil), // 348: replicationdata.Status - (*tabletmanagerdata.VDiffResponse)(nil), // 349: tabletmanagerdata.VDiffResponse + (*LookupVindexCompleteRequest)(nil), // 141: vtctldata.LookupVindexCompleteRequest + (*LookupVindexCompleteResponse)(nil), // 142: vtctldata.LookupVindexCompleteResponse + (*LookupVindexCreateRequest)(nil), // 143: vtctldata.LookupVindexCreateRequest + (*LookupVindexCreateResponse)(nil), // 144: vtctldata.LookupVindexCreateResponse + (*LookupVindexExternalizeRequest)(nil), // 145: vtctldata.LookupVindexExternalizeRequest + (*LookupVindexExternalizeResponse)(nil), // 146: vtctldata.LookupVindexExternalizeResponse + (*LookupVindexInternalizeRequest)(nil), // 147: vtctldata.LookupVindexInternalizeRequest + (*LookupVindexInternalizeResponse)(nil), // 148: vtctldata.LookupVindexInternalizeResponse + (*MaterializeCreateRequest)(nil), // 149: vtctldata.MaterializeCreateRequest + (*MaterializeCreateResponse)(nil), // 150: vtctldata.MaterializeCreateResponse + (*MigrateCreateRequest)(nil), // 151: vtctldata.MigrateCreateRequest + (*MigrateCompleteRequest)(nil), // 152: vtctldata.MigrateCompleteRequest + (*MigrateCompleteResponse)(nil), // 153: vtctldata.MigrateCompleteResponse + (*MountRegisterRequest)(nil), // 154: vtctldata.MountRegisterRequest + (*MountRegisterResponse)(nil), // 155: vtctldata.MountRegisterResponse + (*MountUnregisterRequest)(nil), // 156: vtctldata.MountUnregisterRequest + (*MountUnregisterResponse)(nil), // 157: vtctldata.MountUnregisterResponse + (*MountShowRequest)(nil), // 158: vtctldata.MountShowRequest + (*MountShowResponse)(nil), // 159: vtctldata.MountShowResponse + (*MountListRequest)(nil), // 160: vtctldata.MountListRequest + (*MountListResponse)(nil), // 161: vtctldata.MountListResponse + (*MoveTablesCreateRequest)(nil), // 162: vtctldata.MoveTablesCreateRequest + (*MoveTablesCreateResponse)(nil), // 163: vtctldata.MoveTablesCreateResponse + (*MoveTablesCompleteRequest)(nil), // 164: vtctldata.MoveTablesCompleteRequest + (*MoveTablesCompleteResponse)(nil), // 165: vtctldata.MoveTablesCompleteResponse + (*PingTabletRequest)(nil), // 166: vtctldata.PingTabletRequest + (*PingTabletResponse)(nil), // 167: vtctldata.PingTabletResponse + (*PlannedReparentShardRequest)(nil), // 168: vtctldata.PlannedReparentShardRequest + (*PlannedReparentShardResponse)(nil), // 169: vtctldata.PlannedReparentShardResponse + (*RebuildKeyspaceGraphRequest)(nil), // 170: vtctldata.RebuildKeyspaceGraphRequest + (*RebuildKeyspaceGraphResponse)(nil), // 171: vtctldata.RebuildKeyspaceGraphResponse + (*RebuildVSchemaGraphRequest)(nil), // 172: vtctldata.RebuildVSchemaGraphRequest + (*RebuildVSchemaGraphResponse)(nil), // 173: vtctldata.RebuildVSchemaGraphResponse + (*RefreshStateRequest)(nil), // 174: vtctldata.RefreshStateRequest + (*RefreshStateResponse)(nil), // 175: vtctldata.RefreshStateResponse + (*RefreshStateByShardRequest)(nil), // 176: vtctldata.RefreshStateByShardRequest + (*RefreshStateByShardResponse)(nil), // 177: vtctldata.RefreshStateByShardResponse + (*ReloadSchemaRequest)(nil), // 178: vtctldata.ReloadSchemaRequest + (*ReloadSchemaResponse)(nil), // 179: vtctldata.ReloadSchemaResponse + (*ReloadSchemaKeyspaceRequest)(nil), // 180: vtctldata.ReloadSchemaKeyspaceRequest + (*ReloadSchemaKeyspaceResponse)(nil), // 181: vtctldata.ReloadSchemaKeyspaceResponse + (*ReloadSchemaShardRequest)(nil), // 182: vtctldata.ReloadSchemaShardRequest + (*ReloadSchemaShardResponse)(nil), // 183: vtctldata.ReloadSchemaShardResponse + (*RemoveBackupRequest)(nil), // 184: vtctldata.RemoveBackupRequest + (*RemoveBackupResponse)(nil), // 185: vtctldata.RemoveBackupResponse + (*RemoveKeyspaceCellRequest)(nil), // 186: vtctldata.RemoveKeyspaceCellRequest + (*RemoveKeyspaceCellResponse)(nil), // 187: vtctldata.RemoveKeyspaceCellResponse + (*RemoveShardCellRequest)(nil), // 188: vtctldata.RemoveShardCellRequest + (*RemoveShardCellResponse)(nil), // 189: vtctldata.RemoveShardCellResponse + (*ReparentTabletRequest)(nil), // 190: vtctldata.ReparentTabletRequest + (*ReparentTabletResponse)(nil), // 191: vtctldata.ReparentTabletResponse + (*ReshardCreateRequest)(nil), // 192: vtctldata.ReshardCreateRequest + (*RestoreFromBackupRequest)(nil), // 193: vtctldata.RestoreFromBackupRequest + (*RestoreFromBackupResponse)(nil), // 194: vtctldata.RestoreFromBackupResponse + (*RetrySchemaMigrationRequest)(nil), // 195: vtctldata.RetrySchemaMigrationRequest + (*RetrySchemaMigrationResponse)(nil), // 196: vtctldata.RetrySchemaMigrationResponse + (*RunHealthCheckRequest)(nil), // 197: vtctldata.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 198: vtctldata.RunHealthCheckResponse + (*SetKeyspaceDurabilityPolicyRequest)(nil), // 199: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*SetKeyspaceDurabilityPolicyResponse)(nil), // 200: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*SetKeyspaceShardingInfoRequest)(nil), // 201: vtctldata.SetKeyspaceShardingInfoRequest + (*SetKeyspaceShardingInfoResponse)(nil), // 202: vtctldata.SetKeyspaceShardingInfoResponse + (*SetShardIsPrimaryServingRequest)(nil), // 203: vtctldata.SetShardIsPrimaryServingRequest + (*SetShardIsPrimaryServingResponse)(nil), // 204: vtctldata.SetShardIsPrimaryServingResponse + (*SetShardTabletControlRequest)(nil), // 205: vtctldata.SetShardTabletControlRequest + (*SetShardTabletControlResponse)(nil), // 206: vtctldata.SetShardTabletControlResponse + (*SetWritableRequest)(nil), // 207: vtctldata.SetWritableRequest + (*SetWritableResponse)(nil), // 208: vtctldata.SetWritableResponse + (*ShardReplicationAddRequest)(nil), // 209: vtctldata.ShardReplicationAddRequest + (*ShardReplicationAddResponse)(nil), // 210: vtctldata.ShardReplicationAddResponse + (*ShardReplicationFixRequest)(nil), // 211: vtctldata.ShardReplicationFixRequest + (*ShardReplicationFixResponse)(nil), // 212: vtctldata.ShardReplicationFixResponse + (*ShardReplicationPositionsRequest)(nil), // 213: vtctldata.ShardReplicationPositionsRequest + (*ShardReplicationPositionsResponse)(nil), // 214: vtctldata.ShardReplicationPositionsResponse + (*ShardReplicationRemoveRequest)(nil), // 215: vtctldata.ShardReplicationRemoveRequest + (*ShardReplicationRemoveResponse)(nil), // 216: vtctldata.ShardReplicationRemoveResponse + (*SleepTabletRequest)(nil), // 217: vtctldata.SleepTabletRequest + (*SleepTabletResponse)(nil), // 218: vtctldata.SleepTabletResponse + (*SourceShardAddRequest)(nil), // 219: vtctldata.SourceShardAddRequest + (*SourceShardAddResponse)(nil), // 220: vtctldata.SourceShardAddResponse + (*SourceShardDeleteRequest)(nil), // 221: vtctldata.SourceShardDeleteRequest + (*SourceShardDeleteResponse)(nil), // 222: vtctldata.SourceShardDeleteResponse + (*StartReplicationRequest)(nil), // 223: vtctldata.StartReplicationRequest + (*StartReplicationResponse)(nil), // 224: vtctldata.StartReplicationResponse + (*StopReplicationRequest)(nil), // 225: vtctldata.StopReplicationRequest + (*StopReplicationResponse)(nil), // 226: vtctldata.StopReplicationResponse + (*TabletExternallyReparentedRequest)(nil), // 227: vtctldata.TabletExternallyReparentedRequest + (*TabletExternallyReparentedResponse)(nil), // 228: vtctldata.TabletExternallyReparentedResponse + (*UpdateCellInfoRequest)(nil), // 229: vtctldata.UpdateCellInfoRequest + (*UpdateCellInfoResponse)(nil), // 230: vtctldata.UpdateCellInfoResponse + (*UpdateCellsAliasRequest)(nil), // 231: vtctldata.UpdateCellsAliasRequest + (*UpdateCellsAliasResponse)(nil), // 232: vtctldata.UpdateCellsAliasResponse + (*ValidateRequest)(nil), // 233: vtctldata.ValidateRequest + (*ValidateResponse)(nil), // 234: vtctldata.ValidateResponse + (*ValidateKeyspaceRequest)(nil), // 235: vtctldata.ValidateKeyspaceRequest + (*ValidateKeyspaceResponse)(nil), // 236: vtctldata.ValidateKeyspaceResponse + (*ValidatePermissionsKeyspaceRequest)(nil), // 237: vtctldata.ValidatePermissionsKeyspaceRequest + (*ValidatePermissionsKeyspaceResponse)(nil), // 238: vtctldata.ValidatePermissionsKeyspaceResponse + (*ValidateSchemaKeyspaceRequest)(nil), // 239: vtctldata.ValidateSchemaKeyspaceRequest + (*ValidateSchemaKeyspaceResponse)(nil), // 240: vtctldata.ValidateSchemaKeyspaceResponse + (*ValidateShardRequest)(nil), // 241: vtctldata.ValidateShardRequest + (*ValidateShardResponse)(nil), // 242: vtctldata.ValidateShardResponse + (*ValidateVersionKeyspaceRequest)(nil), // 243: vtctldata.ValidateVersionKeyspaceRequest + (*ValidateVersionKeyspaceResponse)(nil), // 244: vtctldata.ValidateVersionKeyspaceResponse + (*ValidateVersionShardRequest)(nil), // 245: vtctldata.ValidateVersionShardRequest + (*ValidateVersionShardResponse)(nil), // 246: vtctldata.ValidateVersionShardResponse + (*ValidateVSchemaRequest)(nil), // 247: vtctldata.ValidateVSchemaRequest + (*ValidateVSchemaResponse)(nil), // 248: vtctldata.ValidateVSchemaResponse + (*VDiffCreateRequest)(nil), // 249: vtctldata.VDiffCreateRequest + (*VDiffCreateResponse)(nil), // 250: vtctldata.VDiffCreateResponse + (*VDiffDeleteRequest)(nil), // 251: vtctldata.VDiffDeleteRequest + (*VDiffDeleteResponse)(nil), // 252: vtctldata.VDiffDeleteResponse + (*VDiffResumeRequest)(nil), // 253: vtctldata.VDiffResumeRequest + (*VDiffResumeResponse)(nil), // 254: vtctldata.VDiffResumeResponse + (*VDiffShowRequest)(nil), // 255: vtctldata.VDiffShowRequest + (*VDiffShowResponse)(nil), // 256: vtctldata.VDiffShowResponse + (*VDiffStopRequest)(nil), // 257: vtctldata.VDiffStopRequest + (*VDiffStopResponse)(nil), // 258: vtctldata.VDiffStopResponse + (*WorkflowDeleteRequest)(nil), // 259: vtctldata.WorkflowDeleteRequest + (*WorkflowDeleteResponse)(nil), // 260: vtctldata.WorkflowDeleteResponse + (*WorkflowStatusRequest)(nil), // 261: vtctldata.WorkflowStatusRequest + (*WorkflowStatusResponse)(nil), // 262: vtctldata.WorkflowStatusResponse + (*WorkflowSwitchTrafficRequest)(nil), // 263: vtctldata.WorkflowSwitchTrafficRequest + (*WorkflowSwitchTrafficResponse)(nil), // 264: vtctldata.WorkflowSwitchTrafficResponse + (*WorkflowUpdateRequest)(nil), // 265: vtctldata.WorkflowUpdateRequest + (*WorkflowUpdateResponse)(nil), // 266: vtctldata.WorkflowUpdateResponse + (*GetMirrorRulesRequest)(nil), // 267: vtctldata.GetMirrorRulesRequest + (*GetMirrorRulesResponse)(nil), // 268: vtctldata.GetMirrorRulesResponse + (*WorkflowMirrorTrafficRequest)(nil), // 269: vtctldata.WorkflowMirrorTrafficRequest + (*WorkflowMirrorTrafficResponse)(nil), // 270: vtctldata.WorkflowMirrorTrafficResponse + nil, // 271: vtctldata.WorkflowOptions.ConfigEntry + nil, // 272: vtctldata.Workflow.ShardStreamsEntry + (*Workflow_ReplicationLocation)(nil), // 273: vtctldata.Workflow.ReplicationLocation + (*Workflow_ShardStream)(nil), // 274: vtctldata.Workflow.ShardStream + (*Workflow_Stream)(nil), // 275: vtctldata.Workflow.Stream + (*Workflow_Stream_CopyState)(nil), // 276: vtctldata.Workflow.Stream.CopyState + (*Workflow_Stream_Log)(nil), // 277: vtctldata.Workflow.Stream.Log + (*Workflow_Stream_ThrottlerStatus)(nil), // 278: vtctldata.Workflow.Stream.ThrottlerStatus + nil, // 279: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + nil, // 280: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + (*ApplyVSchemaResponse_ParamList)(nil), // 281: vtctldata.ApplyVSchemaResponse.ParamList + nil, // 282: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 283: vtctldata.ChangeTabletTagsRequest.TagsEntry + nil, // 284: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + nil, // 285: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + nil, // 286: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 287: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 288: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + nil, // 289: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 290: vtctldata.GetCellsAliasesResponse.AliasesEntry + nil, // 291: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + nil, // 292: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 293: vtctldata.GetSrvKeyspaceNamesResponse.NameList + nil, // 294: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + nil, // 295: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + nil, // 296: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + (*MoveTablesCreateResponse_TabletInfo)(nil), // 297: vtctldata.MoveTablesCreateResponse.TabletInfo + nil, // 298: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 299: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + nil, // 300: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + nil, // 301: vtctldata.ValidateResponse.ResultsByKeyspaceEntry + nil, // 302: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + nil, // 303: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + nil, // 304: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + nil, // 305: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + nil, // 306: vtctldata.VDiffShowResponse.TabletResponsesEntry + (*WorkflowDeleteResponse_TabletInfo)(nil), // 307: vtctldata.WorkflowDeleteResponse.TabletInfo + (*WorkflowStatusResponse_TableCopyState)(nil), // 308: vtctldata.WorkflowStatusResponse.TableCopyState + (*WorkflowStatusResponse_ShardStreamState)(nil), // 309: vtctldata.WorkflowStatusResponse.ShardStreamState + (*WorkflowStatusResponse_ShardStreams)(nil), // 310: vtctldata.WorkflowStatusResponse.ShardStreams + nil, // 311: vtctldata.WorkflowStatusResponse.TableCopyStateEntry + nil, // 312: vtctldata.WorkflowStatusResponse.ShardStreamsEntry + (*WorkflowUpdateResponse_TabletInfo)(nil), // 313: vtctldata.WorkflowUpdateResponse.TabletInfo + (*logutil.Event)(nil), // 314: logutil.Event + (tabletmanagerdata.TabletSelectionPreference)(0), // 315: tabletmanagerdata.TabletSelectionPreference + (*topodata.Keyspace)(nil), // 316: topodata.Keyspace + (*vttime.Time)(nil), // 317: vttime.Time + (*topodata.TabletAlias)(nil), // 318: topodata.TabletAlias + (*vttime.Duration)(nil), // 319: vttime.Duration + (*topodata.Shard)(nil), // 320: topodata.Shard + (*topodata.CellInfo)(nil), // 321: topodata.CellInfo + (*vschema.KeyspaceRoutingRules)(nil), // 322: vschema.KeyspaceRoutingRules + (*vschema.RoutingRules)(nil), // 323: vschema.RoutingRules + (*vschema.ShardRoutingRules)(nil), // 324: vschema.ShardRoutingRules + (*vtrpc.CallerID)(nil), // 325: vtrpc.CallerID + (*vschema.Keyspace)(nil), // 326: vschema.Keyspace + (topodata.TabletType)(0), // 327: topodata.TabletType + (*topodata.Tablet)(nil), // 328: topodata.Tablet + (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 329: tabletmanagerdata.CheckThrottlerResponse + (topodata.KeyspaceType)(0), // 330: topodata.KeyspaceType + (*query.QueryResult)(nil), // 331: query.QueryResult + (*tabletmanagerdata.ExecuteHookRequest)(nil), // 332: tabletmanagerdata.ExecuteHookRequest + (*tabletmanagerdata.ExecuteHookResponse)(nil), // 333: tabletmanagerdata.ExecuteHookResponse + (*mysqlctl.BackupInfo)(nil), // 334: mysqlctl.BackupInfo + (*replicationdata.FullStatus)(nil), // 335: replicationdata.FullStatus + (*tabletmanagerdata.Permissions)(nil), // 336: tabletmanagerdata.Permissions + (*tabletmanagerdata.SchemaDefinition)(nil), // 337: tabletmanagerdata.SchemaDefinition + (*topodata.ThrottledAppRule)(nil), // 338: topodata.ThrottledAppRule + (*vschema.SrvVSchema)(nil), // 339: vschema.SrvVSchema + (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 340: tabletmanagerdata.GetThrottlerStatusResponse + (*query.TransactionMetadata)(nil), // 341: query.TransactionMetadata + (*query.Target)(nil), // 342: query.Target + (*topodata.ShardReplicationError)(nil), // 343: topodata.ShardReplicationError + (*topodata.KeyRange)(nil), // 344: topodata.KeyRange + (*topodata.CellsAlias)(nil), // 345: topodata.CellsAlias + (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 346: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*vschema.MirrorRules)(nil), // 347: vschema.MirrorRules + (*topodata.Shard_TabletControl)(nil), // 348: topodata.Shard.TabletControl + (*binlogdata.BinlogSource)(nil), // 349: binlogdata.BinlogSource + (*topodata.ShardReplication)(nil), // 350: topodata.ShardReplication + (*topodata.SrvKeyspace)(nil), // 351: topodata.SrvKeyspace + (*replicationdata.Status)(nil), // 352: replicationdata.Status + (*tabletmanagerdata.VDiffResponse)(nil), // 353: tabletmanagerdata.VDiffResponse } var file_vtctldata_proto_depIdxs = []int32{ - 310, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event + 314, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event 7, // 1: vtctldata.MaterializeSettings.table_settings:type_name -> vtctldata.TableMaterializeSettings 0, // 2: vtctldata.MaterializeSettings.materialization_intent:type_name -> vtctldata.MaterializationIntent - 311, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 315, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 12, // 4: vtctldata.MaterializeSettings.workflow_options:type_name -> vtctldata.WorkflowOptions - 312, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace + 316, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace 3, // 6: vtctldata.SchemaMigration.strategy:type_name -> vtctldata.SchemaMigration.Strategy - 313, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time - 313, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time - 313, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time - 313, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time - 313, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time - 313, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time - 313, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time + 317, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time + 317, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time + 317, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time + 317, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time + 317, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time + 317, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time + 317, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time 4, // 14: vtctldata.SchemaMigration.status:type_name -> vtctldata.SchemaMigration.Status - 314, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias - 315, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration - 313, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time - 313, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time - 313, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time - 313, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time - 316, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard + 318, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias + 319, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration + 317, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time + 317, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time + 317, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time + 317, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time + 320, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard 2, // 22: vtctldata.WorkflowOptions.sharded_auto_increment_handling:type_name -> vtctldata.ShardedAutoIncrementHandling - 267, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry - 269, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation - 269, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation - 268, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry + 271, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry + 273, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation + 273, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation + 272, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry 12, // 27: vtctldata.Workflow.options:type_name -> vtctldata.WorkflowOptions - 317, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 318, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 318, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 319, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules - 320, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 315, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration - 321, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID - 275, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - 322, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace - 322, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 276, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - 314, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 310, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event - 278, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - 314, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias - 279, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry - 280, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry - 281, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry - 314, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias - 323, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType - 324, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet - 324, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet - 314, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias - 325, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse - 282, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - 283, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - 314, // 56: vtctldata.CopySchemaShardRequest.source_tablet_alias:type_name -> topodata.TabletAlias - 315, // 57: vtctldata.CopySchemaShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 326, // 58: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType - 313, // 59: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time + 321, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 322, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 322, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 323, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules + 324, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 319, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration + 325, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID + 279, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + 326, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace + 326, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 280, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + 318, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 314, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event + 282, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + 318, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias + 283, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry + 284, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + 285, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + 318, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias + 327, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType + 328, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet + 328, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet + 318, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias + 329, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse + 286, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + 287, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + 318, // 56: vtctldata.CopySchemaShardRequest.source_tablet_alias:type_name -> topodata.TabletAlias + 319, // 57: vtctldata.CopySchemaShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 330, // 58: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType + 317, // 59: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time 9, // 60: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace 9, // 61: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace 11, // 62: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard 11, // 63: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard - 314, // 64: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 314, // 65: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 314, // 66: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias - 315, // 67: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 314, // 68: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 314, // 69: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 310, // 70: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event - 314, // 71: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias - 327, // 72: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 314, // 73: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 327, // 74: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult - 314, // 75: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias - 328, // 76: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest - 329, // 77: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse - 314, // 78: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 327, // 79: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult - 284, // 80: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - 285, // 81: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - 330, // 82: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo - 317, // 83: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 286, // 84: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry - 314, // 85: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 331, // 86: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus + 318, // 64: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 318, // 65: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 318, // 66: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias + 319, // 67: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 318, // 68: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 318, // 69: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 314, // 70: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event + 318, // 71: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias + 331, // 72: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 318, // 73: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 331, // 74: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult + 318, // 75: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias + 332, // 76: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest + 333, // 77: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse + 318, // 78: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 331, // 79: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult + 288, // 80: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + 289, // 81: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + 334, // 82: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo + 321, // 83: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 290, // 84: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry + 318, // 85: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 335, // 86: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus 9, // 87: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace 9, // 88: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 314, // 89: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias - 332, // 90: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 318, // 91: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 319, // 92: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules - 314, // 93: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 333, // 94: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition + 318, // 89: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias + 336, // 90: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions + 322, // 91: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 323, // 92: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules + 318, // 93: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 337, // 94: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition 4, // 95: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status - 315, // 96: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration + 319, // 96: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration 1, // 97: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering 10, // 98: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration - 287, // 99: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + 291, // 99: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry 11, // 100: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard - 320, // 101: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 288, // 102: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - 290, // 103: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - 334, // 104: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule - 335, // 105: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema - 291, // 106: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - 314, // 107: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 324, // 108: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet - 314, // 109: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 323, // 110: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType - 324, // 111: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet - 314, // 112: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 336, // 113: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse + 324, // 101: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 292, // 102: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + 294, // 103: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + 338, // 104: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule + 339, // 105: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema + 295, // 106: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + 318, // 107: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 328, // 108: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet + 318, // 109: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 327, // 110: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType + 328, // 111: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet + 318, // 112: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 340, // 113: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse 123, // 114: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell - 337, // 115: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata - 337, // 116: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata + 341, // 115: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 341, // 116: vtctldata.GetTransactionInfoResponse.metadata:type_name -> query.TransactionMetadata 127, // 117: vtctldata.GetTransactionInfoResponse.shard_states:type_name -> vtctldata.ShardTransactionState - 338, // 118: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target - 314, // 119: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias - 322, // 120: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 342, // 118: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target + 318, // 119: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias + 326, // 120: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace 13, // 121: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow - 314, // 122: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias - 315, // 123: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration - 310, // 124: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event - 292, // 125: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - 322, // 126: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace - 323, // 127: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType - 311, // 128: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 318, // 122: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias + 319, // 123: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration + 314, // 124: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event + 296, // 125: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + 326, // 126: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace + 327, // 127: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType + 315, // 128: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 8, // 129: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings - 323, // 130: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType - 311, // 131: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 323, // 132: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType - 311, // 133: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 327, // 130: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType + 315, // 131: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 327, // 132: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType + 315, // 133: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 12, // 134: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 293, // 135: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo - 314, // 136: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 137: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 314, // 138: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias - 315, // 139: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 315, // 140: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration - 314, // 141: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias - 314, // 142: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 310, // 143: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event - 314, // 144: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 145: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 146: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event - 310, // 147: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event - 314, // 148: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias - 314, // 149: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias - 323, // 150: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType - 311, // 151: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 297, // 135: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo + 318, // 136: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 137: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 318, // 138: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias + 319, // 139: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 319, // 140: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration + 318, // 141: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 318, // 142: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 314, // 143: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event + 318, // 144: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 145: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 314, // 146: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event + 314, // 147: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event + 318, // 148: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias + 318, // 149: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias + 327, // 150: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType + 315, // 151: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference 12, // 152: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 314, // 153: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 313, // 154: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 313, // 155: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 314, // 156: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 310, // 157: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 294, // 158: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - 314, // 159: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias - 312, // 160: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace - 312, // 161: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace - 316, // 162: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard - 323, // 163: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType - 316, // 164: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard - 314, // 165: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 166: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias - 339, // 167: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError - 295, // 168: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - 296, // 169: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - 314, // 170: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 171: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 315, // 172: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration - 340, // 173: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange - 316, // 174: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard - 316, // 175: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard - 314, // 176: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 177: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 178: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias - 314, // 179: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias - 314, // 180: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias - 317, // 181: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 317, // 182: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 341, // 183: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias - 341, // 184: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias - 297, // 185: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry - 298, // 186: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - 299, // 187: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - 300, // 188: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - 301, // 189: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - 323, // 190: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType - 311, // 191: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 315, // 192: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration - 315, // 193: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration - 315, // 194: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration - 302, // 195: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry - 303, // 196: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo - 307, // 197: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry - 308, // 198: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry - 323, // 199: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType - 315, // 200: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration - 315, // 201: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration - 342, // 202: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest - 309, // 203: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo - 343, // 204: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules - 323, // 205: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType - 270, // 206: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream - 271, // 207: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream - 344, // 208: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl - 314, // 209: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias - 345, // 210: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource - 313, // 211: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time - 313, // 212: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time - 272, // 213: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState - 273, // 214: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log - 274, // 215: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus - 323, // 216: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType - 311, // 217: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 313, // 218: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time - 313, // 219: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time - 313, // 220: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time - 277, // 221: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList + 318, // 153: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 317, // 154: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 317, // 155: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 318, // 156: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 314, // 157: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 298, // 158: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + 318, // 159: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias + 316, // 160: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace + 316, // 161: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace + 320, // 162: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard + 327, // 163: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType + 320, // 164: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard + 318, // 165: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 166: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias + 343, // 167: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError + 299, // 168: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + 300, // 169: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + 318, // 170: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 171: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 319, // 172: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration + 344, // 173: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange + 320, // 174: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard + 320, // 175: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard + 318, // 176: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 177: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 318, // 178: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias + 318, // 179: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias + 318, // 180: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias + 321, // 181: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 321, // 182: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 345, // 183: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias + 345, // 184: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias + 301, // 185: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry + 302, // 186: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + 303, // 187: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + 304, // 188: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + 305, // 189: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + 327, // 190: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType + 315, // 191: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 319, // 192: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration + 319, // 193: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration + 319, // 194: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration + 306, // 195: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry + 307, // 196: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo + 311, // 197: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry + 312, // 198: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry + 327, // 199: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType + 319, // 200: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration + 319, // 201: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration + 346, // 202: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest + 313, // 203: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo + 347, // 204: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules + 327, // 205: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType + 274, // 206: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream + 275, // 207: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream + 348, // 208: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl + 318, // 209: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias + 349, // 210: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource + 317, // 211: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time + 317, // 212: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time + 276, // 213: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState + 277, // 214: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log + 278, // 215: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus + 327, // 216: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType + 315, // 217: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 317, // 218: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time + 317, // 219: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time + 317, // 220: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time + 281, // 221: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList 11, // 222: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard - 341, // 223: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias - 346, // 224: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication - 289, // 225: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList - 347, // 226: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace - 335, // 227: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema - 314, // 228: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 348, // 229: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status - 324, // 230: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet - 232, // 231: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse - 238, // 232: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 238, // 233: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 238, // 234: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 238, // 235: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 349, // 236: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse - 314, // 237: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 314, // 238: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias - 305, // 239: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState - 304, // 240: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState - 306, // 241: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams - 314, // 242: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 345, // 223: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias + 350, // 224: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication + 293, // 225: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList + 351, // 226: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace + 339, // 227: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema + 318, // 228: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 352, // 229: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status + 328, // 230: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet + 236, // 231: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse + 242, // 232: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 242, // 233: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 242, // 234: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 242, // 235: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 353, // 236: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse + 318, // 237: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 318, // 238: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias + 309, // 239: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState + 308, // 240: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState + 310, // 241: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams + 318, // 242: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias 243, // [243:243] is the sub-list for method output_type 243, // [243:243] is the sub-list for method input_type 243, // [243:243] is the sub-list for extension type_name @@ -20284,14 +20532,14 @@ func file_vtctldata_proto_init() { return } file_vtctldata_proto_msgTypes[23].OneofWrappers = []any{} - file_vtctldata_proto_msgTypes[240].OneofWrappers = []any{} + file_vtctldata_proto_msgTypes[244].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vtctldata_proto_rawDesc, NumEnums: 5, - NumMessages: 305, + NumMessages: 309, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go index f50e5e25614..c9ae1183793 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -3100,6 +3100,41 @@ func (m *LaunchSchemaMigrationResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *LookupVindexCompleteRequest) CloneVT() *LookupVindexCompleteRequest { + if m == nil { + return (*LookupVindexCompleteRequest)(nil) + } + r := new(LookupVindexCompleteRequest) + r.Keyspace = m.Keyspace + r.Name = m.Name + r.TableKeyspace = m.TableKeyspace + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LookupVindexCompleteRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *LookupVindexCompleteResponse) CloneVT() *LookupVindexCompleteResponse { + if m == nil { + return (*LookupVindexCompleteResponse)(nil) + } + r := new(LookupVindexCompleteResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LookupVindexCompleteResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *LookupVindexCreateRequest) CloneVT() *LookupVindexCreateRequest { if m == nil { return (*LookupVindexCreateRequest)(nil) @@ -3155,6 +3190,7 @@ func (m *LookupVindexExternalizeRequest) CloneVT() *LookupVindexExternalizeReque r.Keyspace = m.Keyspace r.Name = m.Name r.TableKeyspace = m.TableKeyspace + r.DeleteWorkflow = m.DeleteWorkflow if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3171,6 +3207,7 @@ func (m *LookupVindexExternalizeResponse) CloneVT() *LookupVindexExternalizeResp return (*LookupVindexExternalizeResponse)(nil) } r := new(LookupVindexExternalizeResponse) + r.WorkflowStopped = m.WorkflowStopped r.WorkflowDeleted = m.WorkflowDeleted if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -3183,6 +3220,41 @@ func (m *LookupVindexExternalizeResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *LookupVindexInternalizeRequest) CloneVT() *LookupVindexInternalizeRequest { + if m == nil { + return (*LookupVindexInternalizeRequest)(nil) + } + r := new(LookupVindexInternalizeRequest) + r.Keyspace = m.Keyspace + r.Name = m.Name + r.TableKeyspace = m.TableKeyspace + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LookupVindexInternalizeRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *LookupVindexInternalizeResponse) CloneVT() *LookupVindexInternalizeResponse { + if m == nil { + return (*LookupVindexInternalizeResponse)(nil) + } + r := new(LookupVindexInternalizeResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *LookupVindexInternalizeResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *MaterializeCreateRequest) CloneVT() *MaterializeCreateRequest { if m == nil { return (*MaterializeCreateRequest)(nil) @@ -14346,6 +14418,93 @@ func (m *LaunchSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *LookupVindexCompleteRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LookupVindexCompleteRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LookupVindexCompleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.TableKeyspace) > 0 { + i -= len(m.TableKeyspace) + copy(dAtA[i:], m.TableKeyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableKeyspace))) + i-- + dAtA[i] = 0x1a + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *LookupVindexCompleteResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LookupVindexCompleteResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LookupVindexCompleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *LookupVindexCreateRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -14511,6 +14670,16 @@ func (m *LookupVindexExternalizeRequest) MarshalToSizedBufferVT(dAtA []byte) (in i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.DeleteWorkflow { + i-- + if m.DeleteWorkflow { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } if len(m.TableKeyspace) > 0 { i -= len(m.TableKeyspace) copy(dAtA[i:], m.TableKeyspace) @@ -14573,11 +14742,108 @@ func (m *LookupVindexExternalizeResponse) MarshalToSizedBufferVT(dAtA []byte) (i dAtA[i] = 0 } i-- + dAtA[i] = 0x10 + } + if m.WorkflowStopped { + i-- + if m.WorkflowStopped { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- dAtA[i] = 0x8 } return len(dAtA) - i, nil } +func (m *LookupVindexInternalizeRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LookupVindexInternalizeRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LookupVindexInternalizeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.TableKeyspace) > 0 { + i -= len(m.TableKeyspace) + copy(dAtA[i:], m.TableKeyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableKeyspace))) + i-- + dAtA[i] = 0x1a + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *LookupVindexInternalizeResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LookupVindexInternalizeResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LookupVindexInternalizeResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *MaterializeCreateRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -25059,6 +25325,38 @@ func (m *LaunchSchemaMigrationResponse) SizeVT() (n int) { return n } +func (m *LookupVindexCompleteRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TableKeyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *LookupVindexCompleteResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *LookupVindexCreateRequest) SizeVT() (n int) { if m == nil { return 0 @@ -25128,6 +25426,9 @@ func (m *LookupVindexExternalizeRequest) SizeVT() (n int) { if l > 0 { n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } + if m.DeleteWorkflow { + n += 2 + } n += len(m.unknownFields) return n } @@ -25138,6 +25439,9 @@ func (m *LookupVindexExternalizeResponse) SizeVT() (n int) { } var l int _ = l + if m.WorkflowStopped { + n += 2 + } if m.WorkflowDeleted { n += 2 } @@ -25145,6 +25449,38 @@ func (m *LookupVindexExternalizeResponse) SizeVT() (n int) { return n } +func (m *LookupVindexInternalizeRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TableKeyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *LookupVindexInternalizeResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *MaterializeCreateRequest) SizeVT() (n int) { if m == nil { return 0 @@ -48954,6 +49290,204 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *LookupVindexCompleteRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LookupVindexCompleteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LookupVindexCompleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableKeyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TableKeyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LookupVindexCompleteResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LookupVindexCompleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LookupVindexCompleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -49421,6 +49955,26 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { } m.TableKeyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteWorkflow", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DeleteWorkflow = bool(v != 0) default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -49473,6 +50027,26 @@ func (m *LookupVindexExternalizeResponse) UnmarshalVT(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowStopped", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.WorkflowStopped = bool(v != 0) + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field WorkflowDeleted", wireType) } @@ -49514,6 +50088,204 @@ func (m *LookupVindexExternalizeResponse) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *LookupVindexInternalizeRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LookupVindexInternalizeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LookupVindexInternalizeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableKeyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TableKeyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LookupVindexInternalizeResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LookupVindexInternalizeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LookupVindexInternalizeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index e645214b5dd..cbd97a8022e 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -51,7 +51,7 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xe1, 0x5c, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xc0, 0x5e, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, @@ -421,382 +421,396 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5a, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5b, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, - 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, + 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, - 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, + 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, + 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, + 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, - 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5a, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, - 0x6c, 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x69, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, - 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x12, + 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, + 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, 0x6e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, - 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, - 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x2a, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, - 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, 0x72, + 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, - 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, + 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x69, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, - 0x65, 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, - 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, - 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, + 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, + 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, + 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_vtctlservice_proto_goTypes = []any{ @@ -864,190 +878,194 @@ var file_vtctlservice_proto_goTypes = []any{ (*vtctldata.GetWorkflowsRequest)(nil), // 61: vtctldata.GetWorkflowsRequest (*vtctldata.InitShardPrimaryRequest)(nil), // 62: vtctldata.InitShardPrimaryRequest (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 63: vtctldata.LaunchSchemaMigrationRequest - (*vtctldata.LookupVindexCreateRequest)(nil), // 64: vtctldata.LookupVindexCreateRequest - (*vtctldata.LookupVindexExternalizeRequest)(nil), // 65: vtctldata.LookupVindexExternalizeRequest - (*vtctldata.MaterializeCreateRequest)(nil), // 66: vtctldata.MaterializeCreateRequest - (*vtctldata.MigrateCreateRequest)(nil), // 67: vtctldata.MigrateCreateRequest - (*vtctldata.MountRegisterRequest)(nil), // 68: vtctldata.MountRegisterRequest - (*vtctldata.MountUnregisterRequest)(nil), // 69: vtctldata.MountUnregisterRequest - (*vtctldata.MountShowRequest)(nil), // 70: vtctldata.MountShowRequest - (*vtctldata.MountListRequest)(nil), // 71: vtctldata.MountListRequest - (*vtctldata.MoveTablesCreateRequest)(nil), // 72: vtctldata.MoveTablesCreateRequest - (*vtctldata.MoveTablesCompleteRequest)(nil), // 73: vtctldata.MoveTablesCompleteRequest - (*vtctldata.PingTabletRequest)(nil), // 74: vtctldata.PingTabletRequest - (*vtctldata.PlannedReparentShardRequest)(nil), // 75: vtctldata.PlannedReparentShardRequest - (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 76: vtctldata.RebuildKeyspaceGraphRequest - (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 77: vtctldata.RebuildVSchemaGraphRequest - (*vtctldata.RefreshStateRequest)(nil), // 78: vtctldata.RefreshStateRequest - (*vtctldata.RefreshStateByShardRequest)(nil), // 79: vtctldata.RefreshStateByShardRequest - (*vtctldata.ReloadSchemaRequest)(nil), // 80: vtctldata.ReloadSchemaRequest - (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 81: vtctldata.ReloadSchemaKeyspaceRequest - (*vtctldata.ReloadSchemaShardRequest)(nil), // 82: vtctldata.ReloadSchemaShardRequest - (*vtctldata.RemoveBackupRequest)(nil), // 83: vtctldata.RemoveBackupRequest - (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 84: vtctldata.RemoveKeyspaceCellRequest - (*vtctldata.RemoveShardCellRequest)(nil), // 85: vtctldata.RemoveShardCellRequest - (*vtctldata.ReparentTabletRequest)(nil), // 86: vtctldata.ReparentTabletRequest - (*vtctldata.ReshardCreateRequest)(nil), // 87: vtctldata.ReshardCreateRequest - (*vtctldata.RestoreFromBackupRequest)(nil), // 88: vtctldata.RestoreFromBackupRequest - (*vtctldata.RetrySchemaMigrationRequest)(nil), // 89: vtctldata.RetrySchemaMigrationRequest - (*vtctldata.RunHealthCheckRequest)(nil), // 90: vtctldata.RunHealthCheckRequest - (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 91: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 92: vtctldata.SetShardIsPrimaryServingRequest - (*vtctldata.SetShardTabletControlRequest)(nil), // 93: vtctldata.SetShardTabletControlRequest - (*vtctldata.SetWritableRequest)(nil), // 94: vtctldata.SetWritableRequest - (*vtctldata.ShardReplicationAddRequest)(nil), // 95: vtctldata.ShardReplicationAddRequest - (*vtctldata.ShardReplicationFixRequest)(nil), // 96: vtctldata.ShardReplicationFixRequest - (*vtctldata.ShardReplicationPositionsRequest)(nil), // 97: vtctldata.ShardReplicationPositionsRequest - (*vtctldata.ShardReplicationRemoveRequest)(nil), // 98: vtctldata.ShardReplicationRemoveRequest - (*vtctldata.SleepTabletRequest)(nil), // 99: vtctldata.SleepTabletRequest - (*vtctldata.SourceShardAddRequest)(nil), // 100: vtctldata.SourceShardAddRequest - (*vtctldata.SourceShardDeleteRequest)(nil), // 101: vtctldata.SourceShardDeleteRequest - (*vtctldata.StartReplicationRequest)(nil), // 102: vtctldata.StartReplicationRequest - (*vtctldata.StopReplicationRequest)(nil), // 103: vtctldata.StopReplicationRequest - (*vtctldata.TabletExternallyReparentedRequest)(nil), // 104: vtctldata.TabletExternallyReparentedRequest - (*vtctldata.UpdateCellInfoRequest)(nil), // 105: vtctldata.UpdateCellInfoRequest - (*vtctldata.UpdateCellsAliasRequest)(nil), // 106: vtctldata.UpdateCellsAliasRequest - (*vtctldata.ValidateRequest)(nil), // 107: vtctldata.ValidateRequest - (*vtctldata.ValidateKeyspaceRequest)(nil), // 108: vtctldata.ValidateKeyspaceRequest - (*vtctldata.ValidatePermissionsKeyspaceRequest)(nil), // 109: vtctldata.ValidatePermissionsKeyspaceRequest - (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 110: vtctldata.ValidateSchemaKeyspaceRequest - (*vtctldata.ValidateShardRequest)(nil), // 111: vtctldata.ValidateShardRequest - (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 112: vtctldata.ValidateVersionKeyspaceRequest - (*vtctldata.ValidateVersionShardRequest)(nil), // 113: vtctldata.ValidateVersionShardRequest - (*vtctldata.ValidateVSchemaRequest)(nil), // 114: vtctldata.ValidateVSchemaRequest - (*vtctldata.VDiffCreateRequest)(nil), // 115: vtctldata.VDiffCreateRequest - (*vtctldata.VDiffDeleteRequest)(nil), // 116: vtctldata.VDiffDeleteRequest - (*vtctldata.VDiffResumeRequest)(nil), // 117: vtctldata.VDiffResumeRequest - (*vtctldata.VDiffShowRequest)(nil), // 118: vtctldata.VDiffShowRequest - (*vtctldata.VDiffStopRequest)(nil), // 119: vtctldata.VDiffStopRequest - (*vtctldata.WorkflowDeleteRequest)(nil), // 120: vtctldata.WorkflowDeleteRequest - (*vtctldata.WorkflowStatusRequest)(nil), // 121: vtctldata.WorkflowStatusRequest - (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 122: vtctldata.WorkflowSwitchTrafficRequest - (*vtctldata.WorkflowUpdateRequest)(nil), // 123: vtctldata.WorkflowUpdateRequest - (*vtctldata.GetMirrorRulesRequest)(nil), // 124: vtctldata.GetMirrorRulesRequest - (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 125: vtctldata.WorkflowMirrorTrafficRequest - (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 126: vtctldata.ExecuteVtctlCommandResponse - (*vtctldata.AddCellInfoResponse)(nil), // 127: vtctldata.AddCellInfoResponse - (*vtctldata.AddCellsAliasResponse)(nil), // 128: vtctldata.AddCellsAliasResponse - (*vtctldata.ApplyRoutingRulesResponse)(nil), // 129: vtctldata.ApplyRoutingRulesResponse - (*vtctldata.ApplySchemaResponse)(nil), // 130: vtctldata.ApplySchemaResponse - (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 131: vtctldata.ApplyKeyspaceRoutingRulesResponse - (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 132: vtctldata.ApplyShardRoutingRulesResponse - (*vtctldata.ApplyVSchemaResponse)(nil), // 133: vtctldata.ApplyVSchemaResponse - (*vtctldata.BackupResponse)(nil), // 134: vtctldata.BackupResponse - (*vtctldata.CancelSchemaMigrationResponse)(nil), // 135: vtctldata.CancelSchemaMigrationResponse - (*vtctldata.ChangeTabletTagsResponse)(nil), // 136: vtctldata.ChangeTabletTagsResponse - (*vtctldata.ChangeTabletTypeResponse)(nil), // 137: vtctldata.ChangeTabletTypeResponse - (*vtctldata.CheckThrottlerResponse)(nil), // 138: vtctldata.CheckThrottlerResponse - (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 139: vtctldata.CleanupSchemaMigrationResponse - (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 140: vtctldata.CompleteSchemaMigrationResponse - (*vtctldata.ConcludeTransactionResponse)(nil), // 141: vtctldata.ConcludeTransactionResponse - (*vtctldata.CopySchemaShardResponse)(nil), // 142: vtctldata.CopySchemaShardResponse - (*vtctldata.CreateKeyspaceResponse)(nil), // 143: vtctldata.CreateKeyspaceResponse - (*vtctldata.CreateShardResponse)(nil), // 144: vtctldata.CreateShardResponse - (*vtctldata.DeleteCellInfoResponse)(nil), // 145: vtctldata.DeleteCellInfoResponse - (*vtctldata.DeleteCellsAliasResponse)(nil), // 146: vtctldata.DeleteCellsAliasResponse - (*vtctldata.DeleteKeyspaceResponse)(nil), // 147: vtctldata.DeleteKeyspaceResponse - (*vtctldata.DeleteShardsResponse)(nil), // 148: vtctldata.DeleteShardsResponse - (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 149: vtctldata.DeleteSrvVSchemaResponse - (*vtctldata.DeleteTabletsResponse)(nil), // 150: vtctldata.DeleteTabletsResponse - (*vtctldata.EmergencyReparentShardResponse)(nil), // 151: vtctldata.EmergencyReparentShardResponse - (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 152: vtctldata.ExecuteFetchAsAppResponse - (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 153: vtctldata.ExecuteFetchAsDBAResponse - (*vtctldata.ExecuteHookResponse)(nil), // 154: vtctldata.ExecuteHookResponse - (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 155: vtctldata.ExecuteMultiFetchAsDBAResponse - (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 156: vtctldata.FindAllShardsInKeyspaceResponse - (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 157: vtctldata.ForceCutOverSchemaMigrationResponse - (*vtctldata.GetBackupsResponse)(nil), // 158: vtctldata.GetBackupsResponse - (*vtctldata.GetCellInfoResponse)(nil), // 159: vtctldata.GetCellInfoResponse - (*vtctldata.GetCellInfoNamesResponse)(nil), // 160: vtctldata.GetCellInfoNamesResponse - (*vtctldata.GetCellsAliasesResponse)(nil), // 161: vtctldata.GetCellsAliasesResponse - (*vtctldata.GetFullStatusResponse)(nil), // 162: vtctldata.GetFullStatusResponse - (*vtctldata.GetKeyspaceResponse)(nil), // 163: vtctldata.GetKeyspaceResponse - (*vtctldata.GetKeyspacesResponse)(nil), // 164: vtctldata.GetKeyspacesResponse - (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 165: vtctldata.GetKeyspaceRoutingRulesResponse - (*vtctldata.GetPermissionsResponse)(nil), // 166: vtctldata.GetPermissionsResponse - (*vtctldata.GetRoutingRulesResponse)(nil), // 167: vtctldata.GetRoutingRulesResponse - (*vtctldata.GetSchemaResponse)(nil), // 168: vtctldata.GetSchemaResponse - (*vtctldata.GetSchemaMigrationsResponse)(nil), // 169: vtctldata.GetSchemaMigrationsResponse - (*vtctldata.GetShardReplicationResponse)(nil), // 170: vtctldata.GetShardReplicationResponse - (*vtctldata.GetShardResponse)(nil), // 171: vtctldata.GetShardResponse - (*vtctldata.GetShardRoutingRulesResponse)(nil), // 172: vtctldata.GetShardRoutingRulesResponse - (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 173: vtctldata.GetSrvKeyspaceNamesResponse - (*vtctldata.GetSrvKeyspacesResponse)(nil), // 174: vtctldata.GetSrvKeyspacesResponse - (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 175: vtctldata.UpdateThrottlerConfigResponse - (*vtctldata.GetSrvVSchemaResponse)(nil), // 176: vtctldata.GetSrvVSchemaResponse - (*vtctldata.GetSrvVSchemasResponse)(nil), // 177: vtctldata.GetSrvVSchemasResponse - (*vtctldata.GetTabletResponse)(nil), // 178: vtctldata.GetTabletResponse - (*vtctldata.GetTabletsResponse)(nil), // 179: vtctldata.GetTabletsResponse - (*vtctldata.GetThrottlerStatusResponse)(nil), // 180: vtctldata.GetThrottlerStatusResponse - (*vtctldata.GetTopologyPathResponse)(nil), // 181: vtctldata.GetTopologyPathResponse - (*vtctldata.GetTransactionInfoResponse)(nil), // 182: vtctldata.GetTransactionInfoResponse - (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 183: vtctldata.GetUnresolvedTransactionsResponse - (*vtctldata.GetVersionResponse)(nil), // 184: vtctldata.GetVersionResponse - (*vtctldata.GetVSchemaResponse)(nil), // 185: vtctldata.GetVSchemaResponse - (*vtctldata.GetWorkflowsResponse)(nil), // 186: vtctldata.GetWorkflowsResponse - (*vtctldata.InitShardPrimaryResponse)(nil), // 187: vtctldata.InitShardPrimaryResponse - (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 188: vtctldata.LaunchSchemaMigrationResponse - (*vtctldata.LookupVindexCreateResponse)(nil), // 189: vtctldata.LookupVindexCreateResponse - (*vtctldata.LookupVindexExternalizeResponse)(nil), // 190: vtctldata.LookupVindexExternalizeResponse - (*vtctldata.MaterializeCreateResponse)(nil), // 191: vtctldata.MaterializeCreateResponse - (*vtctldata.WorkflowStatusResponse)(nil), // 192: vtctldata.WorkflowStatusResponse - (*vtctldata.MountRegisterResponse)(nil), // 193: vtctldata.MountRegisterResponse - (*vtctldata.MountUnregisterResponse)(nil), // 194: vtctldata.MountUnregisterResponse - (*vtctldata.MountShowResponse)(nil), // 195: vtctldata.MountShowResponse - (*vtctldata.MountListResponse)(nil), // 196: vtctldata.MountListResponse - (*vtctldata.MoveTablesCompleteResponse)(nil), // 197: vtctldata.MoveTablesCompleteResponse - (*vtctldata.PingTabletResponse)(nil), // 198: vtctldata.PingTabletResponse - (*vtctldata.PlannedReparentShardResponse)(nil), // 199: vtctldata.PlannedReparentShardResponse - (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 200: vtctldata.RebuildKeyspaceGraphResponse - (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 201: vtctldata.RebuildVSchemaGraphResponse - (*vtctldata.RefreshStateResponse)(nil), // 202: vtctldata.RefreshStateResponse - (*vtctldata.RefreshStateByShardResponse)(nil), // 203: vtctldata.RefreshStateByShardResponse - (*vtctldata.ReloadSchemaResponse)(nil), // 204: vtctldata.ReloadSchemaResponse - (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 205: vtctldata.ReloadSchemaKeyspaceResponse - (*vtctldata.ReloadSchemaShardResponse)(nil), // 206: vtctldata.ReloadSchemaShardResponse - (*vtctldata.RemoveBackupResponse)(nil), // 207: vtctldata.RemoveBackupResponse - (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 208: vtctldata.RemoveKeyspaceCellResponse - (*vtctldata.RemoveShardCellResponse)(nil), // 209: vtctldata.RemoveShardCellResponse - (*vtctldata.ReparentTabletResponse)(nil), // 210: vtctldata.ReparentTabletResponse - (*vtctldata.RestoreFromBackupResponse)(nil), // 211: vtctldata.RestoreFromBackupResponse - (*vtctldata.RetrySchemaMigrationResponse)(nil), // 212: vtctldata.RetrySchemaMigrationResponse - (*vtctldata.RunHealthCheckResponse)(nil), // 213: vtctldata.RunHealthCheckResponse - (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 214: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 215: vtctldata.SetShardIsPrimaryServingResponse - (*vtctldata.SetShardTabletControlResponse)(nil), // 216: vtctldata.SetShardTabletControlResponse - (*vtctldata.SetWritableResponse)(nil), // 217: vtctldata.SetWritableResponse - (*vtctldata.ShardReplicationAddResponse)(nil), // 218: vtctldata.ShardReplicationAddResponse - (*vtctldata.ShardReplicationFixResponse)(nil), // 219: vtctldata.ShardReplicationFixResponse - (*vtctldata.ShardReplicationPositionsResponse)(nil), // 220: vtctldata.ShardReplicationPositionsResponse - (*vtctldata.ShardReplicationRemoveResponse)(nil), // 221: vtctldata.ShardReplicationRemoveResponse - (*vtctldata.SleepTabletResponse)(nil), // 222: vtctldata.SleepTabletResponse - (*vtctldata.SourceShardAddResponse)(nil), // 223: vtctldata.SourceShardAddResponse - (*vtctldata.SourceShardDeleteResponse)(nil), // 224: vtctldata.SourceShardDeleteResponse - (*vtctldata.StartReplicationResponse)(nil), // 225: vtctldata.StartReplicationResponse - (*vtctldata.StopReplicationResponse)(nil), // 226: vtctldata.StopReplicationResponse - (*vtctldata.TabletExternallyReparentedResponse)(nil), // 227: vtctldata.TabletExternallyReparentedResponse - (*vtctldata.UpdateCellInfoResponse)(nil), // 228: vtctldata.UpdateCellInfoResponse - (*vtctldata.UpdateCellsAliasResponse)(nil), // 229: vtctldata.UpdateCellsAliasResponse - (*vtctldata.ValidateResponse)(nil), // 230: vtctldata.ValidateResponse - (*vtctldata.ValidateKeyspaceResponse)(nil), // 231: vtctldata.ValidateKeyspaceResponse - (*vtctldata.ValidatePermissionsKeyspaceResponse)(nil), // 232: vtctldata.ValidatePermissionsKeyspaceResponse - (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 233: vtctldata.ValidateSchemaKeyspaceResponse - (*vtctldata.ValidateShardResponse)(nil), // 234: vtctldata.ValidateShardResponse - (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 235: vtctldata.ValidateVersionKeyspaceResponse - (*vtctldata.ValidateVersionShardResponse)(nil), // 236: vtctldata.ValidateVersionShardResponse - (*vtctldata.ValidateVSchemaResponse)(nil), // 237: vtctldata.ValidateVSchemaResponse - (*vtctldata.VDiffCreateResponse)(nil), // 238: vtctldata.VDiffCreateResponse - (*vtctldata.VDiffDeleteResponse)(nil), // 239: vtctldata.VDiffDeleteResponse - (*vtctldata.VDiffResumeResponse)(nil), // 240: vtctldata.VDiffResumeResponse - (*vtctldata.VDiffShowResponse)(nil), // 241: vtctldata.VDiffShowResponse - (*vtctldata.VDiffStopResponse)(nil), // 242: vtctldata.VDiffStopResponse - (*vtctldata.WorkflowDeleteResponse)(nil), // 243: vtctldata.WorkflowDeleteResponse - (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 244: vtctldata.WorkflowSwitchTrafficResponse - (*vtctldata.WorkflowUpdateResponse)(nil), // 245: vtctldata.WorkflowUpdateResponse - (*vtctldata.GetMirrorRulesResponse)(nil), // 246: vtctldata.GetMirrorRulesResponse - (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 247: vtctldata.WorkflowMirrorTrafficResponse + (*vtctldata.LookupVindexCompleteRequest)(nil), // 64: vtctldata.LookupVindexCompleteRequest + (*vtctldata.LookupVindexCreateRequest)(nil), // 65: vtctldata.LookupVindexCreateRequest + (*vtctldata.LookupVindexExternalizeRequest)(nil), // 66: vtctldata.LookupVindexExternalizeRequest + (*vtctldata.LookupVindexInternalizeRequest)(nil), // 67: vtctldata.LookupVindexInternalizeRequest + (*vtctldata.MaterializeCreateRequest)(nil), // 68: vtctldata.MaterializeCreateRequest + (*vtctldata.MigrateCreateRequest)(nil), // 69: vtctldata.MigrateCreateRequest + (*vtctldata.MountRegisterRequest)(nil), // 70: vtctldata.MountRegisterRequest + (*vtctldata.MountUnregisterRequest)(nil), // 71: vtctldata.MountUnregisterRequest + (*vtctldata.MountShowRequest)(nil), // 72: vtctldata.MountShowRequest + (*vtctldata.MountListRequest)(nil), // 73: vtctldata.MountListRequest + (*vtctldata.MoveTablesCreateRequest)(nil), // 74: vtctldata.MoveTablesCreateRequest + (*vtctldata.MoveTablesCompleteRequest)(nil), // 75: vtctldata.MoveTablesCompleteRequest + (*vtctldata.PingTabletRequest)(nil), // 76: vtctldata.PingTabletRequest + (*vtctldata.PlannedReparentShardRequest)(nil), // 77: vtctldata.PlannedReparentShardRequest + (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 78: vtctldata.RebuildKeyspaceGraphRequest + (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 79: vtctldata.RebuildVSchemaGraphRequest + (*vtctldata.RefreshStateRequest)(nil), // 80: vtctldata.RefreshStateRequest + (*vtctldata.RefreshStateByShardRequest)(nil), // 81: vtctldata.RefreshStateByShardRequest + (*vtctldata.ReloadSchemaRequest)(nil), // 82: vtctldata.ReloadSchemaRequest + (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 83: vtctldata.ReloadSchemaKeyspaceRequest + (*vtctldata.ReloadSchemaShardRequest)(nil), // 84: vtctldata.ReloadSchemaShardRequest + (*vtctldata.RemoveBackupRequest)(nil), // 85: vtctldata.RemoveBackupRequest + (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 86: vtctldata.RemoveKeyspaceCellRequest + (*vtctldata.RemoveShardCellRequest)(nil), // 87: vtctldata.RemoveShardCellRequest + (*vtctldata.ReparentTabletRequest)(nil), // 88: vtctldata.ReparentTabletRequest + (*vtctldata.ReshardCreateRequest)(nil), // 89: vtctldata.ReshardCreateRequest + (*vtctldata.RestoreFromBackupRequest)(nil), // 90: vtctldata.RestoreFromBackupRequest + (*vtctldata.RetrySchemaMigrationRequest)(nil), // 91: vtctldata.RetrySchemaMigrationRequest + (*vtctldata.RunHealthCheckRequest)(nil), // 92: vtctldata.RunHealthCheckRequest + (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 93: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 94: vtctldata.SetShardIsPrimaryServingRequest + (*vtctldata.SetShardTabletControlRequest)(nil), // 95: vtctldata.SetShardTabletControlRequest + (*vtctldata.SetWritableRequest)(nil), // 96: vtctldata.SetWritableRequest + (*vtctldata.ShardReplicationAddRequest)(nil), // 97: vtctldata.ShardReplicationAddRequest + (*vtctldata.ShardReplicationFixRequest)(nil), // 98: vtctldata.ShardReplicationFixRequest + (*vtctldata.ShardReplicationPositionsRequest)(nil), // 99: vtctldata.ShardReplicationPositionsRequest + (*vtctldata.ShardReplicationRemoveRequest)(nil), // 100: vtctldata.ShardReplicationRemoveRequest + (*vtctldata.SleepTabletRequest)(nil), // 101: vtctldata.SleepTabletRequest + (*vtctldata.SourceShardAddRequest)(nil), // 102: vtctldata.SourceShardAddRequest + (*vtctldata.SourceShardDeleteRequest)(nil), // 103: vtctldata.SourceShardDeleteRequest + (*vtctldata.StartReplicationRequest)(nil), // 104: vtctldata.StartReplicationRequest + (*vtctldata.StopReplicationRequest)(nil), // 105: vtctldata.StopReplicationRequest + (*vtctldata.TabletExternallyReparentedRequest)(nil), // 106: vtctldata.TabletExternallyReparentedRequest + (*vtctldata.UpdateCellInfoRequest)(nil), // 107: vtctldata.UpdateCellInfoRequest + (*vtctldata.UpdateCellsAliasRequest)(nil), // 108: vtctldata.UpdateCellsAliasRequest + (*vtctldata.ValidateRequest)(nil), // 109: vtctldata.ValidateRequest + (*vtctldata.ValidateKeyspaceRequest)(nil), // 110: vtctldata.ValidateKeyspaceRequest + (*vtctldata.ValidatePermissionsKeyspaceRequest)(nil), // 111: vtctldata.ValidatePermissionsKeyspaceRequest + (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 112: vtctldata.ValidateSchemaKeyspaceRequest + (*vtctldata.ValidateShardRequest)(nil), // 113: vtctldata.ValidateShardRequest + (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 114: vtctldata.ValidateVersionKeyspaceRequest + (*vtctldata.ValidateVersionShardRequest)(nil), // 115: vtctldata.ValidateVersionShardRequest + (*vtctldata.ValidateVSchemaRequest)(nil), // 116: vtctldata.ValidateVSchemaRequest + (*vtctldata.VDiffCreateRequest)(nil), // 117: vtctldata.VDiffCreateRequest + (*vtctldata.VDiffDeleteRequest)(nil), // 118: vtctldata.VDiffDeleteRequest + (*vtctldata.VDiffResumeRequest)(nil), // 119: vtctldata.VDiffResumeRequest + (*vtctldata.VDiffShowRequest)(nil), // 120: vtctldata.VDiffShowRequest + (*vtctldata.VDiffStopRequest)(nil), // 121: vtctldata.VDiffStopRequest + (*vtctldata.WorkflowDeleteRequest)(nil), // 122: vtctldata.WorkflowDeleteRequest + (*vtctldata.WorkflowStatusRequest)(nil), // 123: vtctldata.WorkflowStatusRequest + (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 124: vtctldata.WorkflowSwitchTrafficRequest + (*vtctldata.WorkflowUpdateRequest)(nil), // 125: vtctldata.WorkflowUpdateRequest + (*vtctldata.GetMirrorRulesRequest)(nil), // 126: vtctldata.GetMirrorRulesRequest + (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 127: vtctldata.WorkflowMirrorTrafficRequest + (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 128: vtctldata.ExecuteVtctlCommandResponse + (*vtctldata.AddCellInfoResponse)(nil), // 129: vtctldata.AddCellInfoResponse + (*vtctldata.AddCellsAliasResponse)(nil), // 130: vtctldata.AddCellsAliasResponse + (*vtctldata.ApplyRoutingRulesResponse)(nil), // 131: vtctldata.ApplyRoutingRulesResponse + (*vtctldata.ApplySchemaResponse)(nil), // 132: vtctldata.ApplySchemaResponse + (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 133: vtctldata.ApplyKeyspaceRoutingRulesResponse + (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 134: vtctldata.ApplyShardRoutingRulesResponse + (*vtctldata.ApplyVSchemaResponse)(nil), // 135: vtctldata.ApplyVSchemaResponse + (*vtctldata.BackupResponse)(nil), // 136: vtctldata.BackupResponse + (*vtctldata.CancelSchemaMigrationResponse)(nil), // 137: vtctldata.CancelSchemaMigrationResponse + (*vtctldata.ChangeTabletTagsResponse)(nil), // 138: vtctldata.ChangeTabletTagsResponse + (*vtctldata.ChangeTabletTypeResponse)(nil), // 139: vtctldata.ChangeTabletTypeResponse + (*vtctldata.CheckThrottlerResponse)(nil), // 140: vtctldata.CheckThrottlerResponse + (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 141: vtctldata.CleanupSchemaMigrationResponse + (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 142: vtctldata.CompleteSchemaMigrationResponse + (*vtctldata.ConcludeTransactionResponse)(nil), // 143: vtctldata.ConcludeTransactionResponse + (*vtctldata.CopySchemaShardResponse)(nil), // 144: vtctldata.CopySchemaShardResponse + (*vtctldata.CreateKeyspaceResponse)(nil), // 145: vtctldata.CreateKeyspaceResponse + (*vtctldata.CreateShardResponse)(nil), // 146: vtctldata.CreateShardResponse + (*vtctldata.DeleteCellInfoResponse)(nil), // 147: vtctldata.DeleteCellInfoResponse + (*vtctldata.DeleteCellsAliasResponse)(nil), // 148: vtctldata.DeleteCellsAliasResponse + (*vtctldata.DeleteKeyspaceResponse)(nil), // 149: vtctldata.DeleteKeyspaceResponse + (*vtctldata.DeleteShardsResponse)(nil), // 150: vtctldata.DeleteShardsResponse + (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 151: vtctldata.DeleteSrvVSchemaResponse + (*vtctldata.DeleteTabletsResponse)(nil), // 152: vtctldata.DeleteTabletsResponse + (*vtctldata.EmergencyReparentShardResponse)(nil), // 153: vtctldata.EmergencyReparentShardResponse + (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 154: vtctldata.ExecuteFetchAsAppResponse + (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 155: vtctldata.ExecuteFetchAsDBAResponse + (*vtctldata.ExecuteHookResponse)(nil), // 156: vtctldata.ExecuteHookResponse + (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 157: vtctldata.ExecuteMultiFetchAsDBAResponse + (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 158: vtctldata.FindAllShardsInKeyspaceResponse + (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 159: vtctldata.ForceCutOverSchemaMigrationResponse + (*vtctldata.GetBackupsResponse)(nil), // 160: vtctldata.GetBackupsResponse + (*vtctldata.GetCellInfoResponse)(nil), // 161: vtctldata.GetCellInfoResponse + (*vtctldata.GetCellInfoNamesResponse)(nil), // 162: vtctldata.GetCellInfoNamesResponse + (*vtctldata.GetCellsAliasesResponse)(nil), // 163: vtctldata.GetCellsAliasesResponse + (*vtctldata.GetFullStatusResponse)(nil), // 164: vtctldata.GetFullStatusResponse + (*vtctldata.GetKeyspaceResponse)(nil), // 165: vtctldata.GetKeyspaceResponse + (*vtctldata.GetKeyspacesResponse)(nil), // 166: vtctldata.GetKeyspacesResponse + (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 167: vtctldata.GetKeyspaceRoutingRulesResponse + (*vtctldata.GetPermissionsResponse)(nil), // 168: vtctldata.GetPermissionsResponse + (*vtctldata.GetRoutingRulesResponse)(nil), // 169: vtctldata.GetRoutingRulesResponse + (*vtctldata.GetSchemaResponse)(nil), // 170: vtctldata.GetSchemaResponse + (*vtctldata.GetSchemaMigrationsResponse)(nil), // 171: vtctldata.GetSchemaMigrationsResponse + (*vtctldata.GetShardReplicationResponse)(nil), // 172: vtctldata.GetShardReplicationResponse + (*vtctldata.GetShardResponse)(nil), // 173: vtctldata.GetShardResponse + (*vtctldata.GetShardRoutingRulesResponse)(nil), // 174: vtctldata.GetShardRoutingRulesResponse + (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 175: vtctldata.GetSrvKeyspaceNamesResponse + (*vtctldata.GetSrvKeyspacesResponse)(nil), // 176: vtctldata.GetSrvKeyspacesResponse + (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 177: vtctldata.UpdateThrottlerConfigResponse + (*vtctldata.GetSrvVSchemaResponse)(nil), // 178: vtctldata.GetSrvVSchemaResponse + (*vtctldata.GetSrvVSchemasResponse)(nil), // 179: vtctldata.GetSrvVSchemasResponse + (*vtctldata.GetTabletResponse)(nil), // 180: vtctldata.GetTabletResponse + (*vtctldata.GetTabletsResponse)(nil), // 181: vtctldata.GetTabletsResponse + (*vtctldata.GetThrottlerStatusResponse)(nil), // 182: vtctldata.GetThrottlerStatusResponse + (*vtctldata.GetTopologyPathResponse)(nil), // 183: vtctldata.GetTopologyPathResponse + (*vtctldata.GetTransactionInfoResponse)(nil), // 184: vtctldata.GetTransactionInfoResponse + (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 185: vtctldata.GetUnresolvedTransactionsResponse + (*vtctldata.GetVersionResponse)(nil), // 186: vtctldata.GetVersionResponse + (*vtctldata.GetVSchemaResponse)(nil), // 187: vtctldata.GetVSchemaResponse + (*vtctldata.GetWorkflowsResponse)(nil), // 188: vtctldata.GetWorkflowsResponse + (*vtctldata.InitShardPrimaryResponse)(nil), // 189: vtctldata.InitShardPrimaryResponse + (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 190: vtctldata.LaunchSchemaMigrationResponse + (*vtctldata.LookupVindexCompleteResponse)(nil), // 191: vtctldata.LookupVindexCompleteResponse + (*vtctldata.LookupVindexCreateResponse)(nil), // 192: vtctldata.LookupVindexCreateResponse + (*vtctldata.LookupVindexExternalizeResponse)(nil), // 193: vtctldata.LookupVindexExternalizeResponse + (*vtctldata.LookupVindexInternalizeResponse)(nil), // 194: vtctldata.LookupVindexInternalizeResponse + (*vtctldata.MaterializeCreateResponse)(nil), // 195: vtctldata.MaterializeCreateResponse + (*vtctldata.WorkflowStatusResponse)(nil), // 196: vtctldata.WorkflowStatusResponse + (*vtctldata.MountRegisterResponse)(nil), // 197: vtctldata.MountRegisterResponse + (*vtctldata.MountUnregisterResponse)(nil), // 198: vtctldata.MountUnregisterResponse + (*vtctldata.MountShowResponse)(nil), // 199: vtctldata.MountShowResponse + (*vtctldata.MountListResponse)(nil), // 200: vtctldata.MountListResponse + (*vtctldata.MoveTablesCompleteResponse)(nil), // 201: vtctldata.MoveTablesCompleteResponse + (*vtctldata.PingTabletResponse)(nil), // 202: vtctldata.PingTabletResponse + (*vtctldata.PlannedReparentShardResponse)(nil), // 203: vtctldata.PlannedReparentShardResponse + (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 204: vtctldata.RebuildKeyspaceGraphResponse + (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 205: vtctldata.RebuildVSchemaGraphResponse + (*vtctldata.RefreshStateResponse)(nil), // 206: vtctldata.RefreshStateResponse + (*vtctldata.RefreshStateByShardResponse)(nil), // 207: vtctldata.RefreshStateByShardResponse + (*vtctldata.ReloadSchemaResponse)(nil), // 208: vtctldata.ReloadSchemaResponse + (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 209: vtctldata.ReloadSchemaKeyspaceResponse + (*vtctldata.ReloadSchemaShardResponse)(nil), // 210: vtctldata.ReloadSchemaShardResponse + (*vtctldata.RemoveBackupResponse)(nil), // 211: vtctldata.RemoveBackupResponse + (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 212: vtctldata.RemoveKeyspaceCellResponse + (*vtctldata.RemoveShardCellResponse)(nil), // 213: vtctldata.RemoveShardCellResponse + (*vtctldata.ReparentTabletResponse)(nil), // 214: vtctldata.ReparentTabletResponse + (*vtctldata.RestoreFromBackupResponse)(nil), // 215: vtctldata.RestoreFromBackupResponse + (*vtctldata.RetrySchemaMigrationResponse)(nil), // 216: vtctldata.RetrySchemaMigrationResponse + (*vtctldata.RunHealthCheckResponse)(nil), // 217: vtctldata.RunHealthCheckResponse + (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 218: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 219: vtctldata.SetShardIsPrimaryServingResponse + (*vtctldata.SetShardTabletControlResponse)(nil), // 220: vtctldata.SetShardTabletControlResponse + (*vtctldata.SetWritableResponse)(nil), // 221: vtctldata.SetWritableResponse + (*vtctldata.ShardReplicationAddResponse)(nil), // 222: vtctldata.ShardReplicationAddResponse + (*vtctldata.ShardReplicationFixResponse)(nil), // 223: vtctldata.ShardReplicationFixResponse + (*vtctldata.ShardReplicationPositionsResponse)(nil), // 224: vtctldata.ShardReplicationPositionsResponse + (*vtctldata.ShardReplicationRemoveResponse)(nil), // 225: vtctldata.ShardReplicationRemoveResponse + (*vtctldata.SleepTabletResponse)(nil), // 226: vtctldata.SleepTabletResponse + (*vtctldata.SourceShardAddResponse)(nil), // 227: vtctldata.SourceShardAddResponse + (*vtctldata.SourceShardDeleteResponse)(nil), // 228: vtctldata.SourceShardDeleteResponse + (*vtctldata.StartReplicationResponse)(nil), // 229: vtctldata.StartReplicationResponse + (*vtctldata.StopReplicationResponse)(nil), // 230: vtctldata.StopReplicationResponse + (*vtctldata.TabletExternallyReparentedResponse)(nil), // 231: vtctldata.TabletExternallyReparentedResponse + (*vtctldata.UpdateCellInfoResponse)(nil), // 232: vtctldata.UpdateCellInfoResponse + (*vtctldata.UpdateCellsAliasResponse)(nil), // 233: vtctldata.UpdateCellsAliasResponse + (*vtctldata.ValidateResponse)(nil), // 234: vtctldata.ValidateResponse + (*vtctldata.ValidateKeyspaceResponse)(nil), // 235: vtctldata.ValidateKeyspaceResponse + (*vtctldata.ValidatePermissionsKeyspaceResponse)(nil), // 236: vtctldata.ValidatePermissionsKeyspaceResponse + (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 237: vtctldata.ValidateSchemaKeyspaceResponse + (*vtctldata.ValidateShardResponse)(nil), // 238: vtctldata.ValidateShardResponse + (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 239: vtctldata.ValidateVersionKeyspaceResponse + (*vtctldata.ValidateVersionShardResponse)(nil), // 240: vtctldata.ValidateVersionShardResponse + (*vtctldata.ValidateVSchemaResponse)(nil), // 241: vtctldata.ValidateVSchemaResponse + (*vtctldata.VDiffCreateResponse)(nil), // 242: vtctldata.VDiffCreateResponse + (*vtctldata.VDiffDeleteResponse)(nil), // 243: vtctldata.VDiffDeleteResponse + (*vtctldata.VDiffResumeResponse)(nil), // 244: vtctldata.VDiffResumeResponse + (*vtctldata.VDiffShowResponse)(nil), // 245: vtctldata.VDiffShowResponse + (*vtctldata.VDiffStopResponse)(nil), // 246: vtctldata.VDiffStopResponse + (*vtctldata.WorkflowDeleteResponse)(nil), // 247: vtctldata.WorkflowDeleteResponse + (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 248: vtctldata.WorkflowSwitchTrafficResponse + (*vtctldata.WorkflowUpdateResponse)(nil), // 249: vtctldata.WorkflowUpdateResponse + (*vtctldata.GetMirrorRulesResponse)(nil), // 250: vtctldata.GetMirrorRulesResponse + (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 251: vtctldata.WorkflowMirrorTrafficResponse } var file_vtctlservice_proto_depIdxs = []int32{ 0, // 0: vtctlservice.Vtctl.ExecuteVtctlCommand:input_type -> vtctldata.ExecuteVtctlCommandRequest @@ -1114,196 +1132,200 @@ var file_vtctlservice_proto_depIdxs = []int32{ 61, // 61: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest 62, // 62: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest 63, // 63: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest - 64, // 64: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest - 65, // 65: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest - 66, // 66: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest - 67, // 67: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest - 68, // 68: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest - 69, // 69: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest - 70, // 70: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest - 71, // 71: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest - 72, // 72: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest - 73, // 73: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest - 74, // 74: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest - 75, // 75: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest - 76, // 76: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest - 77, // 77: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest - 78, // 78: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest - 79, // 79: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest - 80, // 80: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest - 81, // 81: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest - 82, // 82: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest - 83, // 83: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest - 84, // 84: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest - 85, // 85: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest - 86, // 86: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest - 87, // 87: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest - 88, // 88: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest - 89, // 89: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest - 90, // 90: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest - 91, // 91: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest - 92, // 92: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest - 93, // 93: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest - 94, // 94: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest - 95, // 95: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest - 96, // 96: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest - 97, // 97: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest - 98, // 98: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest - 99, // 99: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest - 100, // 100: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest - 101, // 101: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest - 102, // 102: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest - 103, // 103: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest - 104, // 104: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest - 105, // 105: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest - 106, // 106: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest - 107, // 107: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest - 108, // 108: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest - 109, // 109: vtctlservice.Vtctld.ValidatePermissionsKeyspace:input_type -> vtctldata.ValidatePermissionsKeyspaceRequest - 110, // 110: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest - 111, // 111: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest - 112, // 112: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest - 113, // 113: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest - 114, // 114: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest - 115, // 115: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest - 116, // 116: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest - 117, // 117: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest - 118, // 118: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest - 119, // 119: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest - 120, // 120: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest - 121, // 121: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest - 122, // 122: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest - 123, // 123: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest - 124, // 124: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest - 125, // 125: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest - 126, // 126: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse - 127, // 127: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse - 128, // 128: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse - 129, // 129: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse - 130, // 130: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse - 131, // 131: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse - 132, // 132: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse - 133, // 133: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse - 134, // 134: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse - 134, // 135: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse - 135, // 136: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse - 136, // 137: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse - 137, // 138: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse - 138, // 139: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse - 139, // 140: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse - 140, // 141: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse - 141, // 142: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse - 142, // 143: vtctlservice.Vtctld.CopySchemaShard:output_type -> vtctldata.CopySchemaShardResponse - 143, // 144: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse - 144, // 145: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse - 145, // 146: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse - 146, // 147: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse - 147, // 148: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse - 148, // 149: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse - 149, // 150: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse - 150, // 151: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse - 151, // 152: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse - 152, // 153: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse - 153, // 154: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse - 154, // 155: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse - 155, // 156: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse - 156, // 157: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse - 157, // 158: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse - 158, // 159: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse - 159, // 160: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse - 160, // 161: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse - 161, // 162: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse - 162, // 163: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse - 163, // 164: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse - 164, // 165: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse - 165, // 166: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse - 166, // 167: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse - 167, // 168: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse - 168, // 169: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse - 169, // 170: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse - 170, // 171: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse - 171, // 172: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse - 172, // 173: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse - 173, // 174: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse - 174, // 175: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse - 175, // 176: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse - 176, // 177: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse - 177, // 178: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse - 178, // 179: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse - 179, // 180: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse - 180, // 181: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse - 181, // 182: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse - 182, // 183: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse - 183, // 184: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse - 184, // 185: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse - 185, // 186: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse - 186, // 187: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse - 187, // 188: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse - 188, // 189: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse - 189, // 190: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse - 190, // 191: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse - 191, // 192: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse - 192, // 193: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse - 193, // 194: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse - 194, // 195: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse - 195, // 196: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse - 196, // 197: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse - 192, // 198: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse - 197, // 199: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse - 198, // 200: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse - 199, // 201: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse - 200, // 202: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse - 201, // 203: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse - 202, // 204: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse - 203, // 205: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse - 204, // 206: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse - 205, // 207: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse - 206, // 208: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse - 207, // 209: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse - 208, // 210: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse - 209, // 211: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse - 210, // 212: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse - 192, // 213: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse - 211, // 214: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse - 212, // 215: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse - 213, // 216: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse - 214, // 217: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse - 215, // 218: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse - 216, // 219: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse - 217, // 220: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse - 218, // 221: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse - 219, // 222: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse - 220, // 223: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse - 221, // 224: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse - 222, // 225: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse - 223, // 226: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse - 224, // 227: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse - 225, // 228: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse - 226, // 229: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse - 227, // 230: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse - 228, // 231: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse - 229, // 232: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse - 230, // 233: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse - 231, // 234: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse - 232, // 235: vtctlservice.Vtctld.ValidatePermissionsKeyspace:output_type -> vtctldata.ValidatePermissionsKeyspaceResponse - 233, // 236: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse - 234, // 237: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse - 235, // 238: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse - 236, // 239: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse - 237, // 240: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse - 238, // 241: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse - 239, // 242: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse - 240, // 243: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse - 241, // 244: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse - 242, // 245: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse - 243, // 246: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse - 192, // 247: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse - 244, // 248: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse - 245, // 249: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse - 246, // 250: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse - 247, // 251: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse - 126, // [126:252] is the sub-list for method output_type - 0, // [0:126] is the sub-list for method input_type + 64, // 64: vtctlservice.Vtctld.LookupVindexComplete:input_type -> vtctldata.LookupVindexCompleteRequest + 65, // 65: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest + 66, // 66: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest + 67, // 67: vtctlservice.Vtctld.LookupVindexInternalize:input_type -> vtctldata.LookupVindexInternalizeRequest + 68, // 68: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest + 69, // 69: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest + 70, // 70: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest + 71, // 71: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest + 72, // 72: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest + 73, // 73: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest + 74, // 74: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest + 75, // 75: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest + 76, // 76: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest + 77, // 77: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest + 78, // 78: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest + 79, // 79: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest + 80, // 80: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest + 81, // 81: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest + 82, // 82: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest + 83, // 83: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest + 84, // 84: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest + 85, // 85: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest + 86, // 86: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest + 87, // 87: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest + 88, // 88: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest + 89, // 89: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest + 90, // 90: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest + 91, // 91: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest + 92, // 92: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest + 93, // 93: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest + 94, // 94: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest + 95, // 95: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest + 96, // 96: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest + 97, // 97: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest + 98, // 98: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest + 99, // 99: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest + 100, // 100: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest + 101, // 101: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest + 102, // 102: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest + 103, // 103: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest + 104, // 104: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest + 105, // 105: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest + 106, // 106: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest + 107, // 107: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest + 108, // 108: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest + 109, // 109: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest + 110, // 110: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest + 111, // 111: vtctlservice.Vtctld.ValidatePermissionsKeyspace:input_type -> vtctldata.ValidatePermissionsKeyspaceRequest + 112, // 112: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest + 113, // 113: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest + 114, // 114: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest + 115, // 115: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest + 116, // 116: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest + 117, // 117: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest + 118, // 118: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest + 119, // 119: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest + 120, // 120: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest + 121, // 121: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest + 122, // 122: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest + 123, // 123: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest + 124, // 124: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest + 125, // 125: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest + 126, // 126: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest + 127, // 127: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest + 128, // 128: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse + 129, // 129: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse + 130, // 130: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse + 131, // 131: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse + 132, // 132: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse + 133, // 133: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse + 134, // 134: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse + 135, // 135: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse + 136, // 136: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse + 136, // 137: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse + 137, // 138: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse + 138, // 139: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse + 139, // 140: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse + 140, // 141: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse + 141, // 142: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse + 142, // 143: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse + 143, // 144: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse + 144, // 145: vtctlservice.Vtctld.CopySchemaShard:output_type -> vtctldata.CopySchemaShardResponse + 145, // 146: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse + 146, // 147: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse + 147, // 148: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse + 148, // 149: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse + 149, // 150: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse + 150, // 151: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse + 151, // 152: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse + 152, // 153: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse + 153, // 154: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse + 154, // 155: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse + 155, // 156: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse + 156, // 157: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse + 157, // 158: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse + 158, // 159: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse + 159, // 160: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse + 160, // 161: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse + 161, // 162: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse + 162, // 163: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse + 163, // 164: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse + 164, // 165: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse + 165, // 166: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse + 166, // 167: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse + 167, // 168: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse + 168, // 169: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse + 169, // 170: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse + 170, // 171: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse + 171, // 172: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse + 172, // 173: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse + 173, // 174: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse + 174, // 175: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse + 175, // 176: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse + 176, // 177: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse + 177, // 178: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse + 178, // 179: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse + 179, // 180: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse + 180, // 181: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse + 181, // 182: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse + 182, // 183: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse + 183, // 184: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse + 184, // 185: vtctlservice.Vtctld.GetTransactionInfo:output_type -> vtctldata.GetTransactionInfoResponse + 185, // 186: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse + 186, // 187: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse + 187, // 188: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse + 188, // 189: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse + 189, // 190: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse + 190, // 191: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse + 191, // 192: vtctlservice.Vtctld.LookupVindexComplete:output_type -> vtctldata.LookupVindexCompleteResponse + 192, // 193: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse + 193, // 194: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse + 194, // 195: vtctlservice.Vtctld.LookupVindexInternalize:output_type -> vtctldata.LookupVindexInternalizeResponse + 195, // 196: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse + 196, // 197: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse + 197, // 198: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse + 198, // 199: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse + 199, // 200: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse + 200, // 201: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse + 196, // 202: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse + 201, // 203: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse + 202, // 204: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse + 203, // 205: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse + 204, // 206: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse + 205, // 207: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse + 206, // 208: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse + 207, // 209: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse + 208, // 210: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse + 209, // 211: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse + 210, // 212: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse + 211, // 213: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse + 212, // 214: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse + 213, // 215: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse + 214, // 216: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse + 196, // 217: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse + 215, // 218: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse + 216, // 219: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse + 217, // 220: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse + 218, // 221: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse + 219, // 222: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse + 220, // 223: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse + 221, // 224: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse + 222, // 225: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse + 223, // 226: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse + 224, // 227: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse + 225, // 228: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse + 226, // 229: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse + 227, // 230: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse + 228, // 231: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse + 229, // 232: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse + 230, // 233: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse + 231, // 234: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse + 232, // 235: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse + 233, // 236: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse + 234, // 237: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse + 235, // 238: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse + 236, // 239: vtctlservice.Vtctld.ValidatePermissionsKeyspace:output_type -> vtctldata.ValidatePermissionsKeyspaceResponse + 237, // 240: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse + 238, // 241: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse + 239, // 242: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse + 240, // 243: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse + 241, // 244: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse + 242, // 245: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse + 243, // 246: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse + 244, // 247: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse + 245, // 248: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse + 246, // 249: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse + 247, // 250: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse + 196, // 251: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse + 248, // 252: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse + 249, // 253: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse + 250, // 254: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse + 251, // 255: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse + 128, // [128:256] is the sub-list for method output_type + 0, // [0:128] 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/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go index 8447dbf10c7..e906754620f 100644 --- a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go @@ -299,8 +299,10 @@ type VtctldClient interface { InitShardPrimary(ctx context.Context, in *vtctldata.InitShardPrimaryRequest, opts ...grpc.CallOption) (*vtctldata.InitShardPrimaryResponse, error) // LaunchSchemaMigration launches one or all migrations executed with --postpone-launch. LaunchSchemaMigration(ctx context.Context, in *vtctldata.LaunchSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.LaunchSchemaMigrationResponse, error) + LookupVindexComplete(ctx context.Context, in *vtctldata.LookupVindexCompleteRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexCompleteResponse, error) LookupVindexCreate(ctx context.Context, in *vtctldata.LookupVindexCreateRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexCreateResponse, error) LookupVindexExternalize(ctx context.Context, in *vtctldata.LookupVindexExternalizeRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexExternalizeResponse, error) + LookupVindexInternalize(ctx context.Context, in *vtctldata.LookupVindexInternalizeRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexInternalizeResponse, error) // MaterializeCreate creates a workflow to materialize one or more tables // from a source keyspace to a target keyspace using a provided expressions. MaterializeCreate(ctx context.Context, in *vtctldata.MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldata.MaterializeCreateResponse, error) @@ -1102,6 +1104,15 @@ func (c *vtctldClient) LaunchSchemaMigration(ctx context.Context, in *vtctldata. return out, nil } +func (c *vtctldClient) LookupVindexComplete(ctx context.Context, in *vtctldata.LookupVindexCompleteRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexCompleteResponse, error) { + out := new(vtctldata.LookupVindexCompleteResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/LookupVindexComplete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) LookupVindexCreate(ctx context.Context, in *vtctldata.LookupVindexCreateRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexCreateResponse, error) { out := new(vtctldata.LookupVindexCreateResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/LookupVindexCreate", in, out, opts...) @@ -1120,6 +1131,15 @@ func (c *vtctldClient) LookupVindexExternalize(ctx context.Context, in *vtctldat return out, nil } +func (c *vtctldClient) LookupVindexInternalize(ctx context.Context, in *vtctldata.LookupVindexInternalizeRequest, opts ...grpc.CallOption) (*vtctldata.LookupVindexInternalizeResponse, error) { + out := new(vtctldata.LookupVindexInternalizeResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/LookupVindexInternalize", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) MaterializeCreate(ctx context.Context, in *vtctldata.MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldata.MaterializeCreateResponse, error) { out := new(vtctldata.MaterializeCreateResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/MaterializeCreate", in, out, opts...) @@ -1850,8 +1870,10 @@ type VtctldServer interface { InitShardPrimary(context.Context, *vtctldata.InitShardPrimaryRequest) (*vtctldata.InitShardPrimaryResponse, error) // LaunchSchemaMigration launches one or all migrations executed with --postpone-launch. LaunchSchemaMigration(context.Context, *vtctldata.LaunchSchemaMigrationRequest) (*vtctldata.LaunchSchemaMigrationResponse, error) + LookupVindexComplete(context.Context, *vtctldata.LookupVindexCompleteRequest) (*vtctldata.LookupVindexCompleteResponse, error) LookupVindexCreate(context.Context, *vtctldata.LookupVindexCreateRequest) (*vtctldata.LookupVindexCreateResponse, error) LookupVindexExternalize(context.Context, *vtctldata.LookupVindexExternalizeRequest) (*vtctldata.LookupVindexExternalizeResponse, error) + LookupVindexInternalize(context.Context, *vtctldata.LookupVindexInternalizeRequest) (*vtctldata.LookupVindexInternalizeResponse, error) // MaterializeCreate creates a workflow to materialize one or more tables // from a source keyspace to a target keyspace using a provided expressions. MaterializeCreate(context.Context, *vtctldata.MaterializeCreateRequest) (*vtctldata.MaterializeCreateResponse, error) @@ -2226,12 +2248,18 @@ func (UnimplementedVtctldServer) InitShardPrimary(context.Context, *vtctldata.In func (UnimplementedVtctldServer) LaunchSchemaMigration(context.Context, *vtctldata.LaunchSchemaMigrationRequest) (*vtctldata.LaunchSchemaMigrationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LaunchSchemaMigration not implemented") } +func (UnimplementedVtctldServer) LookupVindexComplete(context.Context, *vtctldata.LookupVindexCompleteRequest) (*vtctldata.LookupVindexCompleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LookupVindexComplete not implemented") +} func (UnimplementedVtctldServer) LookupVindexCreate(context.Context, *vtctldata.LookupVindexCreateRequest) (*vtctldata.LookupVindexCreateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LookupVindexCreate not implemented") } func (UnimplementedVtctldServer) LookupVindexExternalize(context.Context, *vtctldata.LookupVindexExternalizeRequest) (*vtctldata.LookupVindexExternalizeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LookupVindexExternalize not implemented") } +func (UnimplementedVtctldServer) LookupVindexInternalize(context.Context, *vtctldata.LookupVindexInternalizeRequest) (*vtctldata.LookupVindexInternalizeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LookupVindexInternalize not implemented") +} func (UnimplementedVtctldServer) MaterializeCreate(context.Context, *vtctldata.MaterializeCreateRequest) (*vtctldata.MaterializeCreateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MaterializeCreate not implemented") } @@ -3565,6 +3593,24 @@ func _Vtctld_LaunchSchemaMigration_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Vtctld_LookupVindexComplete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.LookupVindexCompleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).LookupVindexComplete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/LookupVindexComplete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).LookupVindexComplete(ctx, req.(*vtctldata.LookupVindexCompleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_LookupVindexCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.LookupVindexCreateRequest) if err := dec(in); err != nil { @@ -3601,6 +3647,24 @@ func _Vtctld_LookupVindexExternalize_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Vtctld_LookupVindexInternalize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.LookupVindexInternalizeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).LookupVindexInternalize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/LookupVindexInternalize", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).LookupVindexInternalize(ctx, req.(*vtctldata.LookupVindexInternalizeRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_MaterializeCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.MaterializeCreateRequest) if err := dec(in); err != nil { @@ -4935,6 +4999,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "LaunchSchemaMigration", Handler: _Vtctld_LaunchSchemaMigration_Handler, }, + { + MethodName: "LookupVindexComplete", + Handler: _Vtctld_LookupVindexComplete_Handler, + }, { MethodName: "LookupVindexCreate", Handler: _Vtctld_LookupVindexCreate_Handler, @@ -4943,6 +5011,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "LookupVindexExternalize", Handler: _Vtctld_LookupVindexExternalize_Handler, }, + { + MethodName: "LookupVindexInternalize", + Handler: _Vtctld_LookupVindexInternalize_Handler, + }, { MethodName: "MaterializeCreate", Handler: _Vtctld_MaterializeCreate_Handler, diff --git a/go/vt/vtctl/grpcvtctldclient/client_gen.go b/go/vt/vtctl/grpcvtctldclient/client_gen.go index 415c737ace8..368c0573bd7 100644 --- a/go/vt/vtctl/grpcvtctldclient/client_gen.go +++ b/go/vt/vtctl/grpcvtctldclient/client_gen.go @@ -596,6 +596,15 @@ func (client *gRPCVtctldClient) LaunchSchemaMigration(ctx context.Context, in *v return client.c.LaunchSchemaMigration(ctx, in, opts...) } +// LookupVindexComplete is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) LookupVindexComplete(ctx context.Context, in *vtctldatapb.LookupVindexCompleteRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexCompleteResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.LookupVindexComplete(ctx, in, opts...) +} + // LookupVindexCreate is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) LookupVindexCreate(ctx context.Context, in *vtctldatapb.LookupVindexCreateRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexCreateResponse, error) { if client.c == nil { @@ -614,6 +623,15 @@ func (client *gRPCVtctldClient) LookupVindexExternalize(ctx context.Context, in return client.c.LookupVindexExternalize(ctx, in, opts...) } +// LookupVindexInternalize is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) LookupVindexInternalize(ctx context.Context, in *vtctldatapb.LookupVindexInternalizeRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexInternalizeResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.LookupVindexInternalize(ctx, in, opts...) +} + // MaterializeCreate is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) MaterializeCreate(ctx context.Context, in *vtctldatapb.MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldatapb.MaterializeCreateResponse, error) { if client.c == nil { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index a3d822ce002..55b1beab37e 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -3013,6 +3013,21 @@ func (s *VtctldServer) LaunchSchemaMigration(ctx context.Context, req *vtctldata return resp, nil } +// LookupVindexComplete is part of the vtctlservicepb.VtctldServer interface. +func (s *VtctldServer) LookupVindexComplete(ctx context.Context, req *vtctldatapb.LookupVindexCompleteRequest) (resp *vtctldatapb.LookupVindexCompleteResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.LookupVindexComplete") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("name", req.Name) + span.Annotate("keyspace", req.Keyspace) + span.Annotate("table_keyspace", req.TableKeyspace) + + resp, err = s.ws.LookupVindexComplete(ctx, req) + return resp, err +} + // LookupVindexCreate is part of the vtctlservicepb.VtctldServer interface. func (s *VtctldServer) LookupVindexCreate(ctx context.Context, req *vtctldatapb.LookupVindexCreateRequest) (resp *vtctldatapb.LookupVindexCreateResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.LookupVindexCreate") @@ -3045,6 +3060,21 @@ func (s *VtctldServer) LookupVindexExternalize(ctx context.Context, req *vtctlda return resp, err } +// LookupVindexInternalize is part of the vtctlservicepb.VtctldServer interface. +func (s *VtctldServer) LookupVindexInternalize(ctx context.Context, req *vtctldatapb.LookupVindexInternalizeRequest) (resp *vtctldatapb.LookupVindexInternalizeResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.LookupVindexInternalize") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("name", req.Name) + span.Annotate("keyspace", req.Keyspace) + span.Annotate("table_keyspace", req.TableKeyspace) + + resp, err = s.ws.LookupVindexInternalize(ctx, req) + return resp, err +} + // MaterializeCreate is part of the vtctlservicepb.VtctldServer interface. func (s *VtctldServer) MaterializeCreate(ctx context.Context, req *vtctldatapb.MaterializeCreateRequest) (resp *vtctldatapb.MaterializeCreateResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.MaterializeCreate") diff --git a/go/vt/vtctl/localvtctldclient/client_gen.go b/go/vt/vtctl/localvtctldclient/client_gen.go index fd26dc6e4b1..53b8f2d1b8c 100644 --- a/go/vt/vtctl/localvtctldclient/client_gen.go +++ b/go/vt/vtctl/localvtctldclient/client_gen.go @@ -436,6 +436,11 @@ func (client *localVtctldClient) LaunchSchemaMigration(ctx context.Context, in * return client.s.LaunchSchemaMigration(ctx, in) } +// LookupVindexComplete is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) LookupVindexComplete(ctx context.Context, in *vtctldatapb.LookupVindexCompleteRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexCompleteResponse, error) { + return client.s.LookupVindexComplete(ctx, in) +} + // LookupVindexCreate is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) LookupVindexCreate(ctx context.Context, in *vtctldatapb.LookupVindexCreateRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexCreateResponse, error) { return client.s.LookupVindexCreate(ctx, in) @@ -446,6 +451,11 @@ func (client *localVtctldClient) LookupVindexExternalize(ctx context.Context, in return client.s.LookupVindexExternalize(ctx, in) } +// LookupVindexInternalize is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) LookupVindexInternalize(ctx context.Context, in *vtctldatapb.LookupVindexInternalizeRequest, opts ...grpc.CallOption) (*vtctldatapb.LookupVindexInternalizeResponse, error) { + return client.s.LookupVindexInternalize(ctx, in) +} + // MaterializeCreate is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) MaterializeCreate(ctx context.Context, in *vtctldatapb.MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldatapb.MaterializeCreateResponse, error) { return client.s.MaterializeCreate(ctx, in) diff --git a/go/vt/vtctl/workflow/lookup_vindex.go b/go/vt/vtctl/workflow/lookup_vindex.go index cf9b4833c28..cef411e7eaf 100644 --- a/go/vt/vtctl/workflow/lookup_vindex.go +++ b/go/vt/vtctl/workflow/lookup_vindex.go @@ -30,11 +30,13 @@ import ( "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/schematools" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" "vitess.io/vitess/go/vt/vttablet/tmclient" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -540,3 +542,52 @@ func generateColDef(lines []string, sourceVindexCol, vindexFromCol string) (stri } return "", fmt.Errorf("column %s not found in schema %v", sourceVindexCol, lines) } + +// validateExternalizedVindex checks if a given vindex is externalized. +// A vindex is considered externalized if it has an owner and is not in write-only mode. +func (lv *lookupVindex) validateExternalizedVindex(vindex *vschemapb.Vindex) error { + writeOnly, ok := vindex.Params["write_only"] + if ok && writeOnly == "true" { + return fmt.Errorf("vindex is in write-only mode") + } + if vindex.Owner == "" { + return fmt.Errorf("vindex has no owner") + } + return nil +} + +// validateExternalized checks if the vindex has been externalized +// and verifies the state of the VReplication workflow on the target shards. +// It ensures that all streams in the workflow are frozen. +func (lv *lookupVindex) validateExternalized(ctx context.Context, vindex *vschemapb.Vindex, name string, targetShards []*topo.ShardInfo) error { + if err := lv.validateExternalizedVindex(vindex); err != nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "vindex %s has not been externalized yet: %v", name, err) + } + + err := forAllShards(targetShards, func(targetShard *topo.ShardInfo) error { + targetPrimary, err := lv.ts.GetTablet(ctx, targetShard.PrimaryAlias) + if err != nil { + return err + } + res, err := lv.tmc.ReadVReplicationWorkflow(ctx, targetPrimary.Tablet, &tabletmanagerdatapb.ReadVReplicationWorkflowRequest{ + Workflow: name, + }) + if err != nil { + return err + } + if res == nil || res.Workflow == "" { + return vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "workflow %s not found on %v", name, topoproto.TabletAliasString(targetPrimary.Alias)) + } + for _, stream := range res.Streams { + // All streams need to be frozen. + if stream.State != binlogdatapb.VReplicationWorkflowState_Stopped || stream.Message != Frozen { + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "stream %d for %v/%v is not frozen: %v, %v", stream.Id, targetShard.Keyspace(), targetShard.ShardName(), stream.State, stream.Message) + } + } + return nil + }) + if err != nil { + return err + } + return nil +} diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index 0c40c0dd6d6..0c8da8d9363 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -124,6 +124,8 @@ const ( lockTablesCycles = 2 // Time to wait between LOCK TABLES cycles on the sources during SwitchWrites. lockTablesCycleDelay = time.Duration(100 * time.Millisecond) + + SqlUnfreezeWorkflow = "update _vt.vreplication set state='Running', message='' where db_name=%a and workflow=%a" ) var ( @@ -551,6 +553,43 @@ func (s *Server) getWorkflowState(ctx context.Context, targetKeyspace, workflowN return ts, state, nil } +// LookupVindexComplete checks if the lookup vindex has been externalized, +// and if the vindex has an owner, it deletes the workflow. +func (s *Server) LookupVindexComplete(ctx context.Context, req *vtctldatapb.LookupVindexCompleteRequest) (*vtctldatapb.LookupVindexCompleteResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.LookupVindexComplete") + defer span.Finish() + + span.Annotate("keyspace", req.Keyspace) + span.Annotate("name", req.Name) + span.Annotate("table_keyspace", req.TableKeyspace) + + vindex, _, err := getVindexAndVSchema(ctx, s.ts, req.Keyspace, req.Name) + if err != nil { + return nil, err + } + + targetShards, err := s.ts.GetServingShards(ctx, req.TableKeyspace) + if err != nil { + return nil, err + } + + lv := newLookupVindex(s) + if err = lv.validateExternalized(ctx, vindex, req.Name, targetShards); err != nil { + return nil, err + } + + resp := &vtctldatapb.LookupVindexCompleteResponse{} + if _, derr := s.WorkflowDelete(ctx, &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: req.TableKeyspace, + Workflow: req.Name, + KeepData: true, + KeepRoutingRules: true, + }); derr != nil { + return nil, vterrors.Wrapf(derr, "failed to delete workflow %s", req.Name) + } + return resp, nil +} + // LookupVindexCreate creates the lookup vindex in the specified // keyspace and creates a VReplication workflow to backfill that // vindex from the keyspace to the target/lookup table specified. @@ -602,7 +641,7 @@ func (s *Server) LookupVindexCreate(ctx context.Context, req *vtctldatapb.Lookup // LookupVindexExternalize externalizes a lookup vindex that's // finished backfilling or has caught up. If the vindex has an -// owner then the workflow will also be deleted. +// owner then the workflow will also be stopped. func (s *Server) LookupVindexExternalize(ctx context.Context, req *vtctldatapb.LookupVindexExternalizeRequest) (*vtctldatapb.LookupVindexExternalizeResponse, error) { span, ctx := trace.NewSpan(ctx, "workflow.Server.LookupVindexExternalize") defer span.Finish() @@ -610,15 +649,11 @@ func (s *Server) LookupVindexExternalize(ctx context.Context, req *vtctldatapb.L span.Annotate("keyspace", req.Keyspace) span.Annotate("name", req.Name) span.Annotate("table_keyspace", req.TableKeyspace) + span.Annotate("delete_workflow", req.DeleteWorkflow) - // Find the lookup vindex by by name. - sourceVschema, err := s.ts.GetVSchema(ctx, req.Keyspace) + vindex, sourceVSchema, err := getVindexAndVSchema(ctx, s.ts, req.Keyspace, req.Name) if err != nil { - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to get vschema for the %s keyspace", req.Keyspace) - } - vindex := sourceVschema.Vindexes[req.Name] - if vindex == nil { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "vindex %s not found in the %s keyspace", req.Name, req.Keyspace) + return nil, err } targetShards, err := s.ts.GetServingShards(ctx, req.TableKeyspace) @@ -637,8 +672,8 @@ func (s *Server) LookupVindexExternalize(ctx context.Context, req *vtctldatapb.L if err != nil { return err } - if res == nil { - return vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "workflow %s not found on %v", req.Name, targetPrimary.Alias) + if res == nil || res.Workflow == "" { + return vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "workflow %s not found on %v", req.Name, topoproto.TabletAliasString(targetPrimary.Alias)) } for _, stream := range res.Streams { if stream.Bls.Filter == nil || len(stream.Bls.Filter.Rules) != 1 { @@ -666,28 +701,105 @@ func (s *Server) LookupVindexExternalize(ctx context.Context, req *vtctldatapb.L resp := &vtctldatapb.LookupVindexExternalizeResponse{} if vindex.Owner != "" { - // If there is an owner, we have to delete the streams. Once we externalize it - // the VTGate will now be responsible for keeping the lookup table up to date - // with the owner table. - if _, derr := s.WorkflowDelete(ctx, &vtctldatapb.WorkflowDeleteRequest{ - Keyspace: req.TableKeyspace, - Workflow: req.Name, - KeepData: true, // Not relevant - KeepRoutingRules: true, // Not relevant - }); derr != nil { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "failed to delete workflow %s: %v", req.Name, derr) + // If there is an owner, we have to stop/delete the streams. Once we + // externalize it the VTGate will now be responsible for keeping the + // lookup table up to date with the owner table. + if req.DeleteWorkflow { + // Delete the workflow. + if _, derr := s.WorkflowDelete(ctx, &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: req.TableKeyspace, + Workflow: req.Name, + KeepData: true, // Not relevant + KeepRoutingRules: true, // Not relevant + }); derr != nil { + return nil, vterrors.Wrapf(derr, "failed to delete workflow %s", req.Name) + } + resp.WorkflowDeleted = true + } else { + // Freeze the workflow. + err = forAllShards(targetShards, func(si *topo.ShardInfo) error { + tabletInfo, err := s.ts.GetTablet(ctx, si.PrimaryAlias) + if err != nil { + return err + } + _, err = s.tmc.UpdateVReplicationWorkflow(ctx, tabletInfo.Tablet, &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: req.Name, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Stopped), + Message: ptr.Of(Frozen), + }) + if err != nil { + return vterrors.Wrapf(err, "failed to stop workflow %s on shard %s/%s", req.Name, tabletInfo.Keyspace, tabletInfo.Shard) + } + return nil + }) + if err != nil { + return nil, err + } + resp.WorkflowStopped = true } - resp.WorkflowDeleted = true } // Remove the write_only param and save the source vschema. delete(vindex.Params, "write_only") - if err := s.ts.SaveVSchema(ctx, req.Keyspace, sourceVschema); err != nil { + if err := s.ts.SaveVSchema(ctx, req.Keyspace, sourceVSchema); err != nil { return nil, err } return resp, s.ts.RebuildSrvVSchema(ctx, nil) } +// LookupVindexInternalize internalizes a lookup vindex. +func (s *Server) LookupVindexInternalize(ctx context.Context, req *vtctldatapb.LookupVindexInternalizeRequest) (*vtctldatapb.LookupVindexInternalizeResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.LookupVindexInternalize") + defer span.Finish() + + span.Annotate("keyspace", req.Keyspace) + span.Annotate("name", req.Name) + span.Annotate("table_keyspace", req.TableKeyspace) + + vindex, sourceVSchema, err := getVindexAndVSchema(ctx, s.ts, req.Keyspace, req.Name) + if err != nil { + return nil, err + } + + targetShards, err := s.ts.GetServingShards(ctx, req.TableKeyspace) + if err != nil { + return nil, err + } + + lv := newLookupVindex(s) + if err = lv.validateExternalized(ctx, vindex, req.Name, targetShards); err != nil { + return nil, err + } + + // Make the vindex back to write_only and save the source vschema. + vindex.Params["write_only"] = "true" + if err := s.ts.SaveVSchema(ctx, req.Keyspace, sourceVSchema); err != nil { + return nil, err + } + + resp := &vtctldatapb.LookupVindexInternalizeResponse{} + err = forAllShards(targetShards, func(si *topo.ShardInfo) error { + tabletInfo, err := s.ts.GetTablet(ctx, si.PrimaryAlias) + if err != nil { + return err + } + query, err := sqlparser.ParseAndBind(SqlUnfreezeWorkflow, + sqltypes.StringBindVariable(tabletInfo.DbName()), + sqltypes.StringBindVariable(req.Name), + ) + if err != nil { + return err + } + _, err = s.tmc.VReplicationExec(ctx, tabletInfo.Tablet, query) + return err + }) + if err != nil { + return nil, err + } + + return resp, s.ts.RebuildSrvVSchema(ctx, nil) +} + // Materialize performs the steps needed to materialize a list of // tables based on the materialization specs. func (s *Server) Materialize(ctx context.Context, ms *vtctldatapb.MaterializeSettings) error { @@ -830,7 +942,7 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl return nil, err } if len(tables) > 0 { - err = validateSourceTablesExist(ctx, sourceKeyspace, ksTables, tables) + err = validateSourceTablesExist(sourceKeyspace, ksTables, tables) if err != nil { return nil, err } @@ -842,7 +954,7 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl } } if len(req.ExcludeTables) > 0 { - err = validateSourceTablesExist(ctx, sourceKeyspace, ksTables, req.ExcludeTables) + err = validateSourceTablesExist(sourceKeyspace, ksTables, req.ExcludeTables) if err != nil { return nil, err } diff --git a/go/vt/vtctl/workflow/utils.go b/go/vt/vtctl/workflow/utils.go index 65fa49fde86..593cdeda46f 100644 --- a/go/vt/vtctl/workflow/utils.go +++ b/go/vt/vtctl/workflow/utils.go @@ -51,6 +51,7 @@ import ( querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -1028,7 +1029,7 @@ func applyTargetShards(ts *trafficSwitcher, targetShards []string) error { // validateSourceTablesExist validates that tables provided are present // in the source keyspace. -func validateSourceTablesExist(ctx context.Context, sourceKeyspace string, ksTables, tables []string) error { +func validateSourceTablesExist(sourceKeyspace string, ksTables, tables []string) error { var missingTables []string for _, table := range tables { if schema.IsInternalOperationTableName(table) { @@ -1051,3 +1052,17 @@ func validateSourceTablesExist(ctx context.Context, sourceKeyspace string, ksTab } return nil } + +// getVindexAndVSchema gets the vindex (from VSchema) and VSchema with the +// provided vindex name and keyspace. +func getVindexAndVSchema(ctx context.Context, ts *topo.Server, keyspace string, vindexName string) (*vschemapb.Vindex, *vschemapb.Keyspace, error) { + vschema, err := ts.GetVSchema(ctx, keyspace) + if err != nil { + return nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to get vschema for the %s keyspace", keyspace) + } + vindex := vschema.Vindexes[vindexName] + if vindex == nil { + return nil, nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "vindex %s not found in the %s keyspace", vindexName, keyspace) + } + return vindex, vschema, nil +} diff --git a/go/vt/vtctl/workflow/utils_test.go b/go/vt/vtctl/workflow/utils_test.go index 8458cf60995..eecbfd6269b 100644 --- a/go/vt/vtctl/workflow/utils_test.go +++ b/go/vt/vtctl/workflow/utils_test.go @@ -247,7 +247,6 @@ func startEtcd(t *testing.T) string { } func TestValidateSourceTablesExist(t *testing.T) { - ctx := context.Background() ks := "source_keyspace" ksTables := []string{"table1", "table2"} @@ -272,7 +271,7 @@ func TestValidateSourceTablesExist(t *testing.T) { } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - err := validateSourceTablesExist(ctx, ks, ksTables, tc.tables) + err := validateSourceTablesExist(ks, ksTables, tc.tables) if tc.errContains != "" { assert.ErrorContains(t, err, tc.errContains) } else { diff --git a/go/vt/vttablet/tabletmanager/framework_test.go b/go/vt/vttablet/tabletmanager/framework_test.go index 35aa7a08b46..8e03f73bf79 100644 --- a/go/vt/vttablet/tabletmanager/framework_test.go +++ b/go/vt/vttablet/tabletmanager/framework_test.go @@ -399,6 +399,8 @@ type fakeTMClient struct { getSchemaCounts map[string]int // Used to confirm the number of times WorkflowDelete was called. workflowDeleteCalls int + // Used to confirm the number of times UpdateVReplicationWorkflow with state as Stopped was called. + workflowStopCalls int } func newFakeTMClient() *fakeTMClient { @@ -580,5 +582,8 @@ func (tmc *fakeTMClient) ReadVReplicationWorkflows(ctx context.Context, tablet * func (tmc *fakeTMClient) UpdateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowResponse, error) { tmc.mu.Lock() defer tmc.mu.Unlock() + if *req.State == binlogdatapb.VReplicationWorkflowState_Stopped { + tmc.workflowStopCalls++ + } return tmc.tablets[int(tablet.Alias.Uid)].tm.UpdateVReplicationWorkflow(ctx, req) } diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication.go b/go/vt/vttablet/tabletmanager/rpc_vreplication.go index 8ddf1391ac4..522128cbf60 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication.go @@ -61,7 +61,7 @@ const ( // Retrieve the current configuration values for a workflow's vreplication stream(s). sqlSelectVReplicationWorkflowConfig = "select id, source, cell, tablet_types, state, message from %s.vreplication where workflow = %a" // Update the configuration values for a workflow's vreplication stream. - sqlUpdateVReplicationWorkflowStreamConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a %s where id = %a" + sqlUpdateVReplicationWorkflowStreamConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a, message = %a %s where id = %a" // Update field values for multiple workflows. The final format specifier is // used to optionally add any additional predicates to the query. sqlUpdateVReplicationWorkflows = "update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ %s.vreplication set%s where db_name = '%s'%s" @@ -568,6 +568,9 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta if !textutil.ValueIsSimulatedNull(req.TabletTypes) { tabletTypes = req.TabletTypes } + if req.Message != nil { + message = *req.Message + } tabletTypesStr := topoproto.MakeStringTypeCSV(tabletTypes) if req.TabletSelectionPreference != nil && ((inorder && *req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN) || @@ -609,9 +612,10 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta "sc": sqltypes.StringBindVariable(string(source)), "cl": sqltypes.StringBindVariable(strings.Join(cells, ",")), "tt": sqltypes.StringBindVariable(tabletTypesStr), + "ms": sqltypes.StringBindVariable(message), "id": sqltypes.Int64BindVariable(id), } - parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowStreamConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", options, ":id") + parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowStreamConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", ":ms", options, ":id") stmt, err = parsed.GenerateQuery(bindVars, nil) if err != nil { return nil, err diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go index 762b384a5f6..b463eeb0303 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go @@ -82,7 +82,7 @@ const ( readWorkflowsLimited = "select workflow, id, source, pos, stop_pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, message, db_name, rows_copied, tags, time_heartbeat, workflow_type, time_throttled, component_throttled, workflow_sub_type, defer_secondary_keys, options from _vt.vreplication where db_name = '%s' and workflow in ('%s') group by workflow, id order by workflow, id" readWorkflow = "select id, source, pos, stop_pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, message, db_name, rows_copied, tags, time_heartbeat, workflow_type, time_throttled, component_throttled, workflow_sub_type, defer_secondary_keys, options from _vt.vreplication where workflow = '%s' and db_name = '%s'" readWorkflowConfig = "select id, source, cell, tablet_types, state, message from _vt.vreplication where workflow = '%s'" - updateWorkflow = "update _vt.vreplication set state = '%s', source = '%s', cell = '%s', tablet_types = '%s' where id in (%d)" + updateWorkflow = "update _vt.vreplication set state = '%s', source = '%s', cell = '%s', tablet_types = '%s', message = '%s' where id in (%d)" getNonEmptyTableQuery = "select 1 from `%s` limit 1" ) @@ -441,7 +441,7 @@ func TestMoveTablesUnsharded(t *testing.T) { fmt.Sprintf("%d|%s|||Stopped|", vreplID, bls), ), nil) ftc.vrdbClient.ExpectRequest(idQuery, idRes, nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(updateWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String(), bls, "", "", vreplID), &sqltypes.Result{}, nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(updateWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String(), bls, "", "", "", vreplID), &sqltypes.Result{}, nil) ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), sqltypes.MakeTestResult( sqltypes.MakeTestFields( @@ -704,7 +704,7 @@ func TestMoveTablesSharded(t *testing.T) { fmt.Sprintf("%d|%s|||Stopped|", vreplID, bls), ), nil) ftc.vrdbClient.ExpectRequest(idQuery, idRes, nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(updateWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String(), bls, "", "", vreplID), &sqltypes.Result{}, nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(updateWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String(), bls, "", "", "", vreplID), &sqltypes.Result{}, nil) ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), sqltypes.MakeTestResult( sqltypes.MakeTestFields( @@ -894,6 +894,13 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { ), fmt.Sprintf("%d|%s|%s|%s|Running|", vreplID, blsStr, cells[0], tabletTypes[0]), ) + selectResNonEmptyMessage := sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|cell|tablet_types|state|message", + "int64|varchar|varchar|varchar|varchar|varbinary", + ), + fmt.Sprintf("%d|%s|%s|%s|Running|initial test message", vreplID, blsStr, cells[0], tabletTypes[0]), + ) idQuery, err := sqlparser.ParseAndBind("select id from _vt.vreplication where id = %a", sqltypes.Int64BindVariable(int64(vreplID))) @@ -915,10 +922,11 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { copying := sqltypes.MakeTestResult(copyStatusFields, "1") tests := []struct { - name string - request *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest - query string - isCopying bool + name string + request *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest + query string + isCopying bool + initiallyNonEmptyMessage bool }{ { name: "update cells", @@ -927,7 +935,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { Cells: []string{"zone2"}, // TabletTypes is an empty value, so the current value should be cleared }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '', message = '' where id in (%d)`, keyspace, shard, "zone2", vreplID), }, { @@ -937,7 +945,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { Cells: []string{"zone3"}, TabletTypes: textutil.SimulatedNullTabletTypeSlice, // So keep the current value of replica }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s', message = '' where id in (%d)`, keyspace, shard, "zone3", tabletTypes[0], vreplID), }, { @@ -947,9 +955,20 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { TabletSelectionPreference: &inOrder, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA}, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '%s', message = '' where id in (%d)`, keyspace, shard, "in_order:rdonly,replica", vreplID), }, + { + name: "update tablet_types, initially non-empty message", + request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: workflow, + TabletSelectionPreference: &inOrder, + TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA}, + }, + initiallyNonEmptyMessage: true, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '%s', message = '%s' where id in (%d)`, + keyspace, shard, "in_order:rdonly,replica", "initial test message", vreplID), + }, { name: "update tablet_types, NULL cells", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ @@ -957,7 +976,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { Cells: textutil.SimulatedNullStringSlice, // So keep the current value of zone1 TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY}, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s', message = '' where id in (%d)`, keyspace, shard, cells[0], "rdonly", vreplID), }, { @@ -966,7 +985,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { Workflow: workflow, OnDdl: &exec, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '', tablet_types = '' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '', tablet_types = '', message = '' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC.String(), vreplID), }, { @@ -977,7 +996,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_PRIMARY}, OnDdl: &execIgnore, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '%s', tablet_types = '%s', message = '' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC_IGNORE.String(), "zone1,zone2,zone3", "rdonly,replica,primary", vreplID), }, { @@ -988,9 +1007,28 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { Cells: textutil.SimulatedNullStringSlice, TabletTypes: textutil.SimulatedNullTabletTypeSlice, }, - query: fmt.Sprintf(`update _vt.vreplication set state = '%s', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = '%s', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s', message = '' where id in (%d)`, binlogdatapb.VReplicationWorkflowState_Stopped.String(), keyspace, shard, cells[0], tabletTypes[0], vreplID), }, + { + name: "update message", + request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: workflow, + Message: ptr.Of("test message"), + }, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '', message = '%s' where id in (%d)`, + keyspace, shard, "test message", vreplID), + }, + { + name: "update message, initially non-empty message", + request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: workflow, + Message: ptr.Of("test message"), + }, + initiallyNonEmptyMessage: true, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '', message = '%s' where id in (%d)`, + keyspace, shard, "test message", vreplID), + }, { name: "update to running while copying", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ @@ -1000,7 +1038,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { TabletTypes: textutil.SimulatedNullTabletTypeSlice, }, isCopying: true, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Copying', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Copying', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s', message = '' where id in (%d)`, keyspace, shard, cells[0], tabletTypes[0], vreplID), }, { @@ -1013,7 +1051,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { "password": "secret", }, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '', options = json_set(options, '$.config', json_object(), '$.config."password"', 'secret', '$.config."user"', 'admin') where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '', message = '', options = json_set(options, '$.config', json_object(), '$.config."password"', 'secret', '$.config."user"', 'admin') where id in (%d)`, keyspace, shard, "zone2", vreplID), }, } @@ -1035,7 +1073,11 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { // These are the same for each RPC call. tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) - tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(selectQuery, selectRes, nil) + if tt.initiallyNonEmptyMessage { + tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(selectQuery, selectResNonEmptyMessage, nil) + } else { + tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(selectQuery, selectRes, nil) + } if tt.request.State == nil || *tt.request.State == binlogdatapb.VReplicationWorkflowState_Running { tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) if tt.isCopying { @@ -1924,7 +1966,8 @@ func TestExternalizeLookupVindex(t *testing.T) { vrResponse *sqltypes.Result err string expectedVschema *vschemapb.Keyspace - expectDelete bool + expectStopped bool + expectDeleted bool }{ { request: &vtctldatapb.LookupVindexExternalizeRequest{ @@ -1946,7 +1989,7 @@ func TestExternalizeLookupVindex(t *testing.T) { }, }, }, - expectDelete: true, + expectStopped: true, }, { request: &vtctldatapb.LookupVindexExternalizeRequest{ @@ -1989,7 +2032,30 @@ func TestExternalizeLookupVindex(t *testing.T) { }, }, }, - expectDelete: true, + expectStopped: true, + }, + { + request: &vtctldatapb.LookupVindexExternalizeRequest{ + Name: "owned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + DeleteWorkflow: true, + }, + vrResponse: ownedRunning, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + }, + Owner: "t1", + }, + }, + }, + expectDeleted: true, }, { request: &vtctldatapb.LookupVindexExternalizeRequest{ @@ -2042,20 +2108,566 @@ func TestExternalizeLookupVindex(t *testing.T) { require.NotNil(t, tcase.request, "No request provided") + bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select * from t1\"}}", sourceKs, sourceShard) + + idQuery, err := sqlparser.ParseAndBind("select id from _vt.vreplication where id = %a", + sqltypes.Int64BindVariable(int64(vreplID))) + require.NoError(t, err) + idRes := sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + fmt.Sprintf("%d", vreplID), + ) + + streamsResult := sqltypes.MakeTestResult(sqltypes.MakeTestFields( + "id|state|cell|tablet_types|source", + "int64|varchar|varchar|varchar|varchar"), + fmt.Sprintf("%d|%s|cell1|PRIMARY|keyspace:\"%s\" shard:\"%s\"", 1, binlogdatapb.VReplicationWorkflowState_Stopped.String(), sourceKs, sourceShard), + ) for _, targetTablet := range targetShards { targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, tcase.request.Name, tenv.dbName), tcase.vrResponse, nil) - if tcase.err == "" { + // Update queries are required only if the Vindex is owned. + if tcase.expectStopped && len(tcase.expectedVschema.Vindexes) > 0 && tcase.expectedVschema.Vindexes[tcase.request.Name].Owner != "" { + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowConfig, tcase.request.Name), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|cell|tablet_types|state|message", + "int64|blob|varchar|varchar|varchar|varchar", + ), + fmt.Sprintf("%d|%s||primary|Stopped|", vreplID, bls), + ), nil) + targetTablet.vrdbClient.ExpectRequest(idQuery, idRes, nil) + targetTablet.vrdbClient.ExpectRequest(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:"sourceks" shard:"0" filter:{rules:{match:"t1" filter:"select * from t1"}}', cell = '', tablet_types = '', message = 'FROZEN' where id in (1)`, &sqltypes.Result{}, nil) + targetTablet.vrdbClient.ExpectRequest(`select * from _vt.vreplication where id = 1`, streamsResult, nil) + } + if tcase.expectDeleted { // We query the workflow again to build the status output when // it's successfully created. targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, tcase.request.Name, tenv.dbName), tcase.vrResponse, nil) } } + preWorkflowStopCalls := tenv.tmc.workflowStopCalls preWorkflowDeleteCalls := tenv.tmc.workflowDeleteCalls _, err = ws.LookupVindexExternalize(ctx, tcase.request) if tcase.err != "" { if err == nil || !strings.Contains(err.Error(), tcase.err) { - require.FailNow(t, "LookupVindexExternalize error", "ExternalizeVindex(%v) err: %v, must contain %v", tcase.request, err, tcase.err) + require.FailNow(t, "LookupVindexExternalize error", "LookupVindexExternalize(%v) err: %v, must contain %v", tcase.request, err, tcase.err) + } + return + } + require.NoError(t, err) + expectedWorkflowStopCalls := preWorkflowStopCalls + if tcase.expectStopped { + // We expect the RPC to be called on each target shard. + expectedWorkflowStopCalls = preWorkflowStopCalls + (len(targetShards)) + } + expectedWorkflowDeleteCalls := preWorkflowDeleteCalls + if tcase.expectDeleted { + // We expect the RPC to be called on each target shard. + expectedWorkflowDeleteCalls = preWorkflowDeleteCalls + (len(targetShards)) + } + require.Equal(t, expectedWorkflowStopCalls, tenv.tmc.workflowStopCalls) + require.Equal(t, expectedWorkflowDeleteCalls, tenv.tmc.workflowDeleteCalls) + + aftervschema, err := tenv.ts.GetVSchema(ctx, ms.SourceKeyspace) + require.NoError(t, err) + vindex := aftervschema.Vindexes[tcase.request.Name] + expectedVindex := tcase.expectedVschema.Vindexes[tcase.request.Name] + require.NotNil(t, vindex, "vindex %s not found in vschema", tcase.request.Name) + require.NotContains(t, vindex.Params, "write_only", tcase.request) + require.Equal(t, expectedVindex, vindex, "vindex mismatch. expected: %+v, got: %+v", expectedVindex, vindex) + }) + } +} + +func TestInternalizeLookupVindex(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + sourceKs := "sourceks" + sourceShard := "0" + sourceTabletUID := 200 + targetKs := "targetks" + targetShards := make(map[string]*fakeTabletConn) + targetTabletUID := 300 + wf := "testwf" + vreplID := 1 + vtenv := vtenv.NewTestEnv() + tenv := newTestEnv(t, ctx, sourceKs, []string{shard}) + defer tenv.close() + + sourceTablet := tenv.addTablet(t, sourceTabletUID, sourceKs, sourceShard) + defer tenv.deleteTablet(sourceTablet.tablet) + + targetShards["-80"] = tenv.addTablet(t, targetTabletUID, targetKs, "-80") + defer tenv.deleteTablet(targetShards["-80"].tablet) + addInvariants(targetShards["-80"].vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) + targetShards["80-"] = tenv.addTablet(t, targetTabletUID+10, targetKs, "80-") + defer tenv.deleteTablet(targetShards["80-"].tablet) + addInvariants(targetShards["80-"].vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) + + ws := workflow.NewServer(vtenv, tenv.ts, tenv.tmc) + ms := &vtctldatapb.MaterializeSettings{ + // Keyspace where the vindex is created. + SourceKeyspace: sourceKs, + // Keyspace where the lookup table and VReplication workflow is created. + TargetKeyspace: targetKs, + Cell: tenv.cells[0], + TabletTypes: topoproto.MakeStringTypeCSV([]topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_RDONLY, + }), + } + + sourceVschema := &vschemapb.Keyspace{ + Sharded: false, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + }, + Owner: "t1", + }, + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + }, + }, + "unqualified_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "unqualified", + "from": "c1", + "to": "c2", + }, + }, + }, + Tables: map[string]*vschemapb.Table{ + "t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Name: "xxhash", + Column: "col1", + }, { + Name: "owned_lookup", + Column: "col2", + }}, + }, + }, + } + + trxTS := fmt.Sprintf("%d", time.Now().Unix()) + fields := sqltypes.MakeTestFields( + "id|state|message|source|workflow_type|workflow_sub_type|max_tps|max_replication_lag|time_updated|time_heartbeat|time_throttled|transaction_timestamp|rows_copied|options", + "int64|varbinary|varbinary|blob|int64|int64|int64|int64|int64|int64|int64|int64|int64|varchar", + ) + wftype := fmt.Sprintf("%d", binlogdatapb.VReplicationWorkflowType_CreateLookupIndex) + ownedSourceStopAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}} stop_after_copy:true`, + ms.SourceKeyspace, ms.SourceKeyspace) + ownedSourceKeepRunningAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}}`, + ms.SourceKeyspace, ms.SourceKeyspace) + ownedRunning := sqltypes.MakeTestResult(fields, "1|Running|msg|"+ownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + ownedStopped := sqltypes.MakeTestResult(fields, "1|Stopped|"+workflow.Frozen+"|"+ownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + + testcases := []struct { + request *vtctldatapb.LookupVindexInternalizeRequest + vrResponse *sqltypes.Result + err string + expectedVschema *vschemapb.Keyspace + }{ + { + request: &vtctldatapb.LookupVindexInternalizeRequest{ + Name: "owned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + vrResponse: ownedStopped, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + "write_only": "true", + }, + Owner: "t1", + }, + }, + }, + }, + { + request: &vtctldatapb.LookupVindexInternalizeRequest{ + Name: "unowned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + }, + }, + }, + }, + err: "no owner", + }, + { + request: &vtctldatapb.LookupVindexInternalizeRequest{ + Name: "owned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + vrResponse: ownedRunning, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + "write_only": "true", + }, + Owner: "t1", + }, + }, + }, + err: "not frozen", + }, + { + request: &vtctldatapb.LookupVindexInternalizeRequest{ + Name: "unowned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + "write_only": "true", + }, + }, + }, + }, + err: "no owner", + }, + { + request: &vtctldatapb.LookupVindexInternalizeRequest{ + Name: "absent_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "absent_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.absent_lookup", + "from": "c1", + "to": "c2", + }, + }, + }, + }, + err: "vindex absent_lookup not found in the sourceks keyspace", + }, + } + for _, tcase := range testcases { + t.Run(tcase.request.Name, func(t *testing.T) { + // Resave the source schema for every iteration. + err := tenv.ts.SaveVSchema(ctx, tcase.request.Keyspace, sourceVschema) + require.NoError(t, err) + err = tenv.ts.RebuildSrvVSchema(ctx, []string{tenv.cells[0]}) + require.NoError(t, err) + + require.NotNil(t, tcase.request, "No request provided") + + for _, targetTablet := range targetShards { + if tcase.vrResponse != nil { + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, tcase.request.Name, tenv.dbName), tcase.vrResponse, nil) + } + // Update queries are required only if the Vindex is owned. + if len(tcase.expectedVschema.Vindexes) > 0 && tcase.expectedVschema.Vindexes[tcase.request.Name].Owner != "" { + unfreezeQuery, err := sqlparser.ParseAndBind(workflow.SqlUnfreezeWorkflow, + sqltypes.StringBindVariable("vt_targetks"), + sqltypes.StringBindVariable(tcase.request.Name), + ) + require.NoError(t, err) + tenv.tmc.setVReplicationExecResults(targetTablet.tablet, unfreezeQuery, &sqltypes.Result{}) + } + } + + _, err = ws.LookupVindexInternalize(ctx, tcase.request) + if tcase.err != "" { + if err == nil || !strings.Contains(err.Error(), tcase.err) { + require.FailNow(t, "LookupVindexInternalize error", "LookupVindexInternalize(%v) err: %v, must contain %v", tcase.request, err, tcase.err) + } + return + } + require.NoError(t, err) + aftervschema, err := tenv.ts.GetVSchema(ctx, ms.SourceKeyspace) + require.NoError(t, err) + vindex := aftervschema.Vindexes[tcase.request.Name] + expectedVindex := tcase.expectedVschema.Vindexes[tcase.request.Name] + require.NotNil(t, vindex, "vindex %s not found in vschema", tcase.request.Name) + require.Equal(t, expectedVindex, vindex, "vindex mismatch. expected: %+v, got: %+v", expectedVindex, vindex) + }) + } +} + +func TestCompleteLookupVindex(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + sourceKs := "sourceks" + sourceShard := "0" + sourceTabletUID := 200 + targetKs := "targetks" + targetShards := make(map[string]*fakeTabletConn) + targetTabletUID := 300 + wf := "testwf" + vreplID := 1 + vtenv := vtenv.NewTestEnv() + tenv := newTestEnv(t, ctx, sourceKs, []string{shard}) + defer tenv.close() + + sourceTablet := tenv.addTablet(t, sourceTabletUID, sourceKs, sourceShard) + defer tenv.deleteTablet(sourceTablet.tablet) + + targetShards["-80"] = tenv.addTablet(t, targetTabletUID, targetKs, "-80") + defer tenv.deleteTablet(targetShards["-80"].tablet) + addInvariants(targetShards["-80"].vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) + targetShards["80-"] = tenv.addTablet(t, targetTabletUID+10, targetKs, "80-") + defer tenv.deleteTablet(targetShards["80-"].tablet) + addInvariants(targetShards["80-"].vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) + + ws := workflow.NewServer(vtenv, tenv.ts, tenv.tmc) + ms := &vtctldatapb.MaterializeSettings{ + // Keyspace where the vindex is created. + SourceKeyspace: sourceKs, + // Keyspace where the lookup table and VReplication workflow is created. + TargetKeyspace: targetKs, + Cell: tenv.cells[0], + TabletTypes: topoproto.MakeStringTypeCSV([]topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_RDONLY, + }), + } + + sourceVschema := &vschemapb.Keyspace{ + Sharded: false, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + }, + Owner: "t1", + }, + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + }, + }, + "unqualified_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "unqualified", + "from": "c1", + "to": "c2", + }, + }, + }, + Tables: map[string]*vschemapb.Table{ + "t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Name: "xxhash", + Column: "col1", + }, { + Name: "owned_lookup", + Column: "col2", + }}, + }, + }, + } + + trxTS := fmt.Sprintf("%d", time.Now().Unix()) + fields := sqltypes.MakeTestFields( + "id|state|message|source|workflow_type|workflow_sub_type|max_tps|max_replication_lag|time_updated|time_heartbeat|time_throttled|transaction_timestamp|rows_copied|options", + "int64|varbinary|varbinary|blob|int64|int64|int64|int64|int64|int64|int64|int64|int64|varchar", + ) + wftype := fmt.Sprintf("%d", binlogdatapb.VReplicationWorkflowType_CreateLookupIndex) + ownedSourceStopAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}} stop_after_copy:true`, + ms.SourceKeyspace, ms.SourceKeyspace) + ownedSourceKeepRunningAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}}`, + ms.SourceKeyspace, ms.SourceKeyspace) + ownedRunning := sqltypes.MakeTestResult(fields, "1|Running|msg|"+ownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + ownedStopped := sqltypes.MakeTestResult(fields, "1|Stopped|"+workflow.Frozen+"|"+ownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + + testcases := []struct { + request *vtctldatapb.LookupVindexCompleteRequest + vrResponse *sqltypes.Result + err string + expectedVschema *vschemapb.Keyspace + expectDelete bool + }{ + { + request: &vtctldatapb.LookupVindexCompleteRequest{ + Name: "owned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + vrResponse: ownedStopped, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + }, + Owner: "t1", + }, + }, + }, + expectDelete: true, + }, + { + request: &vtctldatapb.LookupVindexCompleteRequest{ + Name: "unowned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + }, + }, + }, + }, + err: "no owner", + }, + { + request: &vtctldatapb.LookupVindexCompleteRequest{ + Name: "owned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + vrResponse: ownedRunning, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "owned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.owned_lookup", + "from": "c1", + "to": "c2", + }, + Owner: "t1", + }, + }, + }, + err: "not frozen", + }, + { + request: &vtctldatapb.LookupVindexCompleteRequest{ + Name: "unowned_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "unowned_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.unowned_lookup", + "from": "c1", + "to": "c2", + }, + }, + }, + }, + err: "no owner", + }, + { + request: &vtctldatapb.LookupVindexCompleteRequest{ + Name: "absent_lookup", + Keyspace: ms.SourceKeyspace, + TableKeyspace: ms.TargetKeyspace, + }, + expectedVschema: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "absent_lookup": { + Type: "lookup_unique", + Params: map[string]string{ + "table": "targetks.absent_lookup", + "from": "c1", + "to": "c2", + }, + }, + }, + }, + err: "vindex absent_lookup not found in the sourceks keyspace", + }, + } + for _, tcase := range testcases { + t.Run(tcase.request.Name, func(t *testing.T) { + // Resave the source schema for every iteration. + err := tenv.ts.SaveVSchema(ctx, tcase.request.Keyspace, sourceVschema) + require.NoError(t, err) + err = tenv.ts.RebuildSrvVSchema(ctx, []string{tenv.cells[0]}) + require.NoError(t, err) + + require.NotNil(t, tcase.request, "No request provided") + + for _, targetTablet := range targetShards { + if tcase.vrResponse != nil { + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, tcase.request.Name, tenv.dbName), tcase.vrResponse, nil) + } + if tcase.err == "" { + // We query the workflow again to build the status output when + // it's successfully created. + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, tcase.request.Name, tenv.dbName), tcase.vrResponse, nil) + } + } + + preWorkflowDeleteCalls := tenv.tmc.workflowDeleteCalls + _, err = ws.LookupVindexComplete(ctx, tcase.request) + if tcase.err != "" { + if err == nil || !strings.Contains(err.Error(), tcase.err) { + require.FailNow(t, "LookupVindexComplete error", "LookupVindexComplete(%v) err: %v, must contain %v", tcase.request, err, tcase.err) } return } diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index 4a3dd20a0a1..9d231b84567 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -783,6 +783,7 @@ message UpdateVReplicationWorkflowRequest { optional binlogdata.VReplicationWorkflowState state = 6; reserved 7; // unused, was: repeated string shards map config_overrides = 8; + optional string message = 9; } message UpdateVReplicationWorkflowResponse { diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index 498d6ee093e..745a3599cc9 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -1231,6 +1231,18 @@ message LaunchSchemaMigrationResponse { map rows_affected_by_shard = 1; } +message LookupVindexCompleteRequest { + // Where the lookup vindex lives. + string keyspace = 1; + // This is the name of the lookup vindex and the vreplication workflow. + string name = 2; + // Where the vreplication workflow lives. + string table_keyspace = 3; +} + +message LookupVindexCompleteResponse { +} + message LookupVindexCreateRequest { string keyspace = 1; string workflow = 2; @@ -1251,11 +1263,28 @@ message LookupVindexExternalizeRequest { string name = 2; // Where the vreplication workflow lives. string table_keyspace = 3; + // If this is set true, we directly delete the workflow instead of stopping. + // Also, complete command is not required to delete workflow in that case. + bool delete_workflow = 4; } message LookupVindexExternalizeResponse { - // Was the workflow also deleted. - bool workflow_deleted = 1; + // Was the workflow stopped. + bool workflow_stopped = 1; + // Was the workflow deleted. + bool workflow_deleted = 2; +} + +message LookupVindexInternalizeRequest { + // Where the lookup vindex lives. + string keyspace = 1; + // This is the name of the lookup vindex and the vreplication workflow. + string name = 2; + // Where the vreplication workflow lives. + string table_keyspace = 3; +} + +message LookupVindexInternalizeResponse { } message MaterializeCreateRequest { diff --git a/proto/vtctlservice.proto b/proto/vtctlservice.proto index d99e8f1775b..1f07de4c523 100644 --- a/proto/vtctlservice.proto +++ b/proto/vtctlservice.proto @@ -195,8 +195,10 @@ service Vtctld { // LaunchSchemaMigration launches one or all migrations executed with --postpone-launch. rpc LaunchSchemaMigration(vtctldata.LaunchSchemaMigrationRequest) returns (vtctldata.LaunchSchemaMigrationResponse) {}; + rpc LookupVindexComplete(vtctldata.LookupVindexCompleteRequest) returns (vtctldata.LookupVindexCompleteResponse) {}; rpc LookupVindexCreate(vtctldata.LookupVindexCreateRequest) returns (vtctldata.LookupVindexCreateResponse) {}; rpc LookupVindexExternalize(vtctldata.LookupVindexExternalizeRequest) returns (vtctldata.LookupVindexExternalizeResponse) {}; + rpc LookupVindexInternalize(vtctldata.LookupVindexInternalizeRequest) returns (vtctldata.LookupVindexInternalizeResponse) {}; // MaterializeCreate creates a workflow to materialize one or more tables // from a source keyspace to a target keyspace using a provided expressions. diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index e8fd5040baf..f096618471a 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -34267,6 +34267,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest config_overrides */ config_overrides?: ({ [k: string]: string }|null); + + /** UpdateVReplicationWorkflowRequest message */ + message?: (string|null); } /** Represents an UpdateVReplicationWorkflowRequest. */ @@ -34299,6 +34302,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest config_overrides. */ public config_overrides: { [k: string]: string }; + /** UpdateVReplicationWorkflowRequest message. */ + public message?: (string|null); + /** UpdateVReplicationWorkflowRequest _tablet_selection_preference. */ public _tablet_selection_preference?: "tablet_selection_preference"; @@ -34308,6 +34314,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest _state. */ public _state?: "state"; + /** UpdateVReplicationWorkflowRequest _message. */ + public _message?: "message"; + /** * Creates a new UpdateVReplicationWorkflowRequest instance using the specified properties. * @param [properties] Properties to set @@ -66150,6 +66159,206 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a LookupVindexCompleteRequest. */ + interface ILookupVindexCompleteRequest { + + /** LookupVindexCompleteRequest keyspace */ + keyspace?: (string|null); + + /** LookupVindexCompleteRequest name */ + name?: (string|null); + + /** LookupVindexCompleteRequest table_keyspace */ + table_keyspace?: (string|null); + } + + /** Represents a LookupVindexCompleteRequest. */ + class LookupVindexCompleteRequest implements ILookupVindexCompleteRequest { + + /** + * Constructs a new LookupVindexCompleteRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ILookupVindexCompleteRequest); + + /** LookupVindexCompleteRequest keyspace. */ + public keyspace: string; + + /** LookupVindexCompleteRequest name. */ + public name: string; + + /** LookupVindexCompleteRequest table_keyspace. */ + public table_keyspace: string; + + /** + * Creates a new LookupVindexCompleteRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns LookupVindexCompleteRequest instance + */ + public static create(properties?: vtctldata.ILookupVindexCompleteRequest): vtctldata.LookupVindexCompleteRequest; + + /** + * Encodes the specified LookupVindexCompleteRequest message. Does not implicitly {@link vtctldata.LookupVindexCompleteRequest.verify|verify} messages. + * @param message LookupVindexCompleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ILookupVindexCompleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LookupVindexCompleteRequest message, length delimited. Does not implicitly {@link vtctldata.LookupVindexCompleteRequest.verify|verify} messages. + * @param message LookupVindexCompleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ILookupVindexCompleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LookupVindexCompleteRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LookupVindexCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.LookupVindexCompleteRequest; + + /** + * Decodes a LookupVindexCompleteRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LookupVindexCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.LookupVindexCompleteRequest; + + /** + * Verifies a LookupVindexCompleteRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LookupVindexCompleteRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LookupVindexCompleteRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.LookupVindexCompleteRequest; + + /** + * Creates a plain object from a LookupVindexCompleteRequest message. Also converts values to other types if specified. + * @param message LookupVindexCompleteRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.LookupVindexCompleteRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LookupVindexCompleteRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for LookupVindexCompleteRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a LookupVindexCompleteResponse. */ + interface ILookupVindexCompleteResponse { + } + + /** Represents a LookupVindexCompleteResponse. */ + class LookupVindexCompleteResponse implements ILookupVindexCompleteResponse { + + /** + * Constructs a new LookupVindexCompleteResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ILookupVindexCompleteResponse); + + /** + * Creates a new LookupVindexCompleteResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns LookupVindexCompleteResponse instance + */ + public static create(properties?: vtctldata.ILookupVindexCompleteResponse): vtctldata.LookupVindexCompleteResponse; + + /** + * Encodes the specified LookupVindexCompleteResponse message. Does not implicitly {@link vtctldata.LookupVindexCompleteResponse.verify|verify} messages. + * @param message LookupVindexCompleteResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ILookupVindexCompleteResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LookupVindexCompleteResponse message, length delimited. Does not implicitly {@link vtctldata.LookupVindexCompleteResponse.verify|verify} messages. + * @param message LookupVindexCompleteResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ILookupVindexCompleteResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LookupVindexCompleteResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LookupVindexCompleteResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.LookupVindexCompleteResponse; + + /** + * Decodes a LookupVindexCompleteResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LookupVindexCompleteResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.LookupVindexCompleteResponse; + + /** + * Verifies a LookupVindexCompleteResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LookupVindexCompleteResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LookupVindexCompleteResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.LookupVindexCompleteResponse; + + /** + * Creates a plain object from a LookupVindexCompleteResponse message. Also converts values to other types if specified. + * @param message LookupVindexCompleteResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.LookupVindexCompleteResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LookupVindexCompleteResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for LookupVindexCompleteResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a LookupVindexCreateRequest. */ interface ILookupVindexCreateRequest { @@ -66385,6 +66594,9 @@ export namespace vtctldata { /** LookupVindexExternalizeRequest table_keyspace */ table_keyspace?: (string|null); + + /** LookupVindexExternalizeRequest delete_workflow */ + delete_workflow?: (boolean|null); } /** Represents a LookupVindexExternalizeRequest. */ @@ -66405,6 +66617,9 @@ export namespace vtctldata { /** LookupVindexExternalizeRequest table_keyspace. */ public table_keyspace: string; + /** LookupVindexExternalizeRequest delete_workflow. */ + public delete_workflow: boolean; + /** * Creates a new LookupVindexExternalizeRequest instance using the specified properties. * @param [properties] Properties to set @@ -66486,6 +66701,9 @@ export namespace vtctldata { /** Properties of a LookupVindexExternalizeResponse. */ interface ILookupVindexExternalizeResponse { + /** LookupVindexExternalizeResponse workflow_stopped */ + workflow_stopped?: (boolean|null); + /** LookupVindexExternalizeResponse workflow_deleted */ workflow_deleted?: (boolean|null); } @@ -66499,6 +66717,9 @@ export namespace vtctldata { */ constructor(properties?: vtctldata.ILookupVindexExternalizeResponse); + /** LookupVindexExternalizeResponse workflow_stopped. */ + public workflow_stopped: boolean; + /** LookupVindexExternalizeResponse workflow_deleted. */ public workflow_deleted: boolean; @@ -66580,6 +66801,206 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a LookupVindexInternalizeRequest. */ + interface ILookupVindexInternalizeRequest { + + /** LookupVindexInternalizeRequest keyspace */ + keyspace?: (string|null); + + /** LookupVindexInternalizeRequest name */ + name?: (string|null); + + /** LookupVindexInternalizeRequest table_keyspace */ + table_keyspace?: (string|null); + } + + /** Represents a LookupVindexInternalizeRequest. */ + class LookupVindexInternalizeRequest implements ILookupVindexInternalizeRequest { + + /** + * Constructs a new LookupVindexInternalizeRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ILookupVindexInternalizeRequest); + + /** LookupVindexInternalizeRequest keyspace. */ + public keyspace: string; + + /** LookupVindexInternalizeRequest name. */ + public name: string; + + /** LookupVindexInternalizeRequest table_keyspace. */ + public table_keyspace: string; + + /** + * Creates a new LookupVindexInternalizeRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns LookupVindexInternalizeRequest instance + */ + public static create(properties?: vtctldata.ILookupVindexInternalizeRequest): vtctldata.LookupVindexInternalizeRequest; + + /** + * Encodes the specified LookupVindexInternalizeRequest message. Does not implicitly {@link vtctldata.LookupVindexInternalizeRequest.verify|verify} messages. + * @param message LookupVindexInternalizeRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ILookupVindexInternalizeRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LookupVindexInternalizeRequest message, length delimited. Does not implicitly {@link vtctldata.LookupVindexInternalizeRequest.verify|verify} messages. + * @param message LookupVindexInternalizeRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ILookupVindexInternalizeRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LookupVindexInternalizeRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LookupVindexInternalizeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.LookupVindexInternalizeRequest; + + /** + * Decodes a LookupVindexInternalizeRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LookupVindexInternalizeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.LookupVindexInternalizeRequest; + + /** + * Verifies a LookupVindexInternalizeRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LookupVindexInternalizeRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LookupVindexInternalizeRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.LookupVindexInternalizeRequest; + + /** + * Creates a plain object from a LookupVindexInternalizeRequest message. Also converts values to other types if specified. + * @param message LookupVindexInternalizeRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.LookupVindexInternalizeRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LookupVindexInternalizeRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for LookupVindexInternalizeRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a LookupVindexInternalizeResponse. */ + interface ILookupVindexInternalizeResponse { + } + + /** Represents a LookupVindexInternalizeResponse. */ + class LookupVindexInternalizeResponse implements ILookupVindexInternalizeResponse { + + /** + * Constructs a new LookupVindexInternalizeResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.ILookupVindexInternalizeResponse); + + /** + * Creates a new LookupVindexInternalizeResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns LookupVindexInternalizeResponse instance + */ + public static create(properties?: vtctldata.ILookupVindexInternalizeResponse): vtctldata.LookupVindexInternalizeResponse; + + /** + * Encodes the specified LookupVindexInternalizeResponse message. Does not implicitly {@link vtctldata.LookupVindexInternalizeResponse.verify|verify} messages. + * @param message LookupVindexInternalizeResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.ILookupVindexInternalizeResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LookupVindexInternalizeResponse message, length delimited. Does not implicitly {@link vtctldata.LookupVindexInternalizeResponse.verify|verify} messages. + * @param message LookupVindexInternalizeResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.ILookupVindexInternalizeResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LookupVindexInternalizeResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LookupVindexInternalizeResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.LookupVindexInternalizeResponse; + + /** + * Decodes a LookupVindexInternalizeResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LookupVindexInternalizeResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.LookupVindexInternalizeResponse; + + /** + * Verifies a LookupVindexInternalizeResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LookupVindexInternalizeResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LookupVindexInternalizeResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.LookupVindexInternalizeResponse; + + /** + * Creates a plain object from a LookupVindexInternalizeResponse message. Also converts values to other types if specified. + * @param message LookupVindexInternalizeResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.LookupVindexInternalizeResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LookupVindexInternalizeResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for LookupVindexInternalizeResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a MaterializeCreateRequest. */ interface IMaterializeCreateRequest { diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index d215662ab7c..cdcae5ae6e5 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -79168,6 +79168,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {binlogdata.OnDDLAction|null} [on_ddl] UpdateVReplicationWorkflowRequest on_ddl * @property {binlogdata.VReplicationWorkflowState|null} [state] UpdateVReplicationWorkflowRequest state * @property {Object.|null} [config_overrides] UpdateVReplicationWorkflowRequest config_overrides + * @property {string|null} [message] UpdateVReplicationWorkflowRequest message */ /** @@ -79244,6 +79245,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ UpdateVReplicationWorkflowRequest.prototype.config_overrides = $util.emptyObject; + /** + * UpdateVReplicationWorkflowRequest message. + * @member {string|null|undefined} message + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + UpdateVReplicationWorkflowRequest.prototype.message = null; + // OneOf field names bound to virtual getters and setters let $oneOfFields; @@ -79280,6 +79289,17 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { set: $util.oneOfSetter($oneOfFields) }); + /** + * UpdateVReplicationWorkflowRequest _message. + * @member {"message"|undefined} _message + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_message", { + get: $util.oneOfGetter($oneOfFields = ["message"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new UpdateVReplicationWorkflowRequest instance using the specified properties. * @function create @@ -79324,6 +79344,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.config_overrides != null && Object.hasOwnProperty.call(message, "config_overrides")) for (let keys = Object.keys(message.config_overrides), i = 0; i < keys.length; ++i) writer.uint32(/* id 8, wireType 2 =*/66).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config_overrides[keys[i]]).ldelim(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.message); return writer; }; @@ -79414,6 +79436,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.config_overrides[key] = value; break; } + case 9: { + message.message = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -79527,6 +79553,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (!$util.isString(message.config_overrides[key[i]])) return "config_overrides: string{k:string} expected"; } + if (message.message != null && message.hasOwnProperty("message")) { + properties._message = 1; + if (!$util.isString(message.message)) + return "message: string expected"; + } return null; }; @@ -79695,6 +79726,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { for (let keys = Object.keys(object.config_overrides), i = 0; i < keys.length; ++i) message.config_overrides[keys[i]] = String(object.config_overrides[keys[i]]); } + if (object.message != null) + message.message = String(object.message); return message; }; @@ -79752,6 +79785,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { for (let j = 0; j < keys2.length; ++j) object.config_overrides[keys2[j]] = message.config_overrides[keys2[j]]; } + if (message.message != null && message.hasOwnProperty("message")) { + object.message = message.message; + if (options.oneofs) + object._message = "message"; + } return object; }; @@ -162007,6 +162045,431 @@ export const vtctldata = $root.vtctldata = (() => { return LaunchSchemaMigrationResponse; })(); + vtctldata.LookupVindexCompleteRequest = (function() { + + /** + * Properties of a LookupVindexCompleteRequest. + * @memberof vtctldata + * @interface ILookupVindexCompleteRequest + * @property {string|null} [keyspace] LookupVindexCompleteRequest keyspace + * @property {string|null} [name] LookupVindexCompleteRequest name + * @property {string|null} [table_keyspace] LookupVindexCompleteRequest table_keyspace + */ + + /** + * Constructs a new LookupVindexCompleteRequest. + * @memberof vtctldata + * @classdesc Represents a LookupVindexCompleteRequest. + * @implements ILookupVindexCompleteRequest + * @constructor + * @param {vtctldata.ILookupVindexCompleteRequest=} [properties] Properties to set + */ + function LookupVindexCompleteRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LookupVindexCompleteRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.LookupVindexCompleteRequest + * @instance + */ + LookupVindexCompleteRequest.prototype.keyspace = ""; + + /** + * LookupVindexCompleteRequest name. + * @member {string} name + * @memberof vtctldata.LookupVindexCompleteRequest + * @instance + */ + LookupVindexCompleteRequest.prototype.name = ""; + + /** + * LookupVindexCompleteRequest table_keyspace. + * @member {string} table_keyspace + * @memberof vtctldata.LookupVindexCompleteRequest + * @instance + */ + LookupVindexCompleteRequest.prototype.table_keyspace = ""; + + /** + * Creates a new LookupVindexCompleteRequest instance using the specified properties. + * @function create + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {vtctldata.ILookupVindexCompleteRequest=} [properties] Properties to set + * @returns {vtctldata.LookupVindexCompleteRequest} LookupVindexCompleteRequest instance + */ + LookupVindexCompleteRequest.create = function create(properties) { + return new LookupVindexCompleteRequest(properties); + }; + + /** + * Encodes the specified LookupVindexCompleteRequest message. Does not implicitly {@link vtctldata.LookupVindexCompleteRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {vtctldata.ILookupVindexCompleteRequest} message LookupVindexCompleteRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexCompleteRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); + if (message.table_keyspace != null && Object.hasOwnProperty.call(message, "table_keyspace")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.table_keyspace); + return writer; + }; + + /** + * Encodes the specified LookupVindexCompleteRequest message, length delimited. Does not implicitly {@link vtctldata.LookupVindexCompleteRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {vtctldata.ILookupVindexCompleteRequest} message LookupVindexCompleteRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexCompleteRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LookupVindexCompleteRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.LookupVindexCompleteRequest} LookupVindexCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexCompleteRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.LookupVindexCompleteRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.keyspace = reader.string(); + break; + } + case 2: { + message.name = reader.string(); + break; + } + case 3: { + message.table_keyspace = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LookupVindexCompleteRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.LookupVindexCompleteRequest} LookupVindexCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexCompleteRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LookupVindexCompleteRequest message. + * @function verify + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LookupVindexCompleteRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) + if (!$util.isString(message.table_keyspace)) + return "table_keyspace: string expected"; + return null; + }; + + /** + * Creates a LookupVindexCompleteRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.LookupVindexCompleteRequest} LookupVindexCompleteRequest + */ + LookupVindexCompleteRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.LookupVindexCompleteRequest) + return object; + let message = new $root.vtctldata.LookupVindexCompleteRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.name != null) + message.name = String(object.name); + if (object.table_keyspace != null) + message.table_keyspace = String(object.table_keyspace); + return message; + }; + + /** + * Creates a plain object from a LookupVindexCompleteRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {vtctldata.LookupVindexCompleteRequest} message LookupVindexCompleteRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LookupVindexCompleteRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.keyspace = ""; + object.name = ""; + object.table_keyspace = ""; + } + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) + object.table_keyspace = message.table_keyspace; + return object; + }; + + /** + * Converts this LookupVindexCompleteRequest to JSON. + * @function toJSON + * @memberof vtctldata.LookupVindexCompleteRequest + * @instance + * @returns {Object.} JSON object + */ + LookupVindexCompleteRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LookupVindexCompleteRequest + * @function getTypeUrl + * @memberof vtctldata.LookupVindexCompleteRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LookupVindexCompleteRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.LookupVindexCompleteRequest"; + }; + + return LookupVindexCompleteRequest; + })(); + + vtctldata.LookupVindexCompleteResponse = (function() { + + /** + * Properties of a LookupVindexCompleteResponse. + * @memberof vtctldata + * @interface ILookupVindexCompleteResponse + */ + + /** + * Constructs a new LookupVindexCompleteResponse. + * @memberof vtctldata + * @classdesc Represents a LookupVindexCompleteResponse. + * @implements ILookupVindexCompleteResponse + * @constructor + * @param {vtctldata.ILookupVindexCompleteResponse=} [properties] Properties to set + */ + function LookupVindexCompleteResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new LookupVindexCompleteResponse instance using the specified properties. + * @function create + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {vtctldata.ILookupVindexCompleteResponse=} [properties] Properties to set + * @returns {vtctldata.LookupVindexCompleteResponse} LookupVindexCompleteResponse instance + */ + LookupVindexCompleteResponse.create = function create(properties) { + return new LookupVindexCompleteResponse(properties); + }; + + /** + * Encodes the specified LookupVindexCompleteResponse message. Does not implicitly {@link vtctldata.LookupVindexCompleteResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {vtctldata.ILookupVindexCompleteResponse} message LookupVindexCompleteResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexCompleteResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified LookupVindexCompleteResponse message, length delimited. Does not implicitly {@link vtctldata.LookupVindexCompleteResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {vtctldata.ILookupVindexCompleteResponse} message LookupVindexCompleteResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexCompleteResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LookupVindexCompleteResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.LookupVindexCompleteResponse} LookupVindexCompleteResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexCompleteResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.LookupVindexCompleteResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LookupVindexCompleteResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.LookupVindexCompleteResponse} LookupVindexCompleteResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexCompleteResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LookupVindexCompleteResponse message. + * @function verify + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LookupVindexCompleteResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a LookupVindexCompleteResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.LookupVindexCompleteResponse} LookupVindexCompleteResponse + */ + LookupVindexCompleteResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.LookupVindexCompleteResponse) + return object; + return new $root.vtctldata.LookupVindexCompleteResponse(); + }; + + /** + * Creates a plain object from a LookupVindexCompleteResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {vtctldata.LookupVindexCompleteResponse} message LookupVindexCompleteResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LookupVindexCompleteResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this LookupVindexCompleteResponse to JSON. + * @function toJSON + * @memberof vtctldata.LookupVindexCompleteResponse + * @instance + * @returns {Object.} JSON object + */ + LookupVindexCompleteResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LookupVindexCompleteResponse + * @function getTypeUrl + * @memberof vtctldata.LookupVindexCompleteResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LookupVindexCompleteResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.LookupVindexCompleteResponse"; + }; + + return LookupVindexCompleteResponse; + })(); + vtctldata.LookupVindexCreateRequest = (function() { /** @@ -162668,6 +163131,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {string|null} [keyspace] LookupVindexExternalizeRequest keyspace * @property {string|null} [name] LookupVindexExternalizeRequest name * @property {string|null} [table_keyspace] LookupVindexExternalizeRequest table_keyspace + * @property {boolean|null} [delete_workflow] LookupVindexExternalizeRequest delete_workflow */ /** @@ -162709,6 +163173,14 @@ export const vtctldata = $root.vtctldata = (() => { */ LookupVindexExternalizeRequest.prototype.table_keyspace = ""; + /** + * LookupVindexExternalizeRequest delete_workflow. + * @member {boolean} delete_workflow + * @memberof vtctldata.LookupVindexExternalizeRequest + * @instance + */ + LookupVindexExternalizeRequest.prototype.delete_workflow = false; + /** * Creates a new LookupVindexExternalizeRequest instance using the specified properties. * @function create @@ -162739,6 +163211,8 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); if (message.table_keyspace != null && Object.hasOwnProperty.call(message, "table_keyspace")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.table_keyspace); + if (message.delete_workflow != null && Object.hasOwnProperty.call(message, "delete_workflow")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.delete_workflow); return writer; }; @@ -162785,6 +163259,10 @@ export const vtctldata = $root.vtctldata = (() => { message.table_keyspace = reader.string(); break; } + case 4: { + message.delete_workflow = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -162829,6 +163307,9 @@ export const vtctldata = $root.vtctldata = (() => { if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) if (!$util.isString(message.table_keyspace)) return "table_keyspace: string expected"; + if (message.delete_workflow != null && message.hasOwnProperty("delete_workflow")) + if (typeof message.delete_workflow !== "boolean") + return "delete_workflow: boolean expected"; return null; }; @@ -162850,6 +163331,8 @@ export const vtctldata = $root.vtctldata = (() => { message.name = String(object.name); if (object.table_keyspace != null) message.table_keyspace = String(object.table_keyspace); + if (object.delete_workflow != null) + message.delete_workflow = Boolean(object.delete_workflow); return message; }; @@ -162870,6 +163353,7 @@ export const vtctldata = $root.vtctldata = (() => { object.keyspace = ""; object.name = ""; object.table_keyspace = ""; + object.delete_workflow = false; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -162877,6 +163361,8 @@ export const vtctldata = $root.vtctldata = (() => { object.name = message.name; if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) object.table_keyspace = message.table_keyspace; + if (message.delete_workflow != null && message.hasOwnProperty("delete_workflow")) + object.delete_workflow = message.delete_workflow; return object; }; @@ -162915,6 +163401,7 @@ export const vtctldata = $root.vtctldata = (() => { * Properties of a LookupVindexExternalizeResponse. * @memberof vtctldata * @interface ILookupVindexExternalizeResponse + * @property {boolean|null} [workflow_stopped] LookupVindexExternalizeResponse workflow_stopped * @property {boolean|null} [workflow_deleted] LookupVindexExternalizeResponse workflow_deleted */ @@ -162933,6 +163420,14 @@ export const vtctldata = $root.vtctldata = (() => { this[keys[i]] = properties[keys[i]]; } + /** + * LookupVindexExternalizeResponse workflow_stopped. + * @member {boolean} workflow_stopped + * @memberof vtctldata.LookupVindexExternalizeResponse + * @instance + */ + LookupVindexExternalizeResponse.prototype.workflow_stopped = false; + /** * LookupVindexExternalizeResponse workflow_deleted. * @member {boolean} workflow_deleted @@ -162965,8 +163460,10 @@ export const vtctldata = $root.vtctldata = (() => { LookupVindexExternalizeResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.workflow_stopped != null && Object.hasOwnProperty.call(message, "workflow_stopped")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.workflow_stopped); if (message.workflow_deleted != null && Object.hasOwnProperty.call(message, "workflow_deleted")) - writer.uint32(/* id 1, wireType 0 =*/8).bool(message.workflow_deleted); + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.workflow_deleted); return writer; }; @@ -163002,6 +163499,10 @@ export const vtctldata = $root.vtctldata = (() => { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { + message.workflow_stopped = reader.bool(); + break; + } + case 2: { message.workflow_deleted = reader.bool(); break; } @@ -163040,6 +163541,9 @@ export const vtctldata = $root.vtctldata = (() => { LookupVindexExternalizeResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.workflow_stopped != null && message.hasOwnProperty("workflow_stopped")) + if (typeof message.workflow_stopped !== "boolean") + return "workflow_stopped: boolean expected"; if (message.workflow_deleted != null && message.hasOwnProperty("workflow_deleted")) if (typeof message.workflow_deleted !== "boolean") return "workflow_deleted: boolean expected"; @@ -163058,6 +163562,8 @@ export const vtctldata = $root.vtctldata = (() => { if (object instanceof $root.vtctldata.LookupVindexExternalizeResponse) return object; let message = new $root.vtctldata.LookupVindexExternalizeResponse(); + if (object.workflow_stopped != null) + message.workflow_stopped = Boolean(object.workflow_stopped); if (object.workflow_deleted != null) message.workflow_deleted = Boolean(object.workflow_deleted); return message; @@ -163076,8 +163582,12 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; - if (options.defaults) + if (options.defaults) { + object.workflow_stopped = false; object.workflow_deleted = false; + } + if (message.workflow_stopped != null && message.hasOwnProperty("workflow_stopped")) + object.workflow_stopped = message.workflow_stopped; if (message.workflow_deleted != null && message.hasOwnProperty("workflow_deleted")) object.workflow_deleted = message.workflow_deleted; return object; @@ -163112,6 +163622,431 @@ export const vtctldata = $root.vtctldata = (() => { return LookupVindexExternalizeResponse; })(); + vtctldata.LookupVindexInternalizeRequest = (function() { + + /** + * Properties of a LookupVindexInternalizeRequest. + * @memberof vtctldata + * @interface ILookupVindexInternalizeRequest + * @property {string|null} [keyspace] LookupVindexInternalizeRequest keyspace + * @property {string|null} [name] LookupVindexInternalizeRequest name + * @property {string|null} [table_keyspace] LookupVindexInternalizeRequest table_keyspace + */ + + /** + * Constructs a new LookupVindexInternalizeRequest. + * @memberof vtctldata + * @classdesc Represents a LookupVindexInternalizeRequest. + * @implements ILookupVindexInternalizeRequest + * @constructor + * @param {vtctldata.ILookupVindexInternalizeRequest=} [properties] Properties to set + */ + function LookupVindexInternalizeRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LookupVindexInternalizeRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.LookupVindexInternalizeRequest + * @instance + */ + LookupVindexInternalizeRequest.prototype.keyspace = ""; + + /** + * LookupVindexInternalizeRequest name. + * @member {string} name + * @memberof vtctldata.LookupVindexInternalizeRequest + * @instance + */ + LookupVindexInternalizeRequest.prototype.name = ""; + + /** + * LookupVindexInternalizeRequest table_keyspace. + * @member {string} table_keyspace + * @memberof vtctldata.LookupVindexInternalizeRequest + * @instance + */ + LookupVindexInternalizeRequest.prototype.table_keyspace = ""; + + /** + * Creates a new LookupVindexInternalizeRequest instance using the specified properties. + * @function create + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {vtctldata.ILookupVindexInternalizeRequest=} [properties] Properties to set + * @returns {vtctldata.LookupVindexInternalizeRequest} LookupVindexInternalizeRequest instance + */ + LookupVindexInternalizeRequest.create = function create(properties) { + return new LookupVindexInternalizeRequest(properties); + }; + + /** + * Encodes the specified LookupVindexInternalizeRequest message. Does not implicitly {@link vtctldata.LookupVindexInternalizeRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {vtctldata.ILookupVindexInternalizeRequest} message LookupVindexInternalizeRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexInternalizeRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); + if (message.table_keyspace != null && Object.hasOwnProperty.call(message, "table_keyspace")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.table_keyspace); + return writer; + }; + + /** + * Encodes the specified LookupVindexInternalizeRequest message, length delimited. Does not implicitly {@link vtctldata.LookupVindexInternalizeRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {vtctldata.ILookupVindexInternalizeRequest} message LookupVindexInternalizeRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexInternalizeRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LookupVindexInternalizeRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.LookupVindexInternalizeRequest} LookupVindexInternalizeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexInternalizeRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.LookupVindexInternalizeRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.keyspace = reader.string(); + break; + } + case 2: { + message.name = reader.string(); + break; + } + case 3: { + message.table_keyspace = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LookupVindexInternalizeRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.LookupVindexInternalizeRequest} LookupVindexInternalizeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexInternalizeRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LookupVindexInternalizeRequest message. + * @function verify + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LookupVindexInternalizeRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) + if (!$util.isString(message.table_keyspace)) + return "table_keyspace: string expected"; + return null; + }; + + /** + * Creates a LookupVindexInternalizeRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.LookupVindexInternalizeRequest} LookupVindexInternalizeRequest + */ + LookupVindexInternalizeRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.LookupVindexInternalizeRequest) + return object; + let message = new $root.vtctldata.LookupVindexInternalizeRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.name != null) + message.name = String(object.name); + if (object.table_keyspace != null) + message.table_keyspace = String(object.table_keyspace); + return message; + }; + + /** + * Creates a plain object from a LookupVindexInternalizeRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {vtctldata.LookupVindexInternalizeRequest} message LookupVindexInternalizeRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LookupVindexInternalizeRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.keyspace = ""; + object.name = ""; + object.table_keyspace = ""; + } + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.table_keyspace != null && message.hasOwnProperty("table_keyspace")) + object.table_keyspace = message.table_keyspace; + return object; + }; + + /** + * Converts this LookupVindexInternalizeRequest to JSON. + * @function toJSON + * @memberof vtctldata.LookupVindexInternalizeRequest + * @instance + * @returns {Object.} JSON object + */ + LookupVindexInternalizeRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LookupVindexInternalizeRequest + * @function getTypeUrl + * @memberof vtctldata.LookupVindexInternalizeRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LookupVindexInternalizeRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.LookupVindexInternalizeRequest"; + }; + + return LookupVindexInternalizeRequest; + })(); + + vtctldata.LookupVindexInternalizeResponse = (function() { + + /** + * Properties of a LookupVindexInternalizeResponse. + * @memberof vtctldata + * @interface ILookupVindexInternalizeResponse + */ + + /** + * Constructs a new LookupVindexInternalizeResponse. + * @memberof vtctldata + * @classdesc Represents a LookupVindexInternalizeResponse. + * @implements ILookupVindexInternalizeResponse + * @constructor + * @param {vtctldata.ILookupVindexInternalizeResponse=} [properties] Properties to set + */ + function LookupVindexInternalizeResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new LookupVindexInternalizeResponse instance using the specified properties. + * @function create + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {vtctldata.ILookupVindexInternalizeResponse=} [properties] Properties to set + * @returns {vtctldata.LookupVindexInternalizeResponse} LookupVindexInternalizeResponse instance + */ + LookupVindexInternalizeResponse.create = function create(properties) { + return new LookupVindexInternalizeResponse(properties); + }; + + /** + * Encodes the specified LookupVindexInternalizeResponse message. Does not implicitly {@link vtctldata.LookupVindexInternalizeResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {vtctldata.ILookupVindexInternalizeResponse} message LookupVindexInternalizeResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexInternalizeResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified LookupVindexInternalizeResponse message, length delimited. Does not implicitly {@link vtctldata.LookupVindexInternalizeResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {vtctldata.ILookupVindexInternalizeResponse} message LookupVindexInternalizeResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LookupVindexInternalizeResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LookupVindexInternalizeResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.LookupVindexInternalizeResponse} LookupVindexInternalizeResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexInternalizeResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.LookupVindexInternalizeResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LookupVindexInternalizeResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.LookupVindexInternalizeResponse} LookupVindexInternalizeResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LookupVindexInternalizeResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LookupVindexInternalizeResponse message. + * @function verify + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LookupVindexInternalizeResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a LookupVindexInternalizeResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.LookupVindexInternalizeResponse} LookupVindexInternalizeResponse + */ + LookupVindexInternalizeResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.LookupVindexInternalizeResponse) + return object; + return new $root.vtctldata.LookupVindexInternalizeResponse(); + }; + + /** + * Creates a plain object from a LookupVindexInternalizeResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {vtctldata.LookupVindexInternalizeResponse} message LookupVindexInternalizeResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LookupVindexInternalizeResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this LookupVindexInternalizeResponse to JSON. + * @function toJSON + * @memberof vtctldata.LookupVindexInternalizeResponse + * @instance + * @returns {Object.} JSON object + */ + LookupVindexInternalizeResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LookupVindexInternalizeResponse + * @function getTypeUrl + * @memberof vtctldata.LookupVindexInternalizeResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LookupVindexInternalizeResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.LookupVindexInternalizeResponse"; + }; + + return LookupVindexInternalizeResponse; + })(); + vtctldata.MaterializeCreateRequest = (function() { /** From 99856a2c0388edfccb376240bb8630aa2a379179 Mon Sep 17 00:00:00 2001 From: Matthias Crauwels Date: Wed, 22 Jan 2025 18:00:11 +0100 Subject: [PATCH 60/66] fix SchemaCacheConfig.DefaultExpiration (#17609) Signed-off-by: Matthias Crauwels --- go/vt/vtadmin/cluster/cluster.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/vt/vtadmin/cluster/cluster.go b/go/vt/vtadmin/cluster/cluster.go index bdc9272a92f..1fc6494ddfa 100644 --- a/go/vt/vtadmin/cluster/cluster.go +++ b/go/vt/vtadmin/cluster/cluster.go @@ -1443,7 +1443,7 @@ func (c *Cluster) GetSchema(ctx context.Context, keyspace string, opts GetSchema return nil, err } - go schemacache.AddOrBackfill(c.schemaCache, []*vtadminpb.Schema{schema}, key, cache.DefaultExpiration, schemacache.LoadOptions{ + go schemacache.AddOrBackfill(c.schemaCache, []*vtadminpb.Schema{schema}, key, c.cfg.SchemaCacheConfig.DefaultExpiration, schemacache.LoadOptions{ BaseRequest: opts.BaseRequest, AggregateSizes: opts.TableSizeOptions.AggregateSizes, }) @@ -1604,7 +1604,7 @@ func (c *Cluster) GetSchemas(ctx context.Context, opts GetSchemaOptions) ([]*vta return nil, rec.Error() } - go schemacache.AddOrBackfill(c.schemaCache, schemas, key, cache.DefaultExpiration, schemacache.LoadOptions{ + go schemacache.AddOrBackfill(c.schemaCache, schemas, key, c.cfg.SchemaCacheConfig.DefaultExpiration, schemacache.LoadOptions{ BaseRequest: opts.BaseRequest, AggregateSizes: opts.TableSizeOptions.AggregateSizes, }) From 55b6865b530ed1bed6a0824db3c10071e30c3452 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Wed, 22 Jan 2025 20:43:38 +0100 Subject: [PATCH 61/66] VReplication Workflow command: Allow stop/start on specific shards (#17581) Signed-off-by: Rohit Nayak --- .../command/vreplication/workflow/state.go | 4 + .../vreplication_vtctldclient_cli_test.go | 23 + .../tabletmanagerdata/tabletmanagerdata.pb.go | 563 +++++++++--------- .../tabletmanagerdata_vtproto.pb.go | 52 ++ go/vt/vtctl/workflow/server.go | 2 + proto/tabletmanagerdata.proto | 2 +- web/vtadmin/src/proto/vtadmin.d.ts | 6 + web/vtadmin/src/proto/vtadmin.js | 39 ++ 8 files changed, 413 insertions(+), 278 deletions(-) diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/state.go b/go/cmd/vtctldclient/command/vreplication/workflow/state.go index c10e50f403c..1b934488f58 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/state.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/state.go @@ -60,14 +60,17 @@ func commandUpdateState(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) var state binlogdatapb.VReplicationWorkflowState + var shards []string switch strings.ToLower(cmd.Name()) { case "start": if err := common.CanRestartWorkflow(baseOptions.Keyspace, baseOptions.Workflow); err != nil { return err } state = binlogdatapb.VReplicationWorkflowState_Running + shards = baseOptions.Shards case "stop": state = binlogdatapb.VReplicationWorkflowState_Stopped + shards = baseOptions.Shards default: return fmt.Errorf("invalid workflow state: %s", args[0]) } @@ -80,6 +83,7 @@ func commandUpdateState(cmd *cobra.Command, args []string) error { Cells: textutil.SimulatedNullStringSlice, TabletTypes: textutil.SimulatedNullTabletTypeSlice, State: &state, + Shards: shards, }, } diff --git a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go index 39b23be8815..6cce3fe9fa6 100644 --- a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go +++ b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go @@ -25,6 +25,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "golang.org/x/exp/maps" "google.golang.org/protobuf/encoding/protojson" @@ -501,6 +502,28 @@ func splitShard(t *testing.T, keyspace, workflowName, sourceShards, targetShards waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Stopped.String()) rs.Start() waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", keyspace, workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + + t.Run("Test --shards in workflow start/stop", func(t *testing.T) { + // This subtest expects workflow to be running at the start and restarts it at the end. + type tCase struct { + shards string + action string + expected int + } + testCases := []tCase{ + {"-40", "stop", 1}, + {"40-80", "stop", 1}, + {"-40,40-80", "start", 2}, + } + for _, tc := range testCases { + output, err := vc.VtctldClient.ExecuteCommandWithOutput("workflow", "--keyspace", keyspace, tc.action, "--workflow", workflowName, "--shards", tc.shards) + require.NoError(t, err, "failed to %s workflow: %v", tc.action, err) + cnt := gjson.Get(output, "details.#").Int() + require.EqualValuesf(t, tc.expected, cnt, "expected %d shards, got %d for action %s, shards %s", tc.expected, cnt, tc.action, tc.shards) + } + }) + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", keyspace, workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + for _, targetTab := range targetTabs { catchup(t, targetTab, workflowName, "Reshard") } diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 459891da850..1608272d9e5 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -6838,6 +6838,7 @@ type UpdateVReplicationWorkflowRequest struct { TabletSelectionPreference *TabletSelectionPreference `protobuf:"varint,4,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference,oneof" json:"tablet_selection_preference,omitempty"` OnDdl *binlogdata.OnDDLAction `protobuf:"varint,5,opt,name=on_ddl,json=onDdl,proto3,enum=binlogdata.OnDDLAction,oneof" json:"on_ddl,omitempty"` State *binlogdata.VReplicationWorkflowState `protobuf:"varint,6,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState,oneof" json:"state,omitempty"` + Shards []string `protobuf:"bytes,7,rep,name=shards,proto3" json:"shards,omitempty"` ConfigOverrides map[string]string `protobuf:"bytes,8,rep,name=config_overrides,json=configOverrides,proto3" json:"config_overrides,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Message *string `protobuf:"bytes,9,opt,name=message,proto3,oneof" json:"message,omitempty"` } @@ -6914,6 +6915,13 @@ func (x *UpdateVReplicationWorkflowRequest) GetState() binlogdata.VReplicationWo return binlogdata.VReplicationWorkflowState(0) } +func (x *UpdateVReplicationWorkflowRequest) GetShards() []string { + if x != nil { + return x.Shards + } + return nil +} + func (x *UpdateVReplicationWorkflowRequest) GetConfigOverrides() map[string]string { if x != nil { return x.ConfigOverrides @@ -9032,7 +9040,7 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x98, 0x05, 0x0a, 0x21, 0x55, + 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xaa, 0x05, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, @@ -9056,295 +9064,296 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, - 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1e, - 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, - 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x74, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x40, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, - 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, - 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, - 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, - 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9f, - 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, - 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, + 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, 0x0a, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, + 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, + 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, + 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, + 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, - 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, - 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x10, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, - 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, - 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, - 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x50, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, + 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, + 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, + 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, + 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, - 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, - 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xad, - 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, - 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 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, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, + 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, - 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, - 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, - 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45, - 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x50, 0x5f, 0x44, 0x45, - 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x42, 0x30, - 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, + 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, + 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, + 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, + 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, 0x01, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, + 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, + 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 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, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, + 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, + 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x0d, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, + 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 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, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x1a, 0x37, 0x0a, 0x09, + 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, 0x01, 0x0a, 0x1a, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, + 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, + 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x45, 0x58, + 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x50, 0x5f, + 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, + 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go index 6db06374713..f56895605ab 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go @@ -2625,6 +2625,11 @@ func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflo tmpVal := *rhs r.State = &tmpVal } + if rhs := m.Shards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.Shards = tmpContainer + } if rhs := m.ConfigOverrides; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -9481,6 +9486,15 @@ func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) dAtA[i] = 0x42 } } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } if m.State != nil { i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.State)) i-- @@ -12904,6 +12918,12 @@ func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { if m.State != nil { n += 1 + protohelpers.SizeOfVarint(uint64(*m.State)) } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } if len(m.ConfigOverrides) > 0 { for k, v := range m.ConfigOverrides { _ = k @@ -27710,6 +27730,38 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } } m.State = &v + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConfigOverrides", wireType) diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index 0c8da8d9363..19990f49f6d 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -1719,8 +1719,10 @@ func (s *Server) WorkflowUpdate(ctx context.Context, req *vtctldatapb.WorkflowUp span.Annotate("on_ddl", req.TabletRequest.OnDdl) span.Annotate("state", req.TabletRequest.State) span.Annotate("config_overrides", req.TabletRequest.ConfigOverrides) + span.Annotate("shards", req.TabletRequest.Shards) vx := vexec.NewVExec(req.Keyspace, req.TabletRequest.Workflow, s.ts, s.tmc, s.env.Parser()) + vx.SetShardSubset(req.TabletRequest.Shards) callback := func(ctx context.Context, tablet *topo.TabletInfo) (*querypb.QueryResult, error) { res, err := s.tmc.UpdateVReplicationWorkflow(ctx, tablet.Tablet, req.TabletRequest) if err != nil { diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index 9d231b84567..9ca4eb11b06 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -781,7 +781,7 @@ message UpdateVReplicationWorkflowRequest { optional TabletSelectionPreference tablet_selection_preference = 4; optional binlogdata.OnDDLAction on_ddl = 5; optional binlogdata.VReplicationWorkflowState state = 6; - reserved 7; // unused, was: repeated string shards + repeated string shards = 7; map config_overrides = 8; optional string message = 9; } diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index f096618471a..5546bff75ad 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -34265,6 +34265,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest state */ state?: (binlogdata.VReplicationWorkflowState|null); + /** UpdateVReplicationWorkflowRequest shards */ + shards?: (string[]|null); + /** UpdateVReplicationWorkflowRequest config_overrides */ config_overrides?: ({ [k: string]: string }|null); @@ -34299,6 +34302,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest state. */ public state?: (binlogdata.VReplicationWorkflowState|null); + /** UpdateVReplicationWorkflowRequest shards. */ + public shards: string[]; + /** UpdateVReplicationWorkflowRequest config_overrides. */ public config_overrides: { [k: string]: string }; diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index cdcae5ae6e5..9d545745a83 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -79167,6 +79167,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {tabletmanagerdata.TabletSelectionPreference|null} [tablet_selection_preference] UpdateVReplicationWorkflowRequest tablet_selection_preference * @property {binlogdata.OnDDLAction|null} [on_ddl] UpdateVReplicationWorkflowRequest on_ddl * @property {binlogdata.VReplicationWorkflowState|null} [state] UpdateVReplicationWorkflowRequest state + * @property {Array.|null} [shards] UpdateVReplicationWorkflowRequest shards * @property {Object.|null} [config_overrides] UpdateVReplicationWorkflowRequest config_overrides * @property {string|null} [message] UpdateVReplicationWorkflowRequest message */ @@ -79182,6 +79183,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { function UpdateVReplicationWorkflowRequest(properties) { this.cells = []; this.tablet_types = []; + this.shards = []; this.config_overrides = {}; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) @@ -79237,6 +79239,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ UpdateVReplicationWorkflowRequest.prototype.state = null; + /** + * UpdateVReplicationWorkflowRequest shards. + * @member {Array.} shards + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + UpdateVReplicationWorkflowRequest.prototype.shards = $util.emptyArray; + /** * UpdateVReplicationWorkflowRequest config_overrides. * @member {Object.} config_overrides @@ -79341,6 +79351,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 5, wireType 0 =*/40).int32(message.on_ddl); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.state); + if (message.shards != null && message.shards.length) + for (let i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.shards[i]); if (message.config_overrides != null && Object.hasOwnProperty.call(message, "config_overrides")) for (let keys = Object.keys(message.config_overrides), i = 0; i < keys.length; ++i) writer.uint32(/* id 8, wireType 2 =*/66).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config_overrides[keys[i]]).ldelim(); @@ -79413,6 +79426,12 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.state = reader.int32(); break; } + case 7: { + if (!(message.shards && message.shards.length)) + message.shards = []; + message.shards.push(reader.string()); + break; + } case 8: { if (message.config_overrides === $util.emptyObject) message.config_overrides = {}; @@ -79545,6 +79564,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { break; } } + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (let i = 0; i < message.shards.length; ++i) + if (!$util.isString(message.shards[i])) + return "shards: string[] expected"; + } if (message.config_overrides != null && message.hasOwnProperty("config_overrides")) { if (!$util.isObject(message.config_overrides)) return "config_overrides: object expected"; @@ -79719,6 +79745,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.state = 6; break; } + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".tabletmanagerdata.UpdateVReplicationWorkflowRequest.shards: array expected"); + message.shards = []; + for (let i = 0; i < object.shards.length; ++i) + message.shards[i] = String(object.shards[i]); + } if (object.config_overrides) { if (typeof object.config_overrides !== "object") throw TypeError(".tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides: object expected"); @@ -79747,6 +79780,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (options.arrays || options.defaults) { object.cells = []; object.tablet_types = []; + object.shards = []; } if (options.objects || options.defaults) object.config_overrides = {}; @@ -79779,6 +79813,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (options.oneofs) object._state = "state"; } + if (message.shards && message.shards.length) { + object.shards = []; + for (let j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } let keys2; if (message.config_overrides && (keys2 = Object.keys(message.config_overrides)).length) { object.config_overrides = {}; From 1d57f39e52ed4f3db65aac4340d21ffdf842f379 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 23 Jan 2025 07:45:35 +0200 Subject: [PATCH 62/66] `parseComBinlogDumpGTID`: GTID payload is always 5.6 flavor (#17605) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/binlog_dump.go | 8 +++--- go/mysql/flavor_mysql.go | 5 +++- go/mysql/replication.go | 9 ++++--- go/mysql/replication_test.go | 48 +++++++++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/go/mysql/binlog_dump.go b/go/mysql/binlog_dump.go index de91484fc64..cfacf742856 100644 --- a/go/mysql/binlog_dump.go +++ b/go/mysql/binlog_dump.go @@ -76,11 +76,13 @@ func (c *Conn) parseComBinlogDumpGTID(data []byte) (logFile string, logPos uint6 if !ok { return logFile, logPos, position, readPacketErr } - if gtid := string(data[pos : pos+int(dataSize)]); gtid != "" { - position, err = replication.DecodePosition(gtid) + if gtidBytes := data[pos : pos+int(dataSize)]; len(gtidBytes) != 0 { + gtid, err := replication.NewMysql56GTIDSetFromSIDBlock(gtidBytes) if err != nil { - return logFile, logPos, position, err + return logFile, logPos, position, vterrors.Wrapf(err, "error parsing GTID from BinlogDumpGTID packet") } + // ComBinlogDumpGTID is a MySQL specific protocol. The GTID flavor is necessarily MySQL 56 + position = replication.Position{GTIDSet: gtid} } if flags2&BinlogDumpNonBlock != 0 { return logFile, logPos, position, io.EOF diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index c5424259973..a5993ac9aa0 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -218,7 +218,10 @@ func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, binlogFilenam } // Build the command. - sidBlock := gtidSet.SIDBlock() + var sidBlock []byte + if gtidSet != nil { + sidBlock = gtidSet.SIDBlock() + } var flags2 uint16 if binlogFilename != "" { flags2 |= BinlogThroughPosition diff --git a/go/mysql/replication.go b/go/mysql/replication.go index 4c5a0c9523e..3dd369cd6fc 100644 --- a/go/mysql/replication.go +++ b/go/mysql/replication.go @@ -81,7 +81,8 @@ func (c *Conn) AnalyzeSemiSyncAckRequest(buf []byte) (strippedBuf []byte, ackReq // WriteComBinlogDumpGTID writes a ComBinlogDumpGTID command. // Only works with MySQL 5.6+ (and not MariaDB). // See http://dev.mysql.com/doc/internals/en/com-binlog-dump-gtid.html for syntax. -func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, binlogPos uint64, flags uint16, gtidSet []byte) error { +// sidBlock must be the result of a gtidSet.SIDBlock() function. +func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, binlogPos uint64, flags uint16, sidBlock []byte) error { c.sequence = 0 length := 1 + // ComBinlogDumpGTID 2 + // flags @@ -90,7 +91,7 @@ func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, bi len(binlogFilename) + // binlog-filename 8 + // binlog-pos 4 + // data-size - len(gtidSet) // data + len(sidBlock) // data data, pos := c.startEphemeralPacketWithHeader(length) pos = writeByte(data, pos, ComBinlogDumpGTID) // nolint pos = writeUint16(data, pos, flags) // nolint @@ -98,8 +99,8 @@ func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, bi pos = writeUint32(data, pos, uint32(len(binlogFilename))) // nolint pos = writeEOFString(data, pos, binlogFilename) // nolint pos = writeUint64(data, pos, binlogPos) // nolint - pos = writeUint32(data, pos, uint32(len(gtidSet))) // nolint - pos += copy(data[pos:], gtidSet) // nolint + pos = writeUint32(data, pos, uint32(len(sidBlock))) // nolint + pos += copy(data[pos:], sidBlock) // nolint if err := c.writeEphemeralPacket(); err != nil { return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } diff --git a/go/mysql/replication_test.go b/go/mysql/replication_test.go index ded22d838f6..3f423624b68 100644 --- a/go/mysql/replication_test.go +++ b/go/mysql/replication_test.go @@ -24,6 +24,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/test/utils" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -88,14 +89,50 @@ func TestComBinlogDumpGTID(t *testing.T) { cConn.Close() }() + t.Run("WriteComBinlogDumpGTIDEmptyGTID", func(t *testing.T) { + // Write ComBinlogDumpGTID packet, read it, compare. + var flags uint16 = 0x0d0e + err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, flags, []byte{}) + assert.NoError(t, err) + data, err := sConn.ReadPacket() + require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err) + require.NotEmpty(t, data) + require.EqualValues(t, data[0], ComBinlogDumpGTID) + + expectedData := []byte{ + ComBinlogDumpGTID, + 0x0e, 0x0d, // flags + 0x04, 0x03, 0x02, 0x01, // server-id + 0x07, 0x00, 0x00, 0x00, // binlog-filename-len + 'm', 'o', 'o', 'f', 'a', 'r', 'm', // bilog-filename + 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, // binlog-pos + 0x00, 0x00, 0x00, 0x00, // data-size is zero, no GTID payload + } + assert.Equal(t, expectedData, data) + logFile, logPos, pos, err := sConn.parseComBinlogDumpGTID(data) + require.NoError(t, err, "parseComBinlogDumpGTID failed: %v", err) + assert.Equal(t, "moofarm", logFile) + assert.Equal(t, uint64(0x05060708090a0b0c), logPos) + assert.True(t, pos.IsZero()) + }) + + sConn.sequence = 0 + t.Run("WriteComBinlogDumpGTID", func(t *testing.T) { // Write ComBinlogDumpGTID packet, read it, compare. var flags uint16 = 0x0d0e assert.Equal(t, flags, flags|BinlogThroughGTID) - err := cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, flags, []byte{0xfa, 0xfb}) + gtidSet, err := replication.ParseMysql56GTIDSet("16b1039f-22b6-11ed-b765-0a43f95f28a3:1-243") + require.NoError(t, err) + sidBlock := gtidSet.SIDBlock() + assert.Len(t, sidBlock, 48) + + err = cConn.WriteComBinlogDumpGTID(0x01020304, "moofarm", 0x05060708090a0b0c, flags, sidBlock) assert.NoError(t, err) data, err := sConn.ReadPacket() require.NoError(t, err, "sConn.ReadPacket - ComBinlogDumpGTID failed: %v", err) + require.NotEmpty(t, data) + require.EqualValues(t, data[0], ComBinlogDumpGTID) expectedData := []byte{ ComBinlogDumpGTID, @@ -104,10 +141,15 @@ func TestComBinlogDumpGTID(t *testing.T) { 0x07, 0x00, 0x00, 0x00, // binlog-filename-len 'm', 'o', 'o', 'f', 'a', 'r', 'm', // bilog-filename 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, // binlog-pos - 0x02, 0x00, 0x00, 0x00, // data-size - 0xfa, 0xfb, // data + 0x30, 0x00, 0x00, 0x00, // data-size } + expectedData = append(expectedData, sidBlock...) // data assert.Equal(t, expectedData, data) + logFile, logPos, pos, err := sConn.parseComBinlogDumpGTID(data) + require.NoError(t, err, "parseComBinlogDumpGTID failed: %v", err) + assert.Equal(t, "moofarm", logFile) + assert.Equal(t, uint64(0x05060708090a0b0c), logPos) + assert.Equal(t, gtidSet, pos.GTIDSet) }) sConn.sequence = 0 From 91dd79d38b36a09eea6742c703025b5cef481051 Mon Sep 17 00:00:00 2001 From: "Eduardo J. Ortega U." <5791035+ejortegau@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:34:04 +0100 Subject: [PATCH 63/66] Use prefix in all vtorc check and recover logs (#17526) Signed-off-by: Eduardo J. Ortega U. <5791035+ejortegau@users.noreply.github.com> --- go/vt/log/log.go | 91 +++++++++++++ go/vt/vtorc/logic/topology_recovery.go | 144 ++++++++++++-------- go/vt/vtorc/logic/topology_recovery_test.go | 4 +- 3 files changed, 184 insertions(+), 55 deletions(-) diff --git a/go/vt/log/log.go b/go/vt/log/log.go index 79be1da464c..fb0c90bbb1c 100644 --- a/go/vt/log/log.go +++ b/go/vt/log/log.go @@ -111,3 +111,94 @@ func (lrms *logRotateMaxSize) String() string { func (lrms *logRotateMaxSize) Type() string { return "uint64" } + +type PrefixedLogger struct { + prefix string +} + +func NewPrefixedLogger(prefix string) *PrefixedLogger { + return &PrefixedLogger{prefix: prefix + ": "} +} + +func (pl *PrefixedLogger) V(level glog.Level) glog.Verbose { + return V(level) +} + +func (pl *PrefixedLogger) Flush() { + Flush() +} + +func (pl *PrefixedLogger) Info(args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Info(args...) +} + +func (pl *PrefixedLogger) Infof(format string, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Infof("%s"+format, args...) +} + +func (pl *PrefixedLogger) InfoDepth(depth int, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + InfoDepth(depth, args...) +} + +func (pl *PrefixedLogger) Warning(args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Warning(args...) +} + +func (pl *PrefixedLogger) Warningf(format string, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Warningf("%s"+format, args...) +} + +func (pl *PrefixedLogger) WarningDepth(depth int, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + WarningDepth(depth, args...) +} + +func (pl *PrefixedLogger) Error(args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Error(args...) +} + +func (pl *PrefixedLogger) Errorf(format string, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Errorf("%s"+format, args...) +} + +func (pl *PrefixedLogger) ErrorDepth(depth int, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + ErrorDepth(depth, args...) +} + +func (pl *PrefixedLogger) Exit(args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Exit(args...) +} + +func (pl *PrefixedLogger) Exitf(format string, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Exitf("%s"+format, args...) +} + +func (pl *PrefixedLogger) ExitDepth(depth int, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + ExitDepth(depth, args...) +} + +func (pl *PrefixedLogger) Fatal(args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Fatal(args...) +} + +func (pl *PrefixedLogger) Fatalf(format string, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + Fatalf("%s"+format, args...) +} + +func (pl *PrefixedLogger) FatalDepth(depth int, args ...any) { + args = append([]interface{}{pl.prefix}, args...) + FatalDepth(depth, args...) +} diff --git a/go/vt/vtorc/logic/topology_recovery.go b/go/vt/vtorc/logic/topology_recovery.go index ab41d1fa988..41c0ca5d398 100644 --- a/go/vt/vtorc/logic/topology_recovery.go +++ b/go/vt/vtorc/logic/topology_recovery.go @@ -171,13 +171,15 @@ func resolveRecovery(topologyRecovery *TopologyRecovery, successorInstance *inst } // recoverPrimaryHasPrimary resets the replication on the primary instance -func recoverPrimaryHasPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func recoverPrimaryHasPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixPrimaryHasPrimary.", analysisEntry.AnalyzedInstanceAlias)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixPrimaryHasPrimary.", analysisEntry.AnalyzedInstanceAlias) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, will fix incorrect primaryship on %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v, will fix incorrect primaryship on %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) // This has to be done in the end; whether successful or not, we should mark that the recovery is done. // So that after the active period passes, we are able to run other recoveries. defer func() { @@ -187,6 +189,7 @@ func recoverPrimaryHasPrimary(ctx context.Context, analysisEntry *inst.Replicati // Read the tablet information from the database to find the shard and keyspace of the tablet analyzedTablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceAlias) if err != nil { + logger.Errorf("Failed to read instance %s, aborting recovery", analysisEntry.AnalyzedInstanceAlias) return false, nil, err } @@ -197,19 +200,22 @@ func recoverPrimaryHasPrimary(ctx context.Context, analysisEntry *inst.Replicati // runEmergencyReparentOp runs a recovery for which we have to run ERS. Here waitForAllTablets is a boolean telling ERS whether it should wait for all the tablets // or is it okay to skip 1. -func runEmergencyReparentOp(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, recoveryName string, waitForAllTablets bool) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func runEmergencyReparentOp(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, recoveryName string, waitForAllTablets bool, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { // Read the tablet information from the database to find the shard and keyspace of the tablet tablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceAlias) if err != nil { + logger.Errorf("Failed to read instance %s, aborting recovery", analysisEntry.AnalyzedInstanceAlias) return false, nil, err } topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another %v.", analysisEntry.AnalyzedInstanceAlias, recoveryName)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another %v.", analysisEntry.AnalyzedInstanceAlias, recoveryName) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, %v %+v", analysisEntry.Analysis, recoveryName, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v, %v %+v", analysisEntry.Analysis, recoveryName, analysisEntry.AnalyzedInstanceAlias) var promotedReplica *inst.Instance // This has to be done in the end; whether successful or not, we should mark that the recovery is done. // So that after the active period passes, we are able to run other recoveries. @@ -223,11 +229,11 @@ func runEmergencyReparentOp(ctx context.Context, analysisEntry *inst.Replication // we only log the warnings and errors explicitly, everything gets logged as an information message anyways in auditing topology recovery switch level { case logutilpb.Level_WARNING: - log.Warningf("ERS - %s", value) + logger.Warningf("ERS - %s", value) case logutilpb.Level_ERROR: - log.Errorf("ERS - %s", value) + logger.Errorf("ERS - %s", value) default: - log.Infof("ERS - %s", value) + logger.Infof("ERS - %s", value) } _ = AuditTopologyRecovery(topologyRecovery, value) })).ReparentShard(ctx, @@ -241,7 +247,7 @@ func runEmergencyReparentOp(ctx context.Context, analysisEntry *inst.Replication }, ) if err != nil { - log.Errorf("Error running ERS - %v", err) + logger.Errorf("Error running ERS - %v", err) } if ev != nil && ev.NewPrimary != nil { @@ -253,13 +259,13 @@ func runEmergencyReparentOp(ctx context.Context, analysisEntry *inst.Replication // recoverDeadPrimary checks a given analysis, decides whether to take action, and possibly takes action // Returns true when action was taken. -func recoverDeadPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { - return runEmergencyReparentOp(ctx, analysisEntry, "RecoverDeadPrimary", false) +func recoverDeadPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { + return runEmergencyReparentOp(ctx, analysisEntry, "RecoverDeadPrimary", false, logger) } // recoverPrimaryTabletDeleted tries to run a recovery for the case where the primary tablet has been deleted. -func recoverPrimaryTabletDeleted(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { - return runEmergencyReparentOp(ctx, analysisEntry, "PrimaryTabletDeleted", true) +func recoverPrimaryTabletDeleted(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { + return runEmergencyReparentOp(ctx, analysisEntry, "PrimaryTabletDeleted", true, logger) } func postErsCompletion(topologyRecovery *TopologyRecovery, analysisEntry *inst.ReplicationAnalysis, recoveryName string, promotedReplica *inst.Instance) { @@ -272,12 +278,14 @@ func postErsCompletion(topologyRecovery *TopologyRecovery, analysisEntry *inst.R } // checkAndRecoverGenericProblem is a general-purpose recovery function -func checkAndRecoverLockedSemiSyncPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func checkAndRecoverLockedSemiSyncPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { + logger.Warning("No actions in checkAndRecoverLockedSemiSyncPrimary") return false, nil, nil } // checkAndRecoverGenericProblem is a general-purpose recovery function -func checkAndRecoverGenericProblem(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (bool, *TopologyRecovery, error) { +func checkAndRecoverGenericProblem(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (bool, *TopologyRecovery, error) { + logger.Warning("No actions in checkAndRecoverGenericProblem") return false, nil, nil } @@ -367,7 +375,7 @@ func hasActionableRecovery(recoveryFunctionCode recoveryFunction) bool { // getCheckAndRecoverFunction gets the recovery function for the given code. func getCheckAndRecoverFunction(recoveryFunctionCode recoveryFunction) ( - checkAndRecoverFunction func(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error), + checkAndRecoverFunction func(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error), ) { switch recoveryFunctionCode { case noRecoveryFunc: @@ -447,16 +455,20 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er countPendingRecoveries.Add(1) defer countPendingRecoveries.Add(-1) + logger := log.NewPrefixedLogger(fmt.Sprintf("Recovery for %s on %s/%s", analysisEntry.Analysis, analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard)) + logger.Info("Starting checkAndRecover") + checkAndRecoverFunctionCode := getCheckAndRecoverFunctionCode(analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) isActionableRecovery := hasActionableRecovery(checkAndRecoverFunctionCode) analysisEntry.IsActionableRecovery = isActionableRecovery if checkAndRecoverFunctionCode == noRecoveryFunc { + logger.Warning("No recovery strategies for problem, aborting recovery") // Unhandled problem type if analysisEntry.Analysis != inst.NoProblem { if util.ClearToLog("executeCheckAndRecoverFunction", analysisEntry.AnalyzedInstanceAlias) { - log.Warningf("executeCheckAndRecoverFunction: ignoring analysisEntry that has no action plan: %+v; tablet: %+v", - analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Warningf("executeCheckAndRecoverFunction: ignoring analysisEntry that has no action plan: tablet: %+v", + analysisEntry.AnalyzedInstanceAlias) } } @@ -464,24 +476,24 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er } // we have a recovery function; its execution still depends on filters if not disabled. if isActionableRecovery || util.ClearToLog("executeCheckAndRecoverFunction: detection", analysisEntry.AnalyzedInstanceAlias) { - log.Infof("executeCheckAndRecoverFunction: proceeding with %+v detection on %+v; isActionable?: %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias, isActionableRecovery) + logger.Infof("executeCheckAndRecoverFunction: proceeding with %+v detection on %+v; isActionable?: %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias, isActionableRecovery) } // At this point we have validated there's a failure scenario for which we have a recovery path. // Record the failure detected in the logs. err = InsertRecoveryDetection(analysisEntry) if err != nil { - log.Errorf("executeCheckAndRecoverFunction: error on inserting recovery detection record: %+v", err) + logger.Errorf("executeCheckAndRecoverFunction: error inserting recovery detection record, aborting recovery: %+v", err) return err } // Check for recovery being disabled globally if recoveryDisabledGlobally, err := IsRecoveryDisabled(); err != nil { // Unexpected. Shouldn't get this - log.Errorf("Unable to determine if recovery is disabled globally: %v", err) + logger.Errorf("Unable to determine if recovery is disabled globally, still attempting to recover: %v", err) } else if recoveryDisabledGlobally { - log.Infof("CheckAndRecover: Analysis: %+v, Tablet: %+v: NOT Recovering host (disabled globally)", - analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("CheckAndRecover: Tablet: %+v: NOT Recovering host (disabled globally)", + analysisEntry.AnalyzedInstanceAlias) return err } @@ -489,6 +501,7 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er // We lock the shard here and then refresh the tablets information ctx, unlock, err := LockShard(context.Background(), analysisEntry.AnalyzedInstanceAlias, getLockAction(analysisEntry.AnalyzedInstanceAlias, analysisEntry.Analysis)) if err != nil { + logger.Errorf("Failed to lock shard, aborting recovery: %v", err) return err } defer unlock(&err) @@ -498,7 +511,7 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er // changes, we should be checking that this failure is indeed needed to be fixed. We do this after locking the shard to be sure // that the data that we use now is up-to-date. if isActionableRecovery { - log.Errorf("executeCheckAndRecoverFunction: Proceeding with %v recovery on %v validation after acquiring shard lock.", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("executeCheckAndRecoverFunction: Proceeding with %v recovery on %v validation after acquiring shard lock.", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) // The first step we have to do is refresh the keyspace and shard information // This is required to know if the durability policies have changed or not // If they have, then recoveries like ReplicaSemiSyncMustNotBeSet, etc won't be valid anymore. @@ -506,6 +519,7 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er // a change in the recovery we run. err = RefreshKeyspaceAndShard(analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard) if err != nil { + logger.Errorf("Failed to refresh keyspace and shard, aborting recovery: %v", err) return err } // If we are about to run a cluster-wide recovery, it is imperative to first refresh all the tablets @@ -518,6 +532,7 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er } // We ignore the dead primary tablet because it is going to be unreachable. If all the other tablets aren't able to reach this tablet either, // we can proceed with the dead primary recovery. We don't need to refresh the information for this dead tablet. + logger.Info("Force refreshing all shard tablets") forceRefreshAllTabletsInShard(ctx, analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard, tabletsToIgnore) } else { // If we are not running a cluster-wide recovery, then it is only concerned with the specific tablet @@ -526,66 +541,76 @@ func executeCheckAndRecoverFunction(analysisEntry *inst.ReplicationAnalysis) (er // and the host-port set on the tablet in question. // So, we only need to refresh the tablet info records (to know if the primary tablet has changed), // and the replication data of the new primary and this tablet. + logger.Info("Refreshing shard tablet info") refreshTabletInfoOfShard(ctx, analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard) + logger.Info("Discovering analysis instance") DiscoverInstance(analysisEntry.AnalyzedInstanceAlias, true) + logger.Info("Getting shard primary") primaryTablet, err := shardPrimary(analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard) if err != nil { - log.Errorf("executeCheckAndRecoverFunction: Analysis: %+v, Tablet: %+v: error while finding the shard primary: %v", - analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias, err) + logger.Errorf("executeCheckAndRecoverFunction: Tablet: %+v: error while finding the shard primary: %v", + analysisEntry.AnalyzedInstanceAlias, err) return err } primaryTabletAlias := topoproto.TabletAliasString(primaryTablet.Alias) // We can skip the refresh if we know the tablet we are looking at is the primary tablet. // This would be the case for PrimaryHasPrimary recovery. We don't need to refresh the same tablet twice. if analysisEntry.AnalyzedInstanceAlias != primaryTabletAlias { + logger.Info("Discovering primary instance") DiscoverInstance(primaryTabletAlias, true) } } alreadyFixed, err := checkIfAlreadyFixed(analysisEntry) if err != nil { - log.Errorf("executeCheckAndRecoverFunction: Analysis: %+v, Tablet: %+v: error while trying to find if the problem is already fixed: %v", - analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias, err) + logger.Errorf("executeCheckAndRecoverFunction: Tablet: %+v: error while trying to find if the problem is already fixed: %v", + analysisEntry.AnalyzedInstanceAlias, err) return err } if alreadyFixed { - log.Infof("Analysis: %v on tablet %v - No longer valid, some other agent must have fixed the problem.", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v on tablet %v - No longer valid, some other agent must have fixed the problem.", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) return nil } } // Actually attempt recovery: if isActionableRecovery || util.ClearToLog("executeCheckAndRecoverFunction: recovery", analysisEntry.AnalyzedInstanceAlias) { - log.Infof("executeCheckAndRecoverFunction: proceeding with %+v recovery on %+v; isRecoverable?: %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias, isActionableRecovery) + logger.Infof("executeCheckAndRecoverFunction: proceeding with recovery on %+v; isRecoverable?: %+v", analysisEntry.AnalyzedInstanceAlias, isActionableRecovery) } - recoveryAttempted, topologyRecovery, err := getCheckAndRecoverFunction(checkAndRecoverFunctionCode)(ctx, analysisEntry) + recoveryAttempted, topologyRecovery, err := getCheckAndRecoverFunction(checkAndRecoverFunctionCode)(ctx, analysisEntry, logger) if !recoveryAttempted { + logger.Errorf("Recovery not attempted: %+v", err) return err } recoveryName := getRecoverFunctionName(checkAndRecoverFunctionCode) recoveriesCounter.Add(recoveryName, 1) if err != nil { + logger.Errorf("Failed to recover: %+v", err) recoveriesFailureCounter.Add(recoveryName, 1) } else { + logger.Info("Recovery succeeded") recoveriesSuccessfulCounter.Add(recoveryName, 1) } if topologyRecovery == nil { + logger.Error("Topology recovery is nil - recovery might have failed") return err } if b, err := json.Marshal(topologyRecovery); err == nil { - log.Infof("Topology recovery: %+v", string(b)) + logger.Infof("Topology recovery: %+v", string(b)) } else { - log.Infof("Topology recovery: %+v", topologyRecovery) + logger.Infof("Topology recovery: %+v", topologyRecovery) } // If we ran a cluster wide recovery and actually attempted it, then we know that the replication state for all the tablets in this cluster // would have changed. So we can go ahead and pre-emptively refresh them. // For this refresh we don't use the same context that we used for the recovery, since that context might have expired or could expire soon // Instead we pass the background context. The call forceRefreshAllTabletsInShard handles adding a timeout to it for us. if isClusterWideRecovery(checkAndRecoverFunctionCode) { + logger.Info("Forcing refresh of all tablets post recovery") forceRefreshAllTabletsInShard(context.Background(), analysisEntry.AnalyzedKeyspace, analysisEntry.AnalyzedShard, nil) } else { // For all other recoveries, we would have changed the replication status of the analyzed tablet // so it doesn't hurt to re-read the information of this tablet, otherwise we'll requeue the same recovery // that we just completed because we would be using stale data. + logger.Info("Force discovering problem instance %s post recovery", analysisEntry.AnalyzedInstanceAlias) DiscoverInstance(analysisEntry.AnalyzedInstanceAlias, true) } return err @@ -667,13 +692,15 @@ func postPrsCompletion(topologyRecovery *TopologyRecovery, analysisEntry *inst.R } // electNewPrimary elects a new primary while none were present before. -func electNewPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func electNewPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil || err != nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another electNewPrimary.", analysisEntry.AnalyzedInstanceAlias)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another electNewPrimary.", analysisEntry.AnalyzedInstanceAlias) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, will elect a new primary for %v:%v", analysisEntry.Analysis, analysisEntry.ClusterDetails.Keyspace, analysisEntry.ClusterDetails.Shard) + logger.Infof("Analysis: %v, will elect a new primary for %v:%v", analysisEntry.Analysis, analysisEntry.ClusterDetails.Keyspace, analysisEntry.ClusterDetails.Shard) var promotedReplica *inst.Instance // This has to be done in the end; whether successful or not, we should mark that the recovery is done. @@ -684,6 +711,7 @@ func electNewPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysi analyzedTablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceAlias) if err != nil { + logger.Errorf("Failed to read instance %s, aborting recovery", analysisEntry.AnalyzedInstanceAlias) return false, topologyRecovery, err } _ = AuditTopologyRecovery(topologyRecovery, "starting PlannedReparentShard for electing new primary.") @@ -694,9 +722,9 @@ func electNewPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysi // we only log the warnings and errors explicitly, everything gets logged as an information message anyways in auditing topology recovery switch level { case logutilpb.Level_WARNING: - log.Warningf("PRS - %s", value) + logger.Warningf("PRS - %s", value) case logutilpb.Level_ERROR: - log.Errorf("PRS - %s", value) + logger.Errorf("PRS - %s", value) } _ = AuditTopologyRecovery(topologyRecovery, value) })).ReparentShard(ctx, @@ -716,13 +744,15 @@ func electNewPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysi } // fixPrimary sets the primary as read-write. -func fixPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func fixPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixPrimary.", analysisEntry.AnalyzedInstanceAlias)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixPrimary.", analysisEntry.AnalyzedInstanceAlias) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, will fix primary to read-write %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v, will fix primary to read-write %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) // This has to be done in the end; whether successful or not, we should mark that the recovery is done. // So that after the active period passes, we are able to run other recoveries. defer func() { @@ -731,12 +761,13 @@ func fixPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r analyzedTablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceAlias) if err != nil { + logger.Errorf("Failed to read instance %s, aborting recovery", analysisEntry.AnalyzedInstanceAlias) return false, topologyRecovery, err } durabilityPolicy, err := inst.GetDurabilityPolicy(analyzedTablet.Keyspace) if err != nil { - log.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) + logger.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) return false, topologyRecovery, err } @@ -747,13 +778,15 @@ func fixPrimary(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r } // fixReplica sets the replica as read-only and points it at the current primary. -func fixReplica(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func fixReplica(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixReplica.", analysisEntry.AnalyzedInstanceAlias)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another fixReplica.", analysisEntry.AnalyzedInstanceAlias) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, will fix replica %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v, will fix replica %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) // This has to be done in the end; whether successful or not, we should mark that the recovery is done. // So that after the active period passes, we are able to run other recoveries. defer func() { @@ -762,24 +795,25 @@ func fixReplica(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r analyzedTablet, err := inst.ReadTablet(analysisEntry.AnalyzedInstanceAlias) if err != nil { + logger.Errorf("Failed to read instance %s, aborting recovery", analysisEntry.AnalyzedInstanceAlias) return false, topologyRecovery, err } primaryTablet, err := shardPrimary(analyzedTablet.Keyspace, analyzedTablet.Shard) if err != nil { - log.Info("Could not compute primary for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) + logger.Info("Could not compute primary for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) return false, topologyRecovery, err } durabilityPolicy, err := inst.GetDurabilityPolicy(analyzedTablet.Keyspace) if err != nil { - log.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) + logger.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) return false, topologyRecovery, err } err = setReadOnly(ctx, analyzedTablet) if err != nil { - log.Info("Could not set the tablet %v to readonly - %v", analysisEntry.AnalyzedInstanceAlias, err) + logger.Info("Could not set the tablet %v to readonly - %v", analysisEntry.AnalyzedInstanceAlias, err) return true, topologyRecovery, err } @@ -788,13 +822,15 @@ func fixReplica(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (r } // recoverErrantGTIDDetected changes the tablet type of a replica tablet that has errant GTIDs. -func recoverErrantGTIDDetected(ctx context.Context, analysisEntry *inst.ReplicationAnalysis) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { +func recoverErrantGTIDDetected(ctx context.Context, analysisEntry *inst.ReplicationAnalysis, logger *log.PrefixedLogger) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) { topologyRecovery, err = AttemptRecoveryRegistration(analysisEntry) if topologyRecovery == nil { - _ = AuditTopologyRecovery(topologyRecovery, fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another recoverErrantGTIDDetected.", analysisEntry.AnalyzedInstanceAlias)) + message := fmt.Sprintf("found an active or recent recovery on %+v. Will not issue another recoverErrantGTIDDetected.", analysisEntry.AnalyzedInstanceAlias) + logger.Warning(message) + _ = AuditTopologyRecovery(topologyRecovery, message) return false, nil, err } - log.Infof("Analysis: %v, will fix tablet %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) + logger.Infof("Analysis: %v, will fix tablet %+v", analysisEntry.Analysis, analysisEntry.AnalyzedInstanceAlias) // This has to be done in the end; whether successful or not, we should mark that the recovery is done. // So that after the active period passes, we are able to run other recoveries. defer func() { @@ -808,13 +844,13 @@ func recoverErrantGTIDDetected(ctx context.Context, analysisEntry *inst.Replicat primaryTablet, err := shardPrimary(analyzedTablet.Keyspace, analyzedTablet.Shard) if err != nil { - log.Info("Could not compute primary for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) + logger.Info("Could not compute primary for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) return false, topologyRecovery, err } durabilityPolicy, err := inst.GetDurabilityPolicy(analyzedTablet.Keyspace) if err != nil { - log.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) + logger.Info("Could not read the durability policy for %v/%v", analyzedTablet.Keyspace, analyzedTablet.Shard) return false, topologyRecovery, err } diff --git a/go/vt/vtorc/logic/topology_recovery_test.go b/go/vt/vtorc/logic/topology_recovery_test.go index ca164d78836..9df5fc989f0 100644 --- a/go/vt/vtorc/logic/topology_recovery_test.go +++ b/go/vt/vtorc/logic/topology_recovery_test.go @@ -20,6 +20,8 @@ import ( "context" "testing" + "vitess.io/vitess/go/vt/log" + "github.com/stretchr/testify/require" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -131,7 +133,7 @@ func TestElectNewPrimaryPanic(t *testing.T) { defer cancel() ts = memorytopo.NewServer(ctx, "zone1") - recoveryAttempted, _, err := electNewPrimary(context.Background(), analysisEntry) + recoveryAttempted, _, err := electNewPrimary(context.Background(), analysisEntry, log.NewPrefixedLogger("prefix")) require.True(t, recoveryAttempted) require.Error(t, err) } From f2827f9b90adaa784664f1d912948ec9d960929c Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Thu, 23 Jan 2025 11:35:54 +0100 Subject: [PATCH 64/66] Update to latest Nodejs LTS and NPM (#17606) Signed-off-by: Dirkjan Bussink --- .../check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/vtadmin_web_build.yml | 2 +- .github/workflows/vtadmin_web_lint.yml | 2 +- .github/workflows/vtadmin_web_unit_tests.yml | 2 +- changelog/22.0/22.0.0/summary.md | 9 + docker/binaries/vtadmin/Dockerfile | 2 +- web/vtadmin/README.md | 4 +- web/vtadmin/build.sh | 2 +- web/vtadmin/package-lock.json | 8147 +++++++++-------- web/vtadmin/package.json | 13 +- web/vtadmin/src/proto/vtadmin.d.ts | 39 - web/vtadmin/src/proto/vtadmin.js | 91 +- 13 files changed, 4616 insertions(+), 3701 deletions(-) diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 4df27f4d826..ae7751163e2 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -61,7 +61,7 @@ jobs: uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: # node-version should match package.json - node-version: '20.12.2' + node-version: '22.13.1' - name: Install npm dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 2773d602ec9..b7f14688b95 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -230,7 +230,7 @@ jobs: uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: # make proto requires newer node than the pre-installed one - node-version: '20.12.2' + node-version: '22.13.1' - name: check_make_proto if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index 582f8b57647..1c3f4a93175 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -44,7 +44,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' with: # node-version should match package.json - node-version: '20.12.2' + node-version: '22.13.1' - name: Install dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index 570867f821a..403b978dd98 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -44,7 +44,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' with: # node-version should match package.json - node-version: '20.12.2' + node-version: '22.13.1' - name: Install dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index 0138f06b2b7..6665936175f 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -44,7 +44,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' with: # node-version should match package.json - node-version: '20.12.2' + node-version: '22.13.1' - name: Install dependencies if: steps.skip-workflow.outputs.skip-workflow == 'false' diff --git a/changelog/22.0/22.0.0/summary.md b/changelog/22.0/22.0.0/summary.md index cbb1f37889c..b2c5c029851 100644 --- a/changelog/22.0/22.0.0/summary.md +++ b/changelog/22.0/22.0.0/summary.md @@ -19,6 +19,8 @@ - **[Minor Changes](#minor-changes)** - **[VTTablet Flags](#flags-vttablet)** - **[Topology read concurrency behaviour changes](#topo-read-concurrency-changes)** + - **[VTAdmin](#vtadmin)** + - [Updated to node v22.13.1](#updated-node) ## Major Changes @@ -150,3 +152,10 @@ While the flag will continue to accept float values (interpreted as seconds) for The `--topo_read_concurrency` flag was added to all components that access the topology and the provided limit is now applied separately for each global or local cell _(default `32`)_. All topology read calls _(`Get`, `GetVersion`, `List` and `ListDir`)_ now respect this per-cell limit. Previous to this version a single limit was applied to all cell calls and it was not respected by many topology calls. + +### VTAdmin + +#### vtadmin-web updated to node v22.13.1 (LTS) + +Building `vtadmin-web` now requires node >= v22.13.0 (LTS). Breaking changes from v20 to v22 can be found at https://nodejs.org/en/blog/release/v22.13.0 -- with no known issues that apply to VTAdmin. +Full details on the node v20.12.2 release can be found at https://nodejs.org/en/blog/release/v22.13.1. diff --git a/docker/binaries/vtadmin/Dockerfile b/docker/binaries/vtadmin/Dockerfile index b700f8ab74b..c51527c1f39 100644 --- a/docker/binaries/vtadmin/Dockerfile +++ b/docker/binaries/vtadmin/Dockerfile @@ -17,7 +17,7 @@ ARG DEBIAN_VER=bookworm-slim FROM vitess/lite:${VT_BASE_VER} AS lite -FROM node:20-${DEBIAN_VER} as node +FROM node:22-${DEBIAN_VER} as node # Prepare directory structure. RUN mkdir -p /vt/web diff --git a/web/vtadmin/README.md b/web/vtadmin/README.md index d6bcd67d277..629fe116711 100644 --- a/web/vtadmin/README.md +++ b/web/vtadmin/README.md @@ -2,8 +2,8 @@ ## Prerequisites -- [node](https://nodejs.org) >= 20.12.0 LTS -- npm >= 10.5.0 (comes with node) +- [node](https://nodejs.org) >= 22.13.1 LTS +- npm >= 10.9.2 (comes with node) ## Available scripts diff --git a/web/vtadmin/build.sh b/web/vtadmin/build.sh index b8481ccdc0e..d253233492f 100755 --- a/web/vtadmin/build.sh +++ b/web/vtadmin/build.sh @@ -40,7 +40,7 @@ if [[ -z ${NVM_DIR} ]]; then fi if [[ -z ${NODE_VERSION} ]]; then - export NODE_VERSION="20.12.2" + export NODE_VERSION="22.13.1" fi output "\nInstalling nvm...\n" diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json index 5439928837c..a6ef94d4da2 100644 --- a/web/vtadmin/package-lock.json +++ b/web/vtadmin/package-lock.json @@ -18,7 +18,6 @@ "d3": "^7.9.0", "dayjs": "^1.11.7", "downshift": "^7.2.0", - "highcharts-react-official": "^3.1.0", "history": "^5.3.0", "lodash-es": "^4.17.21", "path-to-regexp": "^8.1.0", @@ -38,7 +37,7 @@ "web-vitals": "^3.1.1" }, "devDependencies": { - "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-commonjs": "^28.0.2", "@testing-library/jest-dom": "^5.11.9", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^5.0.3", @@ -54,37 +53,39 @@ "i": "^0.3.7", "jsdom": "^21.1.1", "msw": "^2.5.2", - "npm": "^10.8.0", + "npm": "^10.9.2", "postcss": "^8.4.31", "prettier": "^2.2.1", - "protobufjs-cli": "^1.1.1", + "protobufjs-cli": "^1.1.3", "serve": "^14.2.0", "stylelint": "^14.4.0", "stylelint-config-prettier": "^9.0.3", "stylelint-config-standard-scss": "^3.0.0", "tailwindcss": "^3.0.18", "typescript": "^5.0.2", - "vite": "^4.5.3", + "vite": "^4.5.6", "vite-plugin-eslint": "^1.8.1", "vite-plugin-svgr": "^2.4.0", "vitest": "^0.29.8" }, "engines": { - "node": ">=20.12.0", - "npm": ">=10.5.0" + "node": ">=22.13.0", + "npm": ">=10.9.2" } }, "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", - "dev": true + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -97,6 +98,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -106,11 +108,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -118,30 +122,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -157,10 +163,11 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", - "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz", + "integrity": "sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ==", "dev": true, + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -179,58 +186,51 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -239,19 +239,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -262,13 +261,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -279,10 +279,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -294,75 +295,44 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -372,35 +342,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -410,14 +383,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -426,194 +400,119 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.26.5" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -623,12 +522,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -638,14 +538,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -655,13 +556,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -676,6 +578,7 @@ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -688,14 +591,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", - "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.1" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -710,6 +614,7 @@ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -727,6 +632,7 @@ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -744,6 +650,7 @@ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -762,6 +669,7 @@ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -778,45 +686,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -825,12 +695,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", - "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -839,37 +710,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -879,12 +727,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -894,12 +743,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -908,37 +758,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -947,23 +774,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -976,6 +792,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -983,11 +800,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -995,37 +813,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1034,13 +862,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1049,13 +880,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1064,47 +898,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1113,15 +914,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1130,13 +930,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1145,29 +947,36 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1176,37 +985,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1215,14 +1002,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1231,13 +1018,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1246,14 +1035,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1262,29 +1051,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1294,13 +1085,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1310,13 +1101,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1326,13 +1117,14 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", - "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-flow": "^7.24.1" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" }, "engines": { "node": ">=6.9.0" @@ -1342,13 +1134,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1358,14 +1151,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1375,13 +1169,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1391,12 +1185,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1406,13 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1422,12 +1217,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1437,13 +1233,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1453,14 +1250,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1470,15 +1267,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1488,13 +1286,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1504,13 +1303,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1520,12 +1320,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1535,13 +1336,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1551,13 +1352,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1567,15 +1368,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1585,13 +1386,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1601,13 +1403,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1617,14 +1419,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1634,12 +1436,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1649,13 +1452,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1665,15 +1469,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1683,12 +1487,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1698,12 +1503,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1713,16 +1519,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1732,12 +1539,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1747,12 +1555,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", - "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1762,12 +1571,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1777,13 +1587,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1793,12 +1604,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1808,13 +1620,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1824,15 +1654,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1844,12 +1675,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1859,13 +1691,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1875,12 +1708,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1890,12 +1724,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1905,12 +1740,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1920,15 +1756,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1938,12 +1776,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1953,13 +1792,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1969,13 +1809,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1985,13 +1826,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2001,91 +1843,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2100,6 +1931,7 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2110,17 +1942,18 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2130,16 +1963,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2148,16 +1982,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2166,10 +1995,11 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", - "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", + "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", "dev": true, + "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2179,33 +2009,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2214,31 +2043,33 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bugsnag/browser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.22.7.tgz", - "integrity": "sha512-70jFkWKscK2osm7bnFbPLevrzHClrygM3UcKetKs/l81Xuzlxnu1SS3onN5OUl9kd9RN4XMFr46Pv5jSqWqImQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.25.0.tgz", + "integrity": "sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==", + "license": "MIT", "dependencies": { - "@bugsnag/core": "^7.22.7" + "@bugsnag/core": "^7.25.0" } }, "node_modules/@bugsnag/core": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.22.7.tgz", - "integrity": "sha512-9DPWBkkBjhFJc5dCFy/wVC3HE0Aw3ZiLJKjyAxgywSKbILgtpD+qT1Xe8sacWyxU92znamlZ8H8ziQOe7jhhbA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.25.0.tgz", + "integrity": "sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==", + "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0", "@bugsnag/safe-json-stringify": "^6.0.0", @@ -2250,23 +2081,26 @@ "node_modules/@bugsnag/cuid": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.1.1.tgz", - "integrity": "sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==" + "integrity": "sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==", + "license": "MIT" }, "node_modules/@bugsnag/js": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.22.7.tgz", - "integrity": "sha512-Qq8l06rSDTZtxgNIDpTeXHrin9C30INNbPfnR2CNcEsCmfqyVQb4USPEuRb0xg5wiaLKU9r4IAatMqiCgdzG6A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.25.0.tgz", + "integrity": "sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==", + "license": "MIT", "dependencies": { - "@bugsnag/browser": "^7.22.7", - "@bugsnag/node": "^7.22.7" + "@bugsnag/browser": "^7.25.0", + "@bugsnag/node": "^7.25.0" } }, "node_modules/@bugsnag/node": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.22.7.tgz", - "integrity": "sha512-Ud8vpX9UkGxoWAk7OigyR7w1eycbsE5uv5KZx0aWiqDPXylvICd42V5ZiWstpkdm9IVFo9AQ4+gmerHPe4Lwrg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.25.0.tgz", + "integrity": "sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==", + "license": "MIT", "dependencies": { - "@bugsnag/core": "^7.22.7", + "@bugsnag/core": "^7.25.0", "byline": "^5.0.0", "error-stack-parser": "^2.0.2", "iserror": "^0.0.2", @@ -2277,7 +2111,8 @@ "node_modules/@bugsnag/safe-json-stringify": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" + "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==", + "license": "MIT" }, "node_modules/@bundled-es-modules/cookie": { "version": "2.0.1", @@ -2311,9 +2146,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz", - "integrity": "sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", + "integrity": "sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==", "funding": [ { "type": "github", @@ -2324,18 +2159,19 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/color-helpers": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.2.0.tgz", - "integrity": "sha512-hJJrSBzbfGxUsaR6X4Bzd/FLx0F1ulKnR5ljY9AiXCtsR+H+zSWQDFWlKES1BRaVZTDHLpIIHS9K2o0h+JLlrg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.2.1.tgz", + "integrity": "sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw==", "funding": [ { "type": "github", @@ -2346,14 +2182,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" } }, "node_modules/@csstools/css-calc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.0.tgz", - "integrity": "sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.4.tgz", + "integrity": "sha512-tfOuvUQeo7Hz+FcuOd3LfXVp+342pnWUJ7D2y8NUpu1Ww6xnTbHLpz018/y6rtbHifJ3iIEf9ttxXd8KG7nL0Q==", "funding": [ { "type": "github", @@ -2364,12 +2201,13 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/css-color-parser": { @@ -2386,6 +2224,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/color-helpers": "^4.1.0", "@csstools/css-calc": "^1.2.0" @@ -2399,9 +2238,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", + "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", "funding": [ { "type": "github", @@ -2412,17 +2251,18 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", + "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", "funding": [ { "type": "github", @@ -2433,14 +2273,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", - "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", + "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", "funding": [ { "type": "github", @@ -2451,18 +2292,20 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/postcss-cascade-layers": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-3.0.1.tgz", "integrity": "sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==", + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -2492,6 +2335,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2519,6 +2363,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2536,6 +2381,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-2.0.2.tgz", "integrity": "sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2564,6 +2410,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2591,6 +2438,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2617,6 +2465,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^2.3.0", "postcss-value-parser": "^4.2.0" @@ -2642,6 +2491,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2657,6 +2507,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-1.0.1.tgz", "integrity": "sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==", + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2672,6 +2523,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-1.0.1.tgz", "integrity": "sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2690,6 +2542,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-1.0.3.tgz", "integrity": "sha512-6zqcyRg9HSqIHIPMYdt6THWhRmE5/tyHKJQLysn2TeDf/ftq7Em9qwMTx98t2C/7UxIsYS8lOiHHxAVjWn2WUg==", + "license": "CC0-1.0", "dependencies": { "@csstools/css-tokenizer": "^2.1.1" }, @@ -2705,9 +2558,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz", - "integrity": "sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.8.tgz", + "integrity": "sha512-KYQCal2i7XPNtHAUxCECdrC7tuxIWQCW+s8eMYs5r5PaAiVTeKwlrkRS096PFgojdNCmHeG0Cb7njtuNswNf+w==", "funding": [ { "type": "github", @@ -2718,11 +2571,12 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/css-calc": "^1.2.4", + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1", + "@csstools/media-query-list-parser": "^2.1.13" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2745,6 +2599,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-parser-algorithms": "^2.2.0", "@csstools/css-tokenizer": "^2.1.1", @@ -2761,6 +2616,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-2.0.2.tgz", "integrity": "sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2779,6 +2635,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-2.0.1.tgz", "integrity": "sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2807,6 +2664,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2834,6 +2692,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2858,6 +2717,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2875,6 +2735,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-2.0.2.tgz", "integrity": "sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -2893,6 +2754,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-2.1.1.tgz", "integrity": "sha512-YCvdF0GCZK35nhLgs7ippcxDlRVe5QsSht3+EghqTjnYnyl3BbWIN6fYQ1dKWYTJ+7Bgi41TgqQFfJDcp9Xy/w==", + "license": "CC0-1.0", "dependencies": { "@csstools/css-calc": "^1.1.1", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2923,6 +2785,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/color-helpers": "^2.1.0", "postcss-value-parser": "^4.2.0" @@ -2948,6 +2811,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" } @@ -2956,6 +2820,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-2.1.1.tgz", "integrity": "sha512-XcXmHEFfHXhvYz40FtDlA4Fp4NQln2bWTsCwthd2c+MCnYArUYU3YaMqzR5CrKP3pMoGYTBnp5fMqf1HxItNyw==", + "license": "CC0-1.0", "dependencies": { "@csstools/css-calc": "^1.1.1", "@csstools/css-parser-algorithms": "^2.1.1", @@ -2976,6 +2841,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-2.0.1.tgz", "integrity": "sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==", + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2991,6 +2857,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -3016,6 +2883,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -3023,54 +2891,6 @@ "postcss": "^8.4" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", @@ -3079,6 +2899,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3087,323 +2908,41 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -3427,6 +2966,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3442,6 +2982,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3450,10 +2991,11 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3462,6 +3004,7 @@ "version": "1.7.19", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", + "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" @@ -3475,12 +3018,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3493,6 +3038,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3505,17 +3051,19 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/core": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.1.tgz", - "integrity": "sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", + "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.7", - "@inquirer/type": "^3.0.0", + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", @@ -3529,9 +3077,9 @@ } }, "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", - "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", + "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", "dev": true, "license": "MIT", "engines": { @@ -3542,16 +3090,23 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3565,10 +3120,40 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", - "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", "dev": true, "license": "MIT", "engines": { @@ -3580,6 +3165,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3593,10 +3179,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3604,40 +3191,12 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3648,27 +3207,11 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -3680,6 +3223,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -3691,6 +3235,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -3704,10 +3249,11 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3722,6 +3268,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -3731,31 +3278,35 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsdoc/salty": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", - "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21" }, @@ -3764,9 +3315,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.36.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.36.9.tgz", - "integrity": "sha512-mMRDUBwSNeCgjSMEWfjoh4Rm9fbyZ7xQ9SBq8eGHiiyRn1ieTip3pNEt0wxWVPPxR4i1Rv9bTkeEbkX7M4c15A==", + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.5.tgz", + "integrity": "sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==", "dev": true, "license": "MIT", "dependencies": { @@ -3786,6 +3337,7 @@ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } @@ -3795,6 +3347,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3808,6 +3361,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3817,6 +3371,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3830,6 +3385,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3839,6 +3395,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3872,11 +3429,68 @@ "dev": true, "license": "MIT" }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -3887,6 +3501,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/base64": { @@ -3894,6 +3509,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/codegen": { @@ -3901,6 +3517,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/eventemitter": { @@ -3908,6 +3525,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/fetch": { @@ -3915,6 +3533,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -3926,6 +3545,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/inquire": { @@ -3933,6 +3553,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/path": { @@ -3940,6 +3561,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/pool": { @@ -3947,6 +3569,7 @@ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@protobufjs/utf8": { @@ -3954,26 +3577,29 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@rollup/plugin-commonjs": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz", - "integrity": "sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^8.0.3", + "fdir": "^6.2.0", "is-reference": "1.2.1", - "magic-string": "^0.27.0" + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { - "rollup": "^3.29.5" + "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -3982,20 +3608,21 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^3.29.5" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -4003,22 +3630,32 @@ } } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", - "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", - "dev": true + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz", + "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", + "dev": true, + "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4035,6 +3672,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -4051,6 +3689,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -4067,6 +3706,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4083,6 +3723,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4099,6 +3740,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4115,6 +3757,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4131,6 +3774,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4147,6 +3791,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", "dev": true, + "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", "@svgr/babel-plugin-remove-jsx-attribute": "*", @@ -4173,6 +3818,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", @@ -4193,6 +3839,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4205,6 +3852,7 @@ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.0", "entities": "^4.4.0" @@ -4222,6 +3870,7 @@ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", @@ -4240,35 +3889,38 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz", - "integrity": "sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", + "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.5.0" + "@tanstack/virtual-core": "3.11.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tanstack/virtual-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.5.0.tgz", - "integrity": "sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@testing-library/dom": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", - "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -4289,6 +3941,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", @@ -4311,6 +3964,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4324,6 +3978,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^7.28.1" @@ -4341,6 +3996,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-5.1.3.tgz", "integrity": "sha512-UdEUtlQapQ579NEcXDAUE275u+KUsPtxW7NmFrNt0bE6lW8lqNCyxDK0RSuECmNZ/S0/fgP00W9RWRhVKO/hRg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@types/react": ">=16.9.0", @@ -4368,6 +4024,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -4384,6 +4041,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4402,13 +4060,15 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@testing-library/react/node_modules/@types/yargs": { "version": "15.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -4418,6 +4078,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" @@ -4431,6 +4092,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -4442,10 +4104,11 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -4459,6 +4122,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -4467,6 +4131,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -4476,19 +4141,22 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", - "dev": true + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/chai-subset": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "*" } @@ -4541,12 +4209,14 @@ "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -4555,6 +4225,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -4562,17 +4233,20 @@ "node_modules/@types/d3-chord": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -4581,17 +4255,20 @@ "node_modules/@types/d3-delaunay": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -4599,35 +4276,41 @@ "node_modules/@types/d3-dsv": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", - "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -4635,12 +4318,14 @@ "node_modules/@types/d3-hierarchy": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -4648,68 +4333,80 @@ "node_modules/@types/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" }, "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" }, "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" }, "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -4718,46 +4415,53 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "license": "MIT" }, "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -4766,14 +4470,16 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -4783,6 +4489,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4794,6 +4501,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4806,106 +4514,122 @@ "node_modules/@types/jest/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==", + "license": "MIT" }, "node_modules/@types/lodash-es": { "version": "4.17.12", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, + "license": "MIT", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.96", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.96.tgz", - "integrity": "sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==" + "version": "16.18.124", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.124.tgz", + "integrity": "sha512-8ADCm5WzM/IpWxjs1Jhtwo6j+Fb8z4yr/CobP5beUUPdyCI0mg87/bqQYxNcqnhZ24Dc9RME8SQWu5eI/FmSGA==", + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", - "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" @@ -4915,6 +4639,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -4922,10 +4647,11 @@ } }, "node_modules/@types/react-test-renderer": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz", - "integrity": "sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.0.0.tgz", + "integrity": "sha512-qDVnNybqFm2eZKJ4jD34EvRd6VHD67KjgnWaEMM0Id9L22EpWe3nOSVKHWL1XWRCxUWe3lhXwlEeCKD1BlJCQA==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -4933,18 +4659,21 @@ "node_modules/@types/resize-observer-browser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", - "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==" + "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", + "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" }, "node_modules/@types/statuses": { "version": "2.0.5", @@ -4958,6 +4687,7 @@ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/jest": "*" } @@ -4970,9 +4700,10 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -4980,13 +4711,15 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -5016,26 +4749,12 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5043,17 +4762,12 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "5.62.0" }, @@ -5073,6 +4787,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5100,6 +4815,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -5117,6 +4833,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -5144,6 +4861,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5157,6 +4875,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -5179,26 +4898,12 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5206,17 +4911,12 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -5243,6 +4943,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5256,30 +4957,17 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5287,17 +4975,12 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -5311,16 +4994,18 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.20.12", "@babel/plugin-transform-react-jsx-self": "^7.18.6", @@ -5332,7 +5017,20 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.5.4" + "vite": "^4.1.0-beta.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/@vitest/expect": { @@ -5340,6 +5038,7 @@ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/spy": "0.29.8", "@vitest/utils": "0.29.8", @@ -5351,6 +5050,7 @@ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/utils": "0.29.8", "p-limit": "^4.0.0", @@ -5362,6 +5062,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -5373,10 +5074,11 @@ } }, "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -5389,6 +5091,7 @@ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^1.0.2" } @@ -5398,6 +5101,7 @@ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "diff": "^5.1.0", @@ -5409,20 +5113,23 @@ "version": "2.36.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5432,10 +5139,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5448,6 +5156,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" @@ -5458,15 +5167,20 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -5476,6 +5190,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -5488,6 +5203,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5504,10 +5220,33 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -5542,6 +5281,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5550,6 +5290,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5564,12 +5305,15 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5578,6 +5322,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -5596,37 +5353,42 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -5640,6 +5402,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5660,6 +5423,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5669,6 +5433,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5689,6 +5454,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5705,15 +5471,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5723,15 +5490,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5740,45 +5508,37 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -5792,6 +5552,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5801,6 +5562,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -5809,13 +5571,15 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5824,12 +5588,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "funding": [ { "type": "opencollective", @@ -5844,12 +5609,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5867,6 +5633,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -5878,21 +5645,23 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-plugin-macros": { @@ -5900,6 +5669,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -5911,13 +5681,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -5925,25 +5696,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5953,13 +5726,15 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/babel-preset-react-app": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-class-properties": "^7.16.0", @@ -5982,12 +5757,14 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", "engines": { "node": ">=0.6" } @@ -5996,6 +5773,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6007,18 +5786,21 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.0", @@ -6036,35 +5818,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -6072,43 +5831,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/boxen/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -6116,27 +5844,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6158,6 +5870,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", "detect-node": "^2.1.0", @@ -6170,9 +5883,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -6187,11 +5900,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -6204,6 +5918,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6213,6 +5928,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6222,21 +5938,53 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6250,6 +5998,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6259,6 +6008,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6271,6 +6021,7 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -6280,6 +6031,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -6297,14 +6049,15 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001614", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz", - "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "funding": [ { "type": "opencollective", @@ -6318,13 +6071,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.15" }, @@ -6333,10 +6088,11 @@ } }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -6344,7 +6100,7 @@ "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" }, "engines": { "node": ">=4" @@ -6354,6 +6110,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6370,6 +6127,7 @@ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2" }, @@ -6385,6 +6143,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -6393,37 +6152,18 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" } }, "node_modules/ci-info": { @@ -6436,6 +6176,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -6443,18 +6184,21 @@ "node_modules/classcat": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6467,6 +6211,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -6478,23 +6223,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6507,6 +6241,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6519,6 +6254,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -6530,38 +6266,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -6575,13 +6279,15 @@ "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" }, "node_modules/clipboardy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", "dev": true, + "license": "MIT", "dependencies": { "arch": "^2.2.0", "execa": "^5.1.1", @@ -6599,6 +6305,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -6608,11 +6315,34 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6629,6 +6359,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6650,6 +6381,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6660,7 +6392,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/color-string": { "version": "1.9.1", @@ -6676,13 +6409,15 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6694,6 +6429,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -6702,13 +6438,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6721,6 +6459,7 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -6739,6 +6478,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6747,35 +6487,41 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compute-scroll-into-view": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-2.0.4.tgz", - "integrity": "sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==" + "integrity": "sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6784,7 +6530,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", @@ -6797,12 +6544,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -6810,11 +6558,12 @@ } }, "node_modules/core-js-pure": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", - "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz", + "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -6825,6 +6574,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6837,19 +6587,21 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "dev": true, + "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6863,6 +6615,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-5.0.2.tgz", "integrity": "sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -6878,10 +6631,11 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -6890,6 +6644,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-5.0.2.tgz", "integrity": "sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==", + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.1", "postcss-selector-parser": "^6.0.10", @@ -6910,6 +6665,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-8.0.2.tgz", "integrity": "sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==", + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -6925,6 +6681,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6940,6 +6697,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -6952,6 +6710,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6963,7 +6722,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssdb": { "version": "7.11.2", @@ -6978,12 +6738,14 @@ "type": "github", "url": "https://github.com/sponsors/csstools" } - ] + ], + "license": "CC0-1.0" }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6995,6 +6757,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -7007,6 +6770,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -7019,13 +6783,15 @@ "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" }, "node_modules/cssstyle": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", "dev": true, + "license": "MIT", "dependencies": { "rrweb-cssom": "^0.6.0" }, @@ -7036,12 +6802,14 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -7082,6 +6850,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -7093,6 +6862,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7101,6 +6871,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7116,6 +6887,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -7127,6 +6899,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7135,6 +6908,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -7146,6 +6920,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -7157,6 +6932,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7165,6 +6941,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -7177,6 +6954,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -7197,21 +6975,11 @@ "node": ">=12" } }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -7220,6 +6988,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -7231,6 +7000,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -7244,6 +7014,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7252,6 +7023,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -7263,6 +7035,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7271,6 +7044,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -7282,6 +7056,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7290,6 +7065,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7298,6 +7074,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7306,6 +7083,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7314,6 +7092,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -7329,6 +7108,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -7341,6 +7121,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7349,6 +7130,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -7360,6 +7142,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -7371,6 +7154,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -7382,6 +7166,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7390,6 +7175,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -7408,6 +7194,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7423,13 +7210,15 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/data-urls": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -7440,14 +7229,15 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7457,29 +7247,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -7491,17 +7283,19 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7517,6 +7311,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7526,6 +7321,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -7542,6 +7338,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7550,21 +7347,24 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -7577,6 +7377,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -7585,13 +7386,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7609,6 +7412,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -7625,6 +7429,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" } @@ -7634,6 +7439,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -7643,26 +7449,43 @@ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -7671,6 +7494,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -7680,6 +7504,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7691,13 +7516,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7709,12 +7536,14 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -7733,7 +7562,8 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "4.0.0", @@ -7741,6 +7571,7 @@ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "deprecated": "Use your platform's native DOMException instead", "dev": true, + "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0" }, @@ -7752,6 +7583,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -7763,9 +7595,10 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -7779,6 +7612,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/downshift/-/downshift-7.6.2.tgz", "integrity": "sha512-iOv+E1Hyt3JDdL9yYcOgW7nZ7GQ2Uz6YbggwXvKUSleetYhU2nXD482Rz6CzvM4lvI1At34BYruKAL4swRGxaA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.8", "compute-scroll-into-view": "^2.0.4", @@ -7790,27 +7624,46 @@ "react": ">=16.12.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.752.tgz", - "integrity": "sha512-P3QJreYI/AUTcfBVrC4zy9KvnZWekViThgQMX/VpJ+IsOBbcX5JFpORM4qWapwWQ+agb2nYAOyn/4PMXOk0m2Q==" + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -7819,6 +7672,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -7831,6 +7685,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -7839,62 +7694,69 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -7904,13 +7766,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -7920,40 +7780,45 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -7962,14 +7827,16 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -7980,19 +7847,21 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -8007,6 +7876,7 @@ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -8039,9 +7909,10 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -8051,6 +7922,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8063,6 +7935,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -8080,16 +7953,18 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -8139,6 +8014,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -8167,6 +8043,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -8178,15 +8055,17 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -8204,6 +8083,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -8213,6 +8093,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" @@ -8227,34 +8108,37 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -8262,6 +8146,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -8271,6 +8156,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8283,6 +8169,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0" }, @@ -8303,65 +8190,76 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { @@ -8369,6 +8267,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8381,6 +8280,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8393,6 +8293,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -8410,6 +8311,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, @@ -8426,6 +8328,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -8442,6 +8345,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -8454,6 +8358,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -8469,6 +8374,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8481,6 +8387,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -8498,6 +8405,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8507,10 +8415,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -8523,6 +8432,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8535,6 +8445,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -8543,13 +8454,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -8559,6 +8472,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -8581,6 +8495,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -8596,19 +8511,21 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -8619,6 +8536,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -8630,46 +8548,74 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -8694,6 +8640,7 @@ "resolved": "https://registry.npmjs.org/filter-console/-/filter-console-0.1.1.tgz", "integrity": "sha512-zrXoV1Uaz52DqPs+qEwNJWJFAWZpYJ47UNmpN9q4j+/EYsz85uV0DC9k8tRND5kYmoVzL0W+Y75q4Rg8sRJCdg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8702,6 +8649,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8711,6 +8659,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8727,6 +8676,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -8737,25 +8687,28 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -8772,6 +8725,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -8780,10 +8734,11 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8797,6 +8752,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", "engines": { "node": "*" }, @@ -8808,13 +8764,16 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8828,20 +8787,24 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8855,6 +8818,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8864,6 +8828,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -8873,6 +8838,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8882,21 +8848,28 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8905,11 +8878,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8918,14 +8906,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -8938,7 +8927,9 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8958,6 +8949,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -8970,6 +8962,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -8979,6 +8972,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8991,6 +8985,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -9003,6 +8998,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -9017,6 +9013,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9029,6 +9026,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9038,6 +9036,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -9054,6 +9053,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9073,15 +9073,17 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9090,18 +9092,20 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", "dev": true, "license": "MIT", "engines": { @@ -9113,15 +9117,20 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9130,6 +9139,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -9139,6 +9149,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -9147,10 +9158,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -9159,10 +9174,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9175,6 +9191,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -9190,6 +9207,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -9204,25 +9222,11 @@ "dev": true, "license": "MIT" }, - "node_modules/highcharts": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-10.3.3.tgz", - "integrity": "sha512-r7wgUPQI9tr3jFDn3XT36qsNwEIZYcfgz4mkKEA6E4nn5p86y+u1EZjazIG4TRkl5/gmGRtkBUiZW81g029RIw==", - "peer": true - }, - "node_modules/highcharts-react-official": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/highcharts-react-official/-/highcharts-react-official-3.2.1.tgz", - "integrity": "sha512-hyQTX7ezCxl7JqumaWiGsroGWalzh24GedQIgO3vJbkGOZ6ySRAltIYjfxhrq4HszJOySZegotEF7v+haQ75UA==", - "peerDependencies": { - "highcharts": ">=6.0.0", - "react": ">=16.8.0" - } - }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.6" } @@ -9231,6 +9235,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -9238,13 +9243,15 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9257,6 +9264,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9268,13 +9276,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -9287,6 +9297,7 @@ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -9299,6 +9310,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -9313,6 +9325,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -9326,6 +9339,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -9339,25 +9353,40 @@ "node": ">=0.4" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9374,6 +9403,7 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9383,6 +9413,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -9392,6 +9423,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9400,6 +9432,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9408,23 +9442,26 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9434,18 +9471,21 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9458,15 +9498,20 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", + "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9476,12 +9521,16 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9491,6 +9540,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9499,13 +9550,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9519,6 +9571,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9527,23 +9580,30 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -9554,12 +9614,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9573,6 +9635,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -9587,17 +9650,23 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9608,17 +9677,22 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9631,30 +9705,21 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" + "is-extglob": "^2.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { + "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9679,12 +9744,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9698,6 +9765,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9707,6 +9775,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9716,6 +9785,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9725,6 +9795,7 @@ "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9736,25 +9807,30 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9768,6 +9844,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9776,12 +9853,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9795,6 +9873,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -9803,12 +9882,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9818,12 +9899,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9833,12 +9917,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -9852,6 +9937,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9860,25 +9946,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9892,6 +9983,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -9903,43 +9995,49 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/iserror": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==" + "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -9951,6 +10049,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -9965,6 +10064,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -9976,6 +10076,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -9988,12 +10089,14 @@ "node_modules/jest-diff/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -10002,6 +10105,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -10016,6 +10120,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -10027,6 +10132,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10039,12 +10145,14 @@ "node_modules/jest-matcher-utils/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -10064,6 +10172,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -10075,6 +10184,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10087,12 +10197,14 @@ "node_modules/jest-message-util/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -10105,11 +10217,24 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -10117,18 +10242,21 @@ "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10141,26 +10269,28 @@ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "xmlcreate": "^2.0.4" } }, "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -10179,6 +10309,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10188,6 +10319,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.2", @@ -10213,7 +10345,7 @@ "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^12.0.1", - "ws": "^8.17.1", + "ws": "^8.13.0", "xml-name-validator": "^4.0.0" }, "engines": { @@ -10229,46 +10361,52 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -10281,6 +10419,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -10296,6 +10435,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -10305,6 +10445,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10314,6 +10455,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.9" } @@ -10322,19 +10464,22 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, + "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -10347,6 +10492,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -10356,27 +10502,33 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, + "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/local-pkg": { @@ -10384,6 +10536,7 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -10396,6 +10549,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -10410,42 +10564,49 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -10458,6 +10619,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -10467,6 +10629,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -10476,20 +10639,19 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/map-obj": { @@ -10497,6 +10659,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10505,19 +10668,21 @@ } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-anchor": { @@ -10525,25 +10690,18 @@ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, + "license": "Unlicense", "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -10555,16 +10713,28 @@ "version": "6.3.4", "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.8", "remove-accents": "0.5.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10573,19 +10743,22 @@ "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -10612,6 +10785,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -10623,13 +10797,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -10638,6 +10814,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10646,16 +10823,30 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/microseconds": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10665,6 +10856,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -10677,6 +10869,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10686,6 +10879,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10694,6 +10888,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10706,6 +10901,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10715,6 +10911,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -10725,10 +10922,11 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10738,6 +10936,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -10746,46 +10945,55 @@ } }, "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" } }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true, + "license": "MIT" + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/msw": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.6.0.tgz", - "integrity": "sha512-n3tx2w0MZ3H4pxY0ozrQ4sNPzK/dGtlr2cIIyuEsgq2Bhy4wvcW6ZH2w/gXM9+MEUY6HC1fWhqtcXDxVZr5Jxw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.0.tgz", + "integrity": "sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.36.5", + "@mswjs/interceptors": "^0.37.0", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", "strict-event-emitter": "^0.5.1", "type-fest": "^4.26.1", "yargs": "^17.7.2" @@ -10809,14 +11017,14 @@ } }, "node_modules/msw/node_modules/@inquirer/confirm": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.1.tgz", - "integrity": "sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.3.tgz", + "integrity": "sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.0.1", - "@inquirer/type": "^3.0.0" + "@inquirer/core": "^10.1.4", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -10826,9 +11034,9 @@ } }, "node_modules/msw/node_modules/@inquirer/type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", - "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", + "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", "dev": true, "license": "MIT", "engines": { @@ -10839,14 +11047,14 @@ } }, "node_modules/msw/node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/msw/node_modules/path-to-regexp": { @@ -10871,6 +11079,7 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -10881,6 +11090,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "license": "ISC", "dependencies": { "big-integer": "^1.6.16" } @@ -10907,28 +11117,39 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10948,34 +11169,39 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -10986,26 +11212,12 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11013,16 +11225,12 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11031,14 +11239,15 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.0.tgz", - "integrity": "sha512-wh93uRczgp7HDnPMiLXcCkv2hagdJS0zJ9KT/31d0FoXP02+qgN2AOwpaW85fxRWkinl2rELfPw+CjBXW48/jQ==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.2.tgz", + "integrity": "sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -11110,75 +11319,83 @@ "write-file-atomic" ], "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.5.2", - "@npmcli/config": "^8.3.2", - "@npmcli/fs": "^3.1.1", - "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.2", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "@sigstore/tuf": "^2.3.3", - "abbrev": "^2.0.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/config": "^9.0.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/map-workspaces": "^4.0.2", + "@npmcli/package-json": "^6.1.0", + "@npmcli/promise-spawn": "^8.0.2", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "@sigstore/tuf": "^3.0.0", + "abbrev": "^3.0.0", "archy": "~1.0.0", - "cacache": "^18.0.3", + "cacache": "^19.0.1", "chalk": "^5.3.0", - "ci-info": "^4.0.0", + "ci-info": "^4.1.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.3.15", + "glob": "^10.4.5", "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.2", - "ini": "^4.1.2", - "init-package-json": "^6.0.3", - "is-cidr": "^5.0.5", - "json-parse-even-better-errors": "^3.0.2", - "libnpmaccess": "^8.0.6", - "libnpmdiff": "^6.1.2", - "libnpmexec": "^8.1.1", - "libnpmfund": "^5.0.10", - "libnpmhook": "^10.0.5", - "libnpmorg": "^6.0.6", - "libnpmpack": "^7.0.2", - "libnpmpublish": "^9.0.8", - "libnpmsearch": "^7.0.5", - "libnpmteam": "^6.0.5", - "libnpmversion": "^6.0.2", - "make-fetch-happen": "^13.0.1", - "minimatch": "^9.0.4", + "hosted-git-info": "^8.0.2", + "ini": "^5.0.0", + "init-package-json": "^7.0.2", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^4.0.0", + "libnpmaccess": "^9.0.0", + "libnpmdiff": "^7.0.0", + "libnpmexec": "^9.0.0", + "libnpmfund": "^6.0.0", + "libnpmhook": "^11.0.0", + "libnpmorg": "^7.0.0", + "libnpmpack": "^8.0.0", + "libnpmpublish": "^10.0.1", + "libnpmsearch": "^8.0.0", + "libnpmteam": "^7.0.0", + "libnpmversion": "^7.0.0", + "make-fetch-happen": "^14.0.3", + "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.1.0", - "nopt": "^7.2.1", - "normalize-package-data": "^6.0.1", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-profile": "^10.0.0", - "npm-registry-fetch": "^17.0.1", - "npm-user-validate": "^2.0.1", + "node-gyp": "^11.0.0", + "nopt": "^8.0.0", + "normalize-package-data": "^7.0.0", + "npm-audit-report": "^6.0.0", + "npm-install-checks": "^7.1.1", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-profile": "^11.0.1", + "npm-registry-fetch": "^18.0.2", + "npm-user-validate": "^3.0.0", "p-map": "^4.0.0", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^4.2.0", + "pacote": "^19.0.1", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", - "read": "^3.0.1", - "semver": "^7.6.2", + "read": "^4.0.0", + "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.1", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" + "validate-npm-package-name": "^6.0.0", + "which": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", @@ -11193,6 +11410,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -11218,7 +11436,7 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -11267,6 +11485,18 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, @@ -11274,7 +11504,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.2", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -11286,48 +11516,48 @@ "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.2", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, @@ -11335,30 +11565,30 @@ "arborist": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.2", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", - "read-package-json-fast": "^3.0.2", + "ini": "^5.0.0", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -11366,159 +11596,191 @@ "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.7", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^20.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { + "version": "20.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.1.0", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "normalize-package-data": "^7.0.0", + "proc-log": "^5.0.0", "semver": "^7.5.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.1.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.1.0", + "version": "9.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@pkgjs/parseargs": { @@ -11531,27 +11793,6 @@ "node": ">=14" } }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.3.2", "dev": true, @@ -11561,48 +11802,17 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.0", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.3", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.1" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@tufjs/canonical-json": { @@ -11614,26 +11824,13 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/agent-base": { @@ -11701,62 +11898,138 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.4", + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "19.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.3.0", + "node_modules/npm/node_modules/cacache/node_modules/p-map": { + "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/npm/node_modules/cacache/node_modules/tar": { + "version": "7.4.3", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/npm/node_modules/cacache": { - "version": "18.0.3", + "node_modules/npm/node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18" } }, "node_modules/npm/node_modules/chalk": { @@ -11781,7 +12054,7 @@ } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", + "version": "4.1.0", "dev": true, "funding": [ { @@ -11796,7 +12069,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.5", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -11830,12 +12103,12 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.3", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/color-convert": { @@ -11863,7 +12136,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", "dev": true, "inBundle": true, "license": "MIT", @@ -11904,12 +12177,12 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.4", + "version": "4.3.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -11920,12 +12193,6 @@ } } }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.2.0", "dev": true, @@ -11988,7 +12255,7 @@ } }, "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12015,33 +12282,22 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/glob": { - "version": "10.3.15", + "version": "10.4.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -12052,20 +12308,8 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.2", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -12073,7 +12317,7 @@ "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { @@ -12096,7 +12340,7 @@ } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.4", + "version": "7.0.5", "dev": true, "inBundle": true, "license": "MIT", @@ -12122,7 +12366,7 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.5", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12130,7 +12374,7 @@ "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/imurmurhash": { @@ -12152,30 +12396,30 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.2", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.3", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", + "@npmcli/package-json": "^6.0.0", + "npm-package-arg": "^12.0.0", + "promzard": "^2.0.0", + "read": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/ip-address": { @@ -12204,29 +12448,17 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.5", + "version": "5.1.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^4.0.4" + "cidr-regex": "^4.1.1" }, "engines": { "node": ">=14" } }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -12236,12 +12468,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "dev": true, @@ -12249,16 +12475,13 @@ "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.4.3", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -12273,12 +12496,12 @@ "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -12312,205 +12535,210 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.6", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.2", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.2", - "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", "tar": "^6.2.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "8.1.1", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.2", - "@npmcli/run-script": "^8.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", - "proc-log": "^4.2.0", - "read": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", + "read": "^4.0.0", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.10", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.2" + "@npmcli/arborist": "^8.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.5", + "version": "11.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.6", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.2", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.2", - "@npmcli/run-script": "^8.1.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6" + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.8", + "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", + "normalize-package-data": "^7.0.0", + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1", + "proc-log": "^5.0.0", "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.6" + "sigstore": "^3.0.0", + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.5", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.5", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.2", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.7", - "@npmcli/run-script": "^8.1.0", - "json-parse-even-better-errors": "^3.0.2", - "proc-log": "^4.2.0", + "@npmcli/git": "^6.0.1", + "@npmcli/run-script": "^9.0.1", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.2", + "version": "10.4.3", "dev": true, "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.1", + "version": "14.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.4", + "version": "9.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -12525,7 +12753,7 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "7.1.1", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "ISC", @@ -12546,57 +12774,48 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.5", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": { + "version": "3.0.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 8" + "node": ">= 18" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "node": ">= 8" } }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, @@ -12700,25 +12919,16 @@ "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/node-gyp": { - "version": "10.1.0", + "version": "11.0.0", "dev": true, "inBundle": true, "license": "MIT", @@ -12727,31 +12937,85 @@ "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" + "tar": "^7.4.3", + "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/tar": { + "version": "7.4.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, "node_modules/npm/node_modules/nopt": { - "version": "7.2.1", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12761,48 +13025,56 @@ "bin": { "nopt": "bin/nopt.js" }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/nopt/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.1", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", + "hosted-git-info": "^8.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -12810,99 +13082,112 @@ "semver": "^7.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.2", + "version": "12.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.4" + "ignore-walk": "^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.1", + "version": "10.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-profile": { - "version": "10.0.0", + "version": "11.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.0.0" + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "17.0.1", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^2.0.0", - "make-fetch-happen": "^13.0.0", + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.1", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/p-map": { @@ -12920,49 +13205,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0" + }, "node_modules/npm/node_modules/pacote": { - "version": "18.0.6", + "version": "19.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^4.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/path-key": { @@ -12991,7 +13282,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.16", + "version": "6.1.2", "dev": true, "inBundle": true, "license": "MIT", @@ -13004,21 +13295,21 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "4.2.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/proggy": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -13031,7 +13322,7 @@ } }, "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.1", + "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -13059,15 +13350,15 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.2", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "read": "^3.0.1" + "read": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/qrcode-terminal": { @@ -13079,37 +13370,37 @@ } }, "node_modules/npm/node_modules/read": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "^1.0.0" + "mute-stream": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/retry": { @@ -13121,6 +13412,21 @@ "node": ">= 4" } }, + "node_modules/npm/node_modules/rimraf": { + "version": "5.0.10", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -13129,7 +13435,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.6.2", + "version": "7.6.3", "dev": true, "inBundle": true, "license": "ISC", @@ -13174,20 +13480,72 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.3.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.3.1", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "@sigstore/sign": "^2.3.0", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.2.0" + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^3.0.0", + "@sigstore/tuf": "^3.0.0", + "@sigstore/verify": "^2.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^14.0.1", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/smart-buffer": { @@ -13215,14 +13573,14 @@ } }, "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.3", + "version": "8.0.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -13265,7 +13623,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.17", + "version": "3.0.20", "dev": true, "inBundle": true, "license": "CC0-1.0" @@ -13277,7 +13635,7 @@ "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ssri": { - "version": "10.0.6", + "version": "12.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -13285,7 +13643,7 @@ "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/string-width": { @@ -13426,33 +13784,46 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.1", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "unique-slug": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -13460,7 +13831,7 @@ "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/util-deprecate": { @@ -13490,12 +13861,12 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.1", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/walk-up-path": { @@ -13505,7 +13876,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/which": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -13516,7 +13887,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/which/node_modules/isexe": { @@ -13579,7 +13950,7 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -13629,7 +14000,7 @@ } }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -13638,7 +14009,7 @@ "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/yallist": { @@ -13651,6 +14022,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -13659,15 +14031,17 @@ } }, "node_modules/nwsapi": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", - "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", - "dev": true + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13677,15 +14051,20 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13695,19 +14074,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -13722,6 +14105,7 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13736,6 +14120,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13754,6 +14139,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13763,30 +14149,15 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -13800,13 +14171,15 @@ "node_modules/oblivious-set": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", + "license": "MIT" }, "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13815,6 +14188,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -13824,6 +14198,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13839,6 +14214,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -13851,18 +14227,37 @@ "node": ">= 0.8.0" } }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -13878,6 +14273,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -13893,15 +14289,24 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13914,6 +14319,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13928,12 +14334,13 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -13944,6 +14351,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -13952,6 +14360,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13960,13 +14369,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true + "dev": true, + "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -13975,37 +14386,38 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", - "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", "engines": { "node": ">=16" } @@ -14015,6 +14427,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -14023,28 +14436,33 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -14055,6 +14473,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14064,34 +14483,44 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, + "license": "MIT", "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.6.1", - "pathe": "^1.1.2" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true, + "license": "MIT" + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "funding": [ { "type": "opencollective", @@ -14106,10 +14535,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14129,6 +14559,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -14143,6 +14574,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14167,6 +14599,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^2.3.0", "postcss-value-parser": "^4.2.0" @@ -14192,6 +14625,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -14207,6 +14641,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-8.0.2.tgz", "integrity": "sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14235,6 +14670,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/cascade-layer-name-parser": "^1.0.2", "@csstools/css-parser-algorithms": "^2.2.0", @@ -14249,9 +14685,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "13.3.8", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.8.tgz", - "integrity": "sha512-OP9yj4yXxYOiW2n2TRpnE7C0yePvBiZb72S22mZVNzZEObdTYFjNaX6oZO4R4E8Ie9RmC/Jxw8EKYSbLrC1EFA==", + "version": "13.3.12", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.12.tgz", + "integrity": "sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==", "funding": [ { "type": "github", @@ -14262,10 +14698,11 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/cascade-layer-name-parser": "^1.0.13", + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -14277,9 +14714,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz", - "integrity": "sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.12.tgz", + "integrity": "sha512-ctIoprBMJwByYMGjXG0F7IT2iMF2hnamQ+aWZETyBM0aAlyaYdVZTeUkk8RB+9h9wP+NdN3f01lfvKl2ZSqC0g==", "funding": [ { "type": "github", @@ -14290,11 +14727,12 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "postcss-selector-parser": "^6.0.13" + "@csstools/cascade-layer-name-parser": "^1.0.13", + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1", + "postcss-selector-parser": "^6.1.0" }, "engines": { "node": "^14 || ^16 || >=18" @@ -14307,6 +14745,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-7.0.2.tgz", "integrity": "sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14335,6 +14774,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^2.3.0", "postcss-value-parser": "^4.2.0" @@ -14350,6 +14790,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", "peerDependencies": { "postcss": "^8.1.4" } @@ -14358,6 +14799,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-8.0.2.tgz", "integrity": "sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14376,6 +14818,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-7.0.2.tgz", "integrity": "sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14394,6 +14837,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } @@ -14402,6 +14846,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-4.0.1.tgz", "integrity": "sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==", + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -14417,6 +14862,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-5.0.2.tgz", "integrity": "sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14436,6 +14882,7 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -14452,6 +14899,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } @@ -14461,6 +14909,7 @@ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, + "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -14489,6 +14938,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", @@ -14517,6 +14967,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -14537,23 +14988,12 @@ } } }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -14575,6 +15015,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14589,23 +15030,31 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } @@ -14624,6 +15073,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -14649,6 +15099,7 @@ "url": "https://liberapay.com/mrcgrtz" } ], + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18" }, @@ -14660,6 +15111,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-4.0.1.tgz", "integrity": "sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14678,6 +15130,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", "peerDependencies": { "postcss": "^8" } @@ -14686,6 +15139,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-8.0.1.tgz", "integrity": "sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==", + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14714,6 +15168,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^3.0.1", "@csstools/postcss-color-function": "^2.2.3", @@ -14783,6 +15238,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-8.0.2.tgz", "integrity": "sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==", + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14801,21 +15257,24 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" }, @@ -14846,6 +15305,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=12.0" }, @@ -14867,6 +15327,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.13" }, @@ -14878,9 +15339,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14892,13 +15354,15 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -14908,6 +15372,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -14923,6 +15388,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -14937,6 +15403,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14948,6 +15415,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -14957,14 +15425,16 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "dev": true, "hasInstallScript": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -14985,10 +15455,11 @@ } }, "node_modules/protobufjs-cli": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.2.tgz", - "integrity": "sha512-8ivXWxT39gZN4mm4ArQyJrRgnIwZqffBWoLDsE21TmMcKI3XwJMV4lEF2WU02C4JAtgYYc2SfJIltelD8to35g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.3.tgz", + "integrity": "sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "chalk": "^4.0.0", "escodegen": "^1.13.0", @@ -15017,6 +15488,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -15039,6 +15511,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -15048,6 +15521,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -15056,23 +15530,12 @@ "node": ">= 0.8.0" } }, - "node_modules/protobufjs-cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/protobufjs-cli/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -15095,13 +15558,11 @@ } }, "node_modules/protobufjs-cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -15109,20 +15570,12 @@ "node": ">=10" } }, - "node_modules/protobufjs-cli/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, "node_modules/protobufjs-cli/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -15130,37 +15583,54 @@ "node": ">= 0.8.0" } }, - "node_modules/protobufjs-cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -15178,7 +15648,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -15198,13 +15669,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15214,6 +15687,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15223,6 +15697,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15238,6 +15713,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15246,6 +15722,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -15270,6 +15747,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -15284,6 +15762,7 @@ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -15300,6 +15779,7 @@ "resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-10.3.17.tgz", "integrity": "sha512-bywiqVErlh5kCDqw3x0an5Ur3mT9j9CwJsDwmhmz4i1IgYM1a0SPqqEhClvjX+s5pU4nHjmVaGXWK96pwsiGcQ==", "deprecated": "react-flow-renderer has been renamed to reactflow, please use this package from now on https://reactflow.dev/docs/guides/migrate-to-v11/", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.9", "@types/d3": "^7.4.0", @@ -15321,7 +15801,8 @@ "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-json-tree": { "version": "0.19.0", @@ -15341,6 +15822,7 @@ "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.5.5", "broadcast-channel": "^3.4.1", @@ -15367,6 +15849,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15375,12 +15858,13 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "path-to-regexp": "^1.9.0", + "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", @@ -15394,6 +15878,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -15411,6 +15896,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -15424,6 +15910,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", @@ -15436,12 +15923,14 @@ "node_modules/react-router/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" }, "node_modules/react-router/node_modules/path-to-regexp": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -15449,12 +15938,14 @@ "node_modules/react-router/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-tiny-popover": { "version": "6.0.10", "resolved": "https://registry.npmjs.org/react-tiny-popover/-/react-tiny-popover-6.0.10.tgz", "integrity": "sha512-ECMucd701SxWHGa+2YuVvccCxxTjmhomcD0ZYTF+Qmi5qNAj8pdlExFN+k+p1G78QTYIGPGNLocxRb9f6cZ0Mw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -15464,6 +15955,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz", "integrity": "sha512-Pg2Ju7NngAamarFvLwqrFomJ57u/Ay6i6zfLurt/qPynWkAkOthu6vxfqYpJCyNhHRhR4hu7+bySSeWWJu6PAg==", + "license": "MIT", "dependencies": { "clsx": "^1.1.1" }, @@ -15477,6 +15969,7 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -15486,6 +15979,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -15501,6 +15995,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -15518,6 +16013,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -15531,6 +16027,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -15543,6 +16040,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -15558,6 +16056,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -15570,6 +16069,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -15578,13 +16078,15 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -15597,6 +16099,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -15606,19 +16109,22 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/redent": { @@ -15626,6 +16132,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -15635,18 +16142,20 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -15659,13 +16168,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -15676,27 +16187,32 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -15706,15 +16222,16 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -15727,6 +16244,7 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, + "license": "MIT", "dependencies": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -15737,6 +16255,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", "dev": true, + "license": "MIT", "dependencies": { "rc": "^1.0.1" }, @@ -15744,37 +16263,51 @@ "node": ">=0.10.0" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15784,6 +16317,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15792,30 +16326,36 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.21" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15825,6 +16365,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -15832,13 +16373,15 @@ "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -15848,6 +16391,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -15862,6 +16407,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15880,7 +16427,8 @@ "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" }, "node_modules/rollup": { "version": "3.29.5", @@ -15903,7 +16451,8 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -15924,6 +16473,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -15931,17 +16481,20 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -15955,17 +16508,36 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -15977,15 +16549,17 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sass": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", - "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -15993,6 +16567,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/saxes": { @@ -16000,6 +16577,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -16011,6 +16589,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -16021,15 +16600,17 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/serve": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.3.tgz", - "integrity": "sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", + "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", "dev": true, + "license": "MIT", "dependencies": { "@zeit/schemas": "2.36.0", "ajv": "8.12.0", @@ -16040,7 +16621,7 @@ "clipboardy": "3.0.0", "compression": "1.7.4", "is-port-reachable": "4.0.0", - "serve-handler": "6.1.5", + "serve-handler": "6.1.6", "update-check": "1.5.4" }, "bin": { @@ -16051,18 +16632,18 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "^3.3.0", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, @@ -16071,6 +16652,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -16080,6 +16662,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "~1.33.0" }, @@ -16091,13 +16674,15 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve/node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16114,6 +16699,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -16125,13 +16711,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16149,6 +16737,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -16159,11 +16748,27 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -16176,20 +16781,79 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -16202,13 +16866,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-swizzle": { "version": "0.2.2", @@ -16229,6 +16895,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -16238,6 +16905,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -16255,14 +16923,16 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16272,6 +16942,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -16281,28 +16952,32 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16311,6 +16986,7 @@ "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } @@ -16319,6 +16995,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -16330,6 +17007,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -16338,12 +17016,14 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", @@ -16356,10 +17036,11 @@ } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" }, "node_modules/strict-event-emitter": { "version": "0.5.1", @@ -16372,6 +17053,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -16380,20 +17062,25 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -16402,6 +17089,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16415,32 +17103,73 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -16449,16 +17178,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16468,15 +17212,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16486,6 +17235,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -16503,6 +17253,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16516,6 +17267,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16528,6 +17280,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -16537,6 +17290,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -16546,6 +17300,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -16558,6 +17313,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -16570,6 +17326,7 @@ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.10.0" }, @@ -16581,13 +17338,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/stylelint": { "version": "14.16.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", "dev": true, + "license": "MIT", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "balanced-match": "^2.0.0", @@ -16644,6 +17403,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-9.0.5.tgz", "integrity": "sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==", "dev": true, + "license": "MIT", "bin": { "stylelint-config-prettier": "bin/check.js", "stylelint-config-prettier-check": "bin/check.js" @@ -16660,6 +17420,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz", "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==", "dev": true, + "license": "MIT", "peerDependencies": { "stylelint": "^14.0.0" } @@ -16669,6 +17430,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz", "integrity": "sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-scss": "^4.0.2", "stylelint-config-recommended": "^6.0.0", @@ -16683,6 +17445,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-24.0.0.tgz", "integrity": "sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw==", "dev": true, + "license": "MIT", "dependencies": { "stylelint-config-recommended": "^6.0.0" }, @@ -16695,6 +17458,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-3.0.0.tgz", "integrity": "sha512-zt3ZbzIbllN1iCmc94e4pDxqpkzeR6CJo5DDXzltshuXr+82B8ylHyMMARNnUYrZH80B7wgY7UkKTYCFM0UUyw==", "dev": true, + "license": "MIT", "dependencies": { "stylelint-config-recommended-scss": "^5.0.2", "stylelint-config-standard": "^24.0.0" @@ -16708,6 +17472,7 @@ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", @@ -16722,13 +17487,37 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } @@ -16738,6 +17527,7 @@ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -16760,6 +17550,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -16769,37 +17560,38 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -16814,6 +17606,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -16826,6 +17619,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -16839,6 +17633,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -16850,7 +17645,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/svg-tags": { "version": "1.0.0", @@ -16859,9 +17655,10 @@ "dev": true }, "node_modules/svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -16886,13 +17683,15 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -16905,55 +17704,80 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "dev": true, + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.3.0", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", @@ -16963,17 +17787,83 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -16983,6 +17873,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -16993,24 +17884,28 @@ "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" }, "node_modules/tinypool": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -17020,17 +17915,19 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -17050,6 +17947,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17060,20 +17958,12 @@ "node": ">=6" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.3.0" }, @@ -17081,20 +17971,12 @@ "node": ">=14" } }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -17103,13 +17985,15 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -17122,6 +18006,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -17130,15 +18015,17 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -17153,13 +18040,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -17168,18 +18057,19 @@ } }, "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -17190,30 +18080,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -17223,17 +18115,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -17243,17 +18137,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -17263,10 +18158,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17276,22 +18172,25 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" }, "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true, + "license": "MIT" }, "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -17300,39 +18199,45 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true, "license": "MIT", "peer": true }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17342,6 +18247,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -17351,10 +18257,11 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17364,6 +18271,7 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17373,6 +18281,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -17381,15 +18290,16 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.6.2", "detect-node": "^2.0.4" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "funding": [ { "type": "opencollective", @@ -17404,9 +18314,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17420,6 +18331,7 @@ "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", "dev": true, + "license": "MIT", "dependencies": { "registry-auth-token": "3.3.2", "registry-url": "3.1.0" @@ -17430,24 +18342,17 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -17456,19 +18361,22 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/v8-compile-cache": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -17477,27 +18385,29 @@ "node_modules/value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz", + "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", - "rollup": "^3.29.5" + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -17549,13 +18459,14 @@ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", "mlly": "^1.1.0", "pathe": "^1.1.0", "picocolors": "^1.0.0", - "vite": "^4.5.4" + "vite": "^3.0.0 || ^4.0.0" }, "bin": { "vite-node": "vite-node.mjs" @@ -17572,14 +18483,15 @@ "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^4.2.1", "@types/eslint": "^8.4.5", - "rollup": "^3.29.5" + "rollup": "^2.77.2" }, "peerDependencies": { "eslint": ">=7", - "vite": ">=4.5.4" + "vite": ">=2" } }, "node_modules/vite-plugin-eslint/node_modules/@rollup/pluginutils": { @@ -17587,6 +18499,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, + "license": "MIT", "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" @@ -17595,17 +18508,47 @@ "node": ">= 8.0.0" } }, + "node_modules/vite-plugin-eslint/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-eslint/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/vite-plugin-svgr": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.2", "@svgr/core": "^6.5.1" }, "peerDependencies": { - "vite": "^4.5.4" + "vite": "^2.6.0 || 3 || 4" } }, "node_modules/vitest": { @@ -17613,6 +18556,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "^4.3.4", "@types/chai-subset": "^1.3.3", @@ -17635,7 +18579,7 @@ "tinybench": "^2.3.1", "tinypool": "^0.4.0", "tinyspy": "^1.0.2", - "vite": "^4.5.4", + "vite": "^3.0.0 || ^4.0.0", "vite-node": "0.29.8", "why-is-node-running": "^2.2.2" }, @@ -17690,6 +18634,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^4.0.0" }, @@ -17700,13 +18645,15 @@ "node_modules/web-vitals": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==" + "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -17716,6 +18663,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -17723,23 +18671,12 @@ "node": ">=12" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -17749,6 +18686,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" @@ -17762,6 +18700,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -17773,39 +18712,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -17819,6 +18764,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -17833,15 +18779,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -17852,10 +18800,11 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -17872,6 +18821,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -17882,102 +18832,129 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -17991,6 +18968,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18012,6 +18990,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } @@ -18020,19 +18999,22 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -18041,13 +19023,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } @@ -18057,6 +19041,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -18075,15 +19060,39 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -18093,6 +19102,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18117,6 +19127,7 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", "engines": { "node": ">=12.7.0" }, diff --git a/web/vtadmin/package.json b/web/vtadmin/package.json index 3d850fd1cc9..be7b819ede9 100644 --- a/web/vtadmin/package.json +++ b/web/vtadmin/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "engines": { - "node": ">=20.12.0", - "npm": ">=10.5.0" + "node": ">=22.13.0", + "npm": ">=10.9.2" }, "dependencies": { "@bugsnag/js": "^7.20.0", @@ -17,7 +17,6 @@ "d3": "^7.9.0", "dayjs": "^1.11.7", "downshift": "^7.2.0", - "highcharts-react-official": "^3.1.0", "history": "^5.3.0", "lodash-es": "^4.17.21", "path-to-regexp": "^8.1.0", @@ -75,7 +74,7 @@ ] }, "devDependencies": { - "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-commonjs": "^28.0.2", "@testing-library/jest-dom": "^5.11.9", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^5.0.3", @@ -91,17 +90,17 @@ "i": "^0.3.7", "jsdom": "^21.1.1", "msw": "^2.5.2", - "npm": "^10.8.0", + "npm": "^10.9.2", "postcss": "^8.4.31", "prettier": "^2.2.1", - "protobufjs-cli": "^1.1.1", + "protobufjs-cli": "^1.1.3", "serve": "^14.2.0", "stylelint": "^14.4.0", "stylelint-config-prettier": "^9.0.3", "stylelint-config-standard-scss": "^3.0.0", "tailwindcss": "^3.0.18", "typescript": "^5.0.2", - "vite": "^4.5.3", + "vite": "^4.5.6", "vite-plugin-eslint": "^1.8.1", "vite-plugin-svgr": "^2.4.0", "vitest": "^0.29.8" diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 5546bff75ad..4411c436083 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -31327,9 +31327,6 @@ export namespace tabletmanagerdata { /** BackupRequest backup_engine. */ public backup_engine?: (string|null); - /** BackupRequest _backup_engine. */ - public _backup_engine?: "backup_engine"; - /** * Creates a new BackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -33948,9 +33945,6 @@ export namespace tabletmanagerdata { /** VDiffCoreOptions auto_start. */ public auto_start?: (boolean|null); - /** VDiffCoreOptions _auto_start. */ - public _auto_start?: "auto_start"; - /** * Creates a new VDiffCoreOptions instance using the specified properties. * @param [properties] Properties to set @@ -34163,9 +34157,6 @@ export namespace tabletmanagerdata { /** VDiffTableLastPK source. */ public source?: (query.IQueryResult|null); - /** VDiffTableLastPK _source. */ - public _source?: "source"; - /** * Creates a new VDiffTableLastPK instance using the specified properties. * @param [properties] Properties to set @@ -34311,18 +34302,6 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest message. */ public message?: (string|null); - /** UpdateVReplicationWorkflowRequest _tablet_selection_preference. */ - public _tablet_selection_preference?: "tablet_selection_preference"; - - /** UpdateVReplicationWorkflowRequest _on_ddl. */ - public _on_ddl?: "on_ddl"; - - /** UpdateVReplicationWorkflowRequest _state. */ - public _state?: "state"; - - /** UpdateVReplicationWorkflowRequest _message. */ - public _message?: "message"; - /** * Creates a new UpdateVReplicationWorkflowRequest instance using the specified properties. * @param [properties] Properties to set @@ -34547,15 +34526,6 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowsRequest stop_position. */ public stop_position?: (string|null); - /** UpdateVReplicationWorkflowsRequest _state. */ - public _state?: "state"; - - /** UpdateVReplicationWorkflowsRequest _message. */ - public _message?: "message"; - - /** UpdateVReplicationWorkflowsRequest _stop_position. */ - public _stop_position?: "stop_position"; - /** * Creates a new UpdateVReplicationWorkflowsRequest instance using the specified properties. * @param [properties] Properties to set @@ -49746,9 +49716,6 @@ export namespace vschema { /** Column values. */ public values: string[]; - /** Column _nullable. */ - public _nullable?: "nullable"; - /** * Creates a new Column instance using the specified properties. * @param [properties] Properties to set @@ -54418,9 +54385,6 @@ export namespace vtctldata { /** BackupRequest backup_engine. */ public backup_engine?: (string|null); - /** BackupRequest _backup_engine. */ - public _backup_engine?: "backup_engine"; - /** * Creates a new BackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -77810,9 +77774,6 @@ export namespace vtctldata { /** VDiffCreateRequest auto_start. */ public auto_start?: (boolean|null); - /** VDiffCreateRequest _auto_start. */ - public _auto_start?: "auto_start"; - /** * Creates a new VDiffCreateRequest instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 9d545745a83..457ae6e4214 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -71242,12 +71242,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * BackupRequest _backup_engine. - * @member {"backup_engine"|undefined} _backup_engine - * @memberof tabletmanagerdata.BackupRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(BackupRequest.prototype, "_backup_engine", { get: $util.oneOfGetter($oneOfFields = ["backup_engine"]), set: $util.oneOfSetter($oneOfFields) @@ -78250,12 +78245,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * VDiffCoreOptions _auto_start. - * @member {"auto_start"|undefined} _auto_start - * @memberof tabletmanagerdata.VDiffCoreOptions - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(VDiffCoreOptions.prototype, "_auto_start", { get: $util.oneOfGetter($oneOfFields = ["auto_start"]), set: $util.oneOfSetter($oneOfFields) @@ -78943,12 +78933,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * VDiffTableLastPK _source. - * @member {"source"|undefined} _source - * @memberof tabletmanagerdata.VDiffTableLastPK - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(VDiffTableLastPK.prototype, "_source", { get: $util.oneOfGetter($oneOfFields = ["source"]), set: $util.oneOfSetter($oneOfFields) @@ -79266,45 +79251,25 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * UpdateVReplicationWorkflowRequest _tablet_selection_preference. - * @member {"tablet_selection_preference"|undefined} _tablet_selection_preference - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_tablet_selection_preference", { get: $util.oneOfGetter($oneOfFields = ["tablet_selection_preference"]), set: $util.oneOfSetter($oneOfFields) }); - /** - * UpdateVReplicationWorkflowRequest _on_ddl. - * @member {"on_ddl"|undefined} _on_ddl - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_on_ddl", { get: $util.oneOfGetter($oneOfFields = ["on_ddl"]), set: $util.oneOfSetter($oneOfFields) }); - /** - * UpdateVReplicationWorkflowRequest _state. - * @member {"state"|undefined} _state - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_state", { get: $util.oneOfGetter($oneOfFields = ["state"]), set: $util.oneOfSetter($oneOfFields) }); - /** - * UpdateVReplicationWorkflowRequest _message. - * @member {"message"|undefined} _message - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_message", { get: $util.oneOfGetter($oneOfFields = ["message"]), set: $util.oneOfSetter($oneOfFields) @@ -80151,34 +80116,19 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * UpdateVReplicationWorkflowsRequest _state. - * @member {"state"|undefined} _state - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_state", { get: $util.oneOfGetter($oneOfFields = ["state"]), set: $util.oneOfSetter($oneOfFields) }); - /** - * UpdateVReplicationWorkflowsRequest _message. - * @member {"message"|undefined} _message - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_message", { get: $util.oneOfGetter($oneOfFields = ["message"]), set: $util.oneOfSetter($oneOfFields) }); - /** - * UpdateVReplicationWorkflowsRequest _stop_position. - * @member {"stop_position"|undefined} _stop_position - * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_stop_position", { get: $util.oneOfGetter($oneOfFields = ["stop_position"]), set: $util.oneOfSetter($oneOfFields) @@ -121486,12 +121436,7 @@ export const vschema = $root.vschema = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * Column _nullable. - * @member {"nullable"|undefined} _nullable - * @memberof vschema.Column - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(Column.prototype, "_nullable", { get: $util.oneOfGetter($oneOfFields = ["nullable"]), set: $util.oneOfSetter($oneOfFields) @@ -134466,12 +134411,7 @@ export const vtctldata = $root.vtctldata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * BackupRequest _backup_engine. - * @member {"backup_engine"|undefined} _backup_engine - * @memberof vtctldata.BackupRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(BackupRequest.prototype, "_backup_engine", { get: $util.oneOfGetter($oneOfFields = ["backup_engine"]), set: $util.oneOfSetter($oneOfFields) @@ -189643,12 +189583,7 @@ export const vtctldata = $root.vtctldata = (() => { // OneOf field names bound to virtual getters and setters let $oneOfFields; - /** - * VDiffCreateRequest _auto_start. - * @member {"auto_start"|undefined} _auto_start - * @memberof vtctldata.VDiffCreateRequest - * @instance - */ + // Virtual OneOf for proto3 optional field Object.defineProperty(VDiffCreateRequest.prototype, "_auto_start", { get: $util.oneOfGetter($oneOfFields = ["auto_start"]), set: $util.oneOfSetter($oneOfFields) From 43e6089d6124a04a1c9d178552a711075338191f Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 23 Jan 2025 21:13:12 +0530 Subject: [PATCH 65/66] Reduce VTGate Normalizer multiple AST walks (#17619) Signed-off-by: Harshit Gangal --- go/vt/sqlparser/normalizer.go | 93 ++++++++++------------------------- 1 file changed, 27 insertions(+), 66 deletions(-) diff --git a/go/vt/sqlparser/normalizer.go b/go/vt/sqlparser/normalizer.go index 48311a39a7a..02cb11e2a97 100644 --- a/go/vt/sqlparser/normalizer.go +++ b/go/vt/sqlparser/normalizer.go @@ -48,7 +48,8 @@ type normalizer struct { reserved *ReservedVars vals map[Literal]string err error - inDerived bool + inDerived int + inSelect int } func newNormalizer(reserved *ReservedVars, bindVars map[string]*querypb.BindVariable) *normalizer { @@ -64,30 +65,43 @@ func (nz *normalizer) walkStatementUp(cursor *Cursor) bool { if nz.err != nil { return false } - node, isLiteral := cursor.Node().(*Literal) - if !isLiteral { - return true + switch node := cursor.node.(type) { + case *DerivedTable: + nz.inDerived-- + case *Select: + nz.inSelect-- + case *Literal: + if nz.inSelect == 0 { + nz.convertLiteral(node, cursor) + return nz.err == nil + } + parent := cursor.Parent() + switch parent.(type) { + case *Order, *GroupBy: + return true + case *Limit: + nz.convertLiteral(node, cursor) + default: + nz.convertLiteralDedup(node, cursor) + } } - nz.convertLiteral(node, cursor) return nz.err == nil // only continue if we haven't found any errors } // walkStatementDown is the top level walk function. // If it encounters a Select, it switches to a mode // where variables are deduped. -func (nz *normalizer) walkStatementDown(node, parent SQLNode) bool { +func (nz *normalizer) walkStatementDown(node, _ SQLNode) bool { switch node := node.(type) { // no need to normalize the statement types case *Set, *Show, *Begin, *Commit, *Rollback, *Savepoint, DDLStatement, *SRollback, *Release, *OtherAdmin, *Analyze: return false + case *DerivedTable: + nz.inDerived++ case *Select: - _, isDerived := parent.(*DerivedTable) - var tmp bool - tmp, nz.inDerived = nz.inDerived, isDerived - _ = SafeRewrite(node, nz.walkDownSelect, nz.walkUpSelect) - // Don't continue - nz.inDerived = tmp - return false + nz.inSelect++ + case SelectExprs: + return nz.inDerived == 0 case *ComparisonExpr: nz.convertComparison(node) case *UpdateExpr: @@ -98,62 +112,9 @@ func (nz *normalizer) walkStatementDown(node, parent SQLNode) bool { return false case *ConvertType: // we should not rewrite the type description return false - } - return nz.err == nil // only continue if we haven't found any errors -} - -// walkDownSelect normalizes the AST in Select mode. -func (nz *normalizer) walkDownSelect(node, parent SQLNode) bool { - switch node := node.(type) { - case *Select: - _, isDerived := parent.(*DerivedTable) - if !isDerived { - return true - } - var tmp bool - tmp, nz.inDerived = nz.inDerived, isDerived - // initiating a new AST walk here means that we might change something while walking down on the tree, - // but since we are only changing literals, we can be safe that we are not changing the SELECT struct, - // only something much further down, and that should be safe - _ = SafeRewrite(node, nz.walkDownSelect, nz.walkUpSelect) - // Don't continue - nz.inDerived = tmp - return false - case SelectExprs: - return !nz.inDerived - case *ComparisonExpr: - nz.convertComparison(node) case *FramePoint: // do not make a bind var for rows and range return false - case *ColName, TableName: - // Common node types that never contain Literals or ListArgs but create a lot of object - // allocations. - return false - case *ConvertType: - // we should not rewrite the type description - return false - } - return nz.err == nil // only continue if we haven't found any errors -} - -// walkUpSelect normalizes the Literals in Select mode. -func (nz *normalizer) walkUpSelect(cursor *Cursor) bool { - if nz.err != nil { - return false - } - node, isLiteral := cursor.Node().(*Literal) - if !isLiteral { - return true - } - parent := cursor.Parent() - switch parent.(type) { - case *Order, *GroupBy: - return true - case *Limit: - nz.convertLiteral(node, cursor) - default: - nz.convertLiteralDedup(node, cursor) } return nz.err == nil // only continue if we haven't found any errors } From 1df1dc8fb9cd546f3e50ed5b72a40957f251c82c Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Thu, 23 Jan 2025 18:38:34 +0100 Subject: [PATCH 66/66] Improve sizegen to handle more types (#17583) Signed-off-by: Dirkjan Bussink --- go/mysql/decimal/cached_size.go | 1 + go/tools/sizegen/sizegen.go | 124 +++++++- go/vt/schema/cached_size.go | 11 + go/vt/sqlparser/cached_size.go | 292 ++++++++++++++++++ go/vt/vtgate/evalengine/cached_size.go | 47 +++ go/vt/vtgate/vindexes/cached_size.go | 36 +++ .../tabletserver/rules/cached_size.go | 2 + 7 files changed, 506 insertions(+), 7 deletions(-) diff --git a/go/mysql/decimal/cached_size.go b/go/mysql/decimal/cached_size.go index e7258579f55..87f6c201b80 100644 --- a/go/mysql/decimal/cached_size.go +++ b/go/mysql/decimal/cached_size.go @@ -29,6 +29,7 @@ func (cached *Decimal) CachedSize(alloc bool) int64 { } // field value *math/big.Int if cached.value != nil { + size += hack.RuntimeAllocSize(int64(cap(cached.value.Bits())) * 4) size += hack.RuntimeAllocSize(int64(32)) } return size diff --git a/go/tools/sizegen/sizegen.go b/go/tools/sizegen/sizegen.go index 17b155ad3f4..cc733c8826d 100644 --- a/go/tools/sizegen/sizegen.go +++ b/go/tools/sizegen/sizegen.go @@ -107,6 +107,8 @@ func isPod(tt types.Type) bool { return false } return true + case *types.Alias: + return isPod(types.Unalias(tt)) default: return false } @@ -152,8 +154,37 @@ func (sizegen *sizegen) generateType(pkg *types.Package, file *codeFile, named * sizegen.generateTyp(tt) } }) + + case *types.Slice: + impl, flag := sizegen.sizeImplForSlice(named.Obj(), tt) + file.impls = append(file.impls, codeImpl{ + code: impl, + name: named.String(), + flags: flag, + }) + case *types.Map: + impl, flag := sizegen.sizeImplForMap(named.Obj(), tt) + file.impls = append(file.impls, codeImpl{ + code: impl, + name: named.String(), + flags: flag, + }) + case *types.Basic: + impl, flag := sizegen.sizeImplForBasic(named.Obj(), tt) + file.impls = append(file.impls, codeImpl{ + code: impl, + name: named.String(), + flags: flag, + }) + case *types.Signature: + impl, flag := sizegen.sizeImplForSignature(named.Obj(), tt) + file.impls = append(file.impls, codeImpl{ + code: impl, + name: named.String(), + flags: flag, + }) default: - // no-op + panic(fmt.Sprintf("unhandled type: %v (%T)", named, tt)) } } @@ -286,6 +317,77 @@ func (sizegen *sizegen) sizeImplForStruct(name *types.TypeName, st *types.Struct return f, funcFlags } +func (sizegen *sizegen) sizeImplForSlice(name *types.TypeName, st *types.Slice) (jen.Code, codeFlag) { + var stmt []jen.Code + var funcFlags codeFlag + stmt, funcFlags = sizegen.sizeStmtForArray(stmt, jen.Op("*").Add(jen.Id("cached")), st.Elem()) + + f := jen.Func() + f.Params(jen.Id("cached").Op("*").Id(name.Name())) + f.Id("CachedSize").Params(jen.Id("alloc").Id("bool")).Int64() + f.BlockFunc(func(b *jen.Group) { + b.Add(jen.If(jen.Id("cached").Op("==").Nil()).Block(jen.Return(jen.Lit(int64(0))))) + b.Add(jen.Id("size").Op(":=").Lit(int64(0))) + b.Add(jen.If(jen.Id("alloc")).Block( + jen.Id("size").Op("+=").Lit(hack.RuntimeAllocSize(sizegen.sizes.Sizeof(st))), + )) + for _, s := range stmt { + b.Add(s) + } + b.Add(jen.Return(jen.Id("size"))) + }) + return f, funcFlags +} + +func (sizegen *sizegen) sizeImplForMap(name *types.TypeName, st *types.Map) (jen.Code, codeFlag) { + stmt := sizegen.sizeStmtForMap(jen.Op("*").Add(jen.Id("cached")), st) + + f := jen.Func() + f.Params(jen.Id("cached").Op("*").Id(name.Name())) + f.Id("CachedSize").Params(jen.Id("alloc").Id("bool")).Int64() + f.BlockFunc(func(b *jen.Group) { + b.Add(jen.If(jen.Id("cached").Op("==").Nil()).Block(jen.Return(jen.Lit(int64(0))))) + b.Add(jen.Id("size").Op(":=").Lit(int64(0))) + b.Add(jen.If(jen.Id("alloc")).Block( + jen.Id("size").Op("+=").Lit(hack.RuntimeAllocSize(sizegen.sizes.Sizeof(st))), + )) + for _, s := range stmt { + b.Add(s) + } + b.Add(jen.Return(jen.Id("size"))) + }) + return f, 0 +} + +func (sizegen *sizegen) sizeImplForBasic(name *types.TypeName, st *types.Basic) (jen.Code, codeFlag) { + f := jen.Func() + f.Params(jen.Id("cached").Op("*").Id(name.Name())) + f.Id("CachedSize").Params(jen.Id("alloc").Id("bool")).Int64() + f.BlockFunc(func(b *jen.Group) { + b.Add(jen.If(jen.Id("cached").Op("==").Nil()).Block(jen.Return(jen.Lit(int64(0))))) + b.Add(jen.Id("size").Op(":=").Lit(int64(0))) + b.Add(jen.If(jen.Id("alloc")).Block( + jen.Id("size").Op("+=").Do(mallocsize(jen.Lit(sizegen.sizes.Sizeof(st)))), + )) + if st.Info()&types.IsString != 0 { + b.Add(jen.Id("size").Op("+=").Do(mallocsize(jen.Int64().Call(jen.Len(jen.Op("*").Add(jen.Id("cached"))))))) + } + b.Add(jen.Return(jen.Id("size"))) + }) + return f, 0 +} + +func (sizegen *sizegen) sizeImplForSignature(name *types.TypeName, _ *types.Signature) (jen.Code, codeFlag) { + f := jen.Func() + f.Params(jen.Id("cached").Op("*").Id(name.Name())) + f.Id("CachedSize").Params(jen.Id("alloc").Id("bool")).Int64() + f.BlockFunc(func(b *jen.Group) { + // assume that function pointers do not allocate (although they might, if they're closures) + b.Add(jen.Return(jen.Lit(int64(0)))) + }) + return f, 0 +} + func (sizegen *sizegen) sizeStmtForMap(fieldName *jen.Statement, m *types.Map) []jen.Code { const bucketCnt = 8 const sizeofHmap = int64(6 * 8) @@ -447,12 +549,21 @@ func (sizegen *sizegen) sizeStmtForType(fieldName *jen.Statement, field types.Ty ts := sizegen.getKnownType(node) if ts.pod || !ts.local { if alloc { - if !ts.local { - log.Printf("WARNING: size of external type %s cannot be fully calculated", node) + var stmts []jen.Code + if node.String() == "math/big.Int" { + // This type is not accessible, but with the given + // accessors we can compute a proper size. + stmts = append(stmts, jen.Id("size"). + Op("+="). + Do(mallocsize(jen.Int64().Call(jen.Cap(fieldName.Clone().Dot("Bits").Call())). + Op("*"). + Lit(4), + ))) + } else if !ts.local { + stmts = append(stmts, jen.Commentf("WARNING: size of external type %s cannot be fully calculated", node)) } - return jen.If(fieldName.Clone().Op("!=").Nil()).Block( - jen.Id("size").Op("+=").Do(mallocsize(jen.Lit(sizegen.sizes.Sizeof(node.Underlying())))), - ), 0 + stmts = append(stmts, jen.Id("size").Op("+=").Do(mallocsize(jen.Lit(sizegen.sizes.Sizeof(node.Underlying()))))) + return jen.If(fieldName.Clone().Op("!=").Nil()).Block(stmts...), 0 } return nil, 0 } @@ -502,7 +613,6 @@ func (sizegen *sizegen) sizeStmtForType(fieldName *jen.Statement, field types.Ty var defaultGenTypes = []string{ "vitess.io/vitess/go/pools/smartconnpool.Setting", - "vitess.io/vitess/go/vt/schema.DDLStrategySetting", "vitess.io/vitess/go/vt/vtgate/engine.Plan", "vitess.io/vitess/go/vt/vttablet/tabletserver.TabletPlan", "vitess.io/vitess/go/sqltypes.Result", diff --git a/go/vt/schema/cached_size.go b/go/vt/schema/cached_size.go index a2ea8f55deb..5ed67c01696 100644 --- a/go/vt/schema/cached_size.go +++ b/go/vt/schema/cached_size.go @@ -19,6 +19,17 @@ package schema import hack "vitess.io/vitess/go/hack" +func (cached *DDLStrategy) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += hack.RuntimeAllocSize(int64(16)) + } + size += hack.RuntimeAllocSize(int64(len(*cached))) + return size +} func (cached *DDLStrategySetting) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/sqlparser/cached_size.go b/go/vt/sqlparser/cached_size.go index 3aac4ac1edd..7183ff18e28 100644 --- a/go/vt/sqlparser/cached_size.go +++ b/go/vt/sqlparser/cached_size.go @@ -788,6 +788,20 @@ func (cached *ColumnTypeOptions) CachedSize(alloc bool) int64 { size += cached.SRID.CachedSize(true) return size } +func (cached *Columns) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(32)) + for _, elem := range *cached { + size += elem.CachedSize(false) + } + return size +} //go:nocheckptr func (cached *CommentDirectives) CachedSize(alloc bool) int64 { @@ -832,6 +846,20 @@ func (cached *CommentOnly) CachedSize(alloc bool) int64 { } return size } +func (cached *Comments) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + size += hack.RuntimeAllocSize(int64(len(elem))) + } + return size +} func (cached *CommonTableExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -1313,6 +1341,22 @@ func (cached *ExplainTab) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.Wild))) return size } +func (cached *Exprs) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + return size +} func (cached *ExtractFuncExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -1819,6 +1863,20 @@ func (cached *IndexHint) CachedSize(alloc bool) int64 { } return size } +func (cached *IndexHints) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *IndexInfo) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -2696,6 +2754,17 @@ func (cached *LinestrPropertyFuncExpr) CachedSize(alloc bool) int64 { } return size } +func (cached *ListArg) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += hack.RuntimeAllocSize(int64(16)) + } + size += hack.RuntimeAllocSize(int64(len(*cached))) + return size +} func (cached *Literal) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -2962,6 +3031,20 @@ func (cached *NamedWindow) CachedSize(alloc bool) int64 { } return size } +func (cached *NamedWindows) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *Nextval) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -3020,6 +3103,20 @@ func (cached *Offset) CachedSize(alloc bool) int64 { } return size } +func (cached *OnDup) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *OptLike) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -3064,6 +3161,20 @@ func (cached *Order) CachedSize(alloc bool) int64 { } return size } +func (cached *OrderBy) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *OrderByOption) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -3297,6 +3408,20 @@ func (cached *PartitionValueRange) CachedSize(alloc bool) int64 { } return size } +func (cached *Partitions) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(32)) + for _, elem := range *cached { + size += elem.CachedSize(false) + } + return size +} func (cached *PerformanceSchemaFuncExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -3753,6 +3878,22 @@ func (cached *Select) CachedSize(alloc bool) int64 { size += cached.Into.CachedSize(true) return size } +func (cached *SelectExprs) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + return size +} func (cached *SelectInto) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -3810,6 +3951,20 @@ func (cached *SetExpr) CachedSize(alloc bool) int64 { } return size } +func (cached *SetExprs) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *Show) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4095,6 +4250,20 @@ func (cached *SubPartitionDefinitionOptions) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.TableSpace))) return size } +func (cached *SubPartitionDefinitions) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *Subquery) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4161,6 +4330,36 @@ func (cached *TableAndLockType) CachedSize(alloc bool) int64 { } return size } +func (cached *TableAndLockTypes) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} +func (cached *TableExprs) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + return size +} func (cached *TableName) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4175,6 +4374,20 @@ func (cached *TableName) CachedSize(alloc bool) int64 { size += cached.Qualifier.CachedSize(false) return size } +func (cached *TableNames) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(32)) + for _, elem := range *cached { + size += elem.CachedSize(false) + } + return size +} func (cached *TableOption) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4198,6 +4411,20 @@ func (cached *TableOption) CachedSize(alloc bool) int64 { } return size } +func (cached *TableOptions) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *TableSpec) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4398,6 +4625,20 @@ func (cached *UpdateExpr) CachedSize(alloc bool) int64 { } return size } +func (cached *UpdateExprs) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *UpdateXMLExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4470,6 +4711,22 @@ func (cached *VStream) CachedSize(alloc bool) int64 { size += cached.Limit.CachedSize(true) return size } +func (cached *ValTuple) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + return size +} func (cached *Validation) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4480,6 +4737,27 @@ func (cached *Validation) CachedSize(alloc bool) int64 { } return size } +func (cached *Values) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(24)) + for _, elem := range *cached { + { + size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(16)) + for _, elem := range elem { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + } + } + return size +} func (cached *ValuesFuncExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -4688,6 +4966,20 @@ func (cached *WindowDefinition) CachedSize(alloc bool) int64 { size += cached.WindowSpec.CachedSize(true) return size } +func (cached *WindowDefinitions) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(8)) + for _, elem := range *cached { + size += elem.CachedSize(true) + } + return size +} func (cached *WindowSpecification) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/evalengine/cached_size.go b/go/vt/vtgate/evalengine/cached_size.go index d51c65c75b4..b953afda95c 100644 --- a/go/vt/vtgate/evalengine/cached_size.go +++ b/go/vt/vtgate/evalengine/cached_size.go @@ -175,6 +175,20 @@ func (cached *Column) CachedSize(alloc bool) int64 { } return size } +func (cached *Comparison) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(56)) + for _, elem := range *cached { + size += elem.CachedSize(false) + } + return size +} func (cached *ComparisonExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -245,6 +259,20 @@ func (cached *ConvertUsingExpr) CachedSize(alloc bool) int64 { size += cached.CollationEnv.CachedSize(true) return size } +func (cached *EnumSetValues) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + size += hack.RuntimeAllocSize(int64(len(elem))) + } + return size +} func (cached *InExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -391,6 +419,22 @@ func (cached *TupleBindVariable) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.Key))) return size } +func (cached *TupleExpr) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + size += hack.RuntimeAllocSize(int64(cap(*cached)) * int64(16)) + for _, elem := range *cached { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + return size +} func (cached *Type) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -2114,6 +2158,9 @@ func (cached *evalYear) CachedSize(alloc bool) int64 { } return size } +func (cached *frame) CachedSize(alloc bool) int64 { + return int64(0) +} func (cached *typedExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/vindexes/cached_size.go b/go/vt/vtgate/vindexes/cached_size.go index eeadb69b532..ac68887c00d 100644 --- a/go/vt/vtgate/vindexes/cached_size.go +++ b/go/vt/vtgate/vindexes/cached_size.go @@ -392,6 +392,24 @@ func (cached *Numeric) CachedSize(alloc bool) int64 { } return size } +func (cached *NumericLookupTable) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(8) + } + size += int64(48) + hmap := reflect.ValueOf(*cached) + numBuckets := int(math.Pow(2, float64((*(*uint8)(unsafe.Pointer(hmap.Pointer() + uintptr(9))))))) + numOldBuckets := (*(*uint16)(unsafe.Pointer(hmap.Pointer() + uintptr(10)))) + size += hack.RuntimeAllocSize(int64(numOldBuckets * 144)) + if len(*cached) > 0 || numBuckets > 1 { + size += hack.RuntimeAllocSize(int64(numBuckets * 144)) + } + return size +} //go:nocheckptr func (cached *NumericStaticMap) CachedSize(alloc bool) int64 { @@ -482,6 +500,24 @@ func (cached *RegionJSON) CachedSize(alloc bool) int64 { } return size } +func (cached *RegionMap) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(8) + } + size += int64(48) + hmap := reflect.ValueOf(*cached) + numBuckets := int(math.Pow(2, float64((*(*uint8)(unsafe.Pointer(hmap.Pointer() + uintptr(9))))))) + numOldBuckets := (*(*uint16)(unsafe.Pointer(hmap.Pointer() + uintptr(10)))) + size += hack.RuntimeAllocSize(int64(numOldBuckets * 208)) + if len(*cached) > 0 || numBuckets > 1 { + size += hack.RuntimeAllocSize(int64(numBuckets * 208)) + } + return size +} func (cached *ReverseBits) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vttablet/tabletserver/rules/cached_size.go b/go/vt/vttablet/tabletserver/rules/cached_size.go index 1375ef2cb7b..d06a31ab8cb 100644 --- a/go/vt/vttablet/tabletserver/rules/cached_size.go +++ b/go/vt/vttablet/tabletserver/rules/cached_size.go @@ -108,6 +108,7 @@ func (cached *bvcre) CachedSize(alloc bool) int64 { } // field re *regexp.Regexp if cached.re != nil { + // WARNING: size of external type regexp.Regexp cannot be fully calculated size += hack.RuntimeAllocSize(int64(160)) } return size @@ -124,6 +125,7 @@ func (cached *namedRegexp) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.name))) // field Regexp *regexp.Regexp if cached.Regexp != nil { + // WARNING: size of external type regexp.Regexp cannot be fully calculated size += hack.RuntimeAllocSize(int64(160)) } return size