Criar e gerenciar tabelas

Nesta página, explicamos como criar e executar operações em tabelas do Bigtable usando o console do Google Cloud, a Google Cloud CLI ou a CLI cbt.

A CLI cbt é compatível com diversos comandos não descritos nesta página. Consulte a referência cbt para ver uma lista completa de comandos.

Também é possível criar e gerenciar tabelas de maneira programática com as bibliotecas de cliente ou as APIs de serviço do Cloud Bigtable.

Para instruções sobre como criar e gerenciar visualizações autorizadas de uma tabela, consulte visualizações autorizadas.

Antes de começar

Se você planeja trabalhar com suas tabelas usando ferramentas de linha de comando, siga as etapas nesta seção.

  1. Instale a CLI gcloud.

  2. Opcional: se você planeja usar a CLI cbt, siga as instruções em Como instalar a CLI cbt , incluindo a etapa para criar um arquivo .cbtrc.

    As instruções da CLI cbt desta página presumem que você tenha definido o ID do projeto e da instância no arquivo .cbtrc. Como alternativa, é possível usar as sinalizações -project e -instance para definir esses valores sempre que executar um comando da CLI cbt.

Criar uma tabela

Ao criar uma tabela, você não precisa especificar os grupos de colunas para uso na tabela. Você pode adicionar ou excluir grupos de colunas mais tarde.

Console

Para criar uma nova tabela em uma instância:

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

  4. Insira um ID de tabela para a tabela.

  5. Adicionar grupos de colunas (opcional).

    É possível adicionar colunas agora ou mais tarde. Uma tabela precisa ter pelo menos um grupo de colunas antes de ser gravado nos dados. Uma tabela precisa ter pelo menos um grupo de colunas para que seja possível gravar dados ou ler um fluxo de alterações nela.

  6. Opcional: ative um fluxo de alterações na tabela. Antes de ativar um fluxo de alterações, entenda as implicações, incluindo o aumento nos custos de armazenamento e os requisitos de uso do perfil do aplicativo. Para analisar esses detalhes, consulte a Visão geral do fluxo de alterações.

    1. Selecione Ativar fluxo de alterações.

    2. No campo Prazo de validade, digite um número entre 1 e 7 para especificar por quantos dias os dados do fluxo de alterações serão mantidos.

    3. Clique em Criar.

  7. Opcional: se você não quiser que o Bigtable crie um backup diário da tabela, desmarque a caixa de seleção ao lado de Ativar backup automatizado. Para mais informações, consulte Usar o backup automático (pré-lançamento).

  8. Clique em Criar uma tabela.

gcloud

Para criar uma tabela, execute o comando a seguir. Acesse gcloud Bigtable instances table create para acessar uma lista completa de opções.

gcloud bigtable instances tables create TABLE_ID \
    --instance=INSTANCE_ID \
    --project=PROJECT_ID \
    --column-families=COLUMN-FAMILIES

Substitua:

  • TABLE_ID: um ID exclusivo para a nova tabela.
  • INSTANCE_ID: o ID da instância
  • PROJECT_ID: o projeto que conterá a nova tabela.
  • COLUMN-FAMILIES: uma lista separada por vírgulas de nomes de grupos de colunas. É possível adicionar mais grupos de colunas depois.

Opcional:

  • Para proteger a tabela contra exclusão, anexe o comando com --deletion-protection. Se você não aplicar essa configuração, a tabela poderá ser excluída. Para permitir explicitamente a exclusão da tabela, basta anexar --no-deletion-protection.

  • Para ativar um fluxo de alterações na tabela, especifique um período de armazenamento para os dados desse fluxo. Antes de ativar um fluxo de alterações, entenda as implicações, incluindo o aumento nos custos de armazenamento e os requisitos de uso do perfil do aplicativo. Para analisar esses detalhes, consulte a Visão geral do fluxo de alterações.

    --change-stream-retention-period=RETENTION_PERIOD
    

    Substitua RETENTION_PERIOD pelo período em que o Bigtable reterá os dados do fluxo de alterações da tabela. O período precisa ser de um a sete dias. As unidades aceitáveis são dias (d), horas (h), minutos (m) e segundos (s). Exemplos: 48h ou 6d

  • Para permitir que o Bigtable crie um backup diário da tabela, ative o backup automatizado (pré-lançamento):

    gcloud bigtable instances tables create TABLE_ID \
        --instance=INSTANCE_ID \
        --project=PROJECT_ID \
        --column-families=COLUMN-FAMILIES \
        --enable-automated-backup
    

cbt

Use o comando a seguir, substituindo TABLE_NAME pelo nome da tabela. Não é possível usar a CLI cbt para criar uma tabela com um fluxo de alterações ativado.

cbt createtable TABLE_ID

Opcional: para criar um grupo de colunas agregadas na tabela, anexando o nome do grupo de colunas ao tipo de agregação. O código a seguir cria um grupo de colunas agregado com uma política de coleta de lixo de never.

cbt createtable TABLE_ID families=FAMILY_NAME:never:TYPE

Substitua:

  • TABLE_ID: um ID exclusivo para a nova tabela.
  • FAMILY_NAME: uma lista separada por vírgulas de nomes de famílias de colunas. É possível adicionar mais grupos de colunas depois.
  • TYPE: o tipo agregado. Precisa ser intsum, intmin, intmax ou inthll.

Para mais opções, consulte Criar uma tabela na referência da CLI cbt.

Se você excluir uma tabela por engano, não tente criar manualmente a tabela excluída. Use o comando da CLI gcloud bigtable instances tables undelete para recuperar a tabela.

Opcional: dividir a tabela por chave de linha

Para otimizar o desempenho, o Bigtable divide continuamente as tabelas em vários nós, distribuindo uniformemente a quantidade de dados armazenados em cada nó e mantendo as linhas acessadas com frequência separadas, sempre que possível. Esse processo contínuo é automático.

Ao criar uma nova tabela, é possível especificar divisões iniciais. O Bigtable divide a tabela nas chaves de linha fornecidas. Se os keyspaces forem muito grandes, o Bigtable vai dividir ainda mais a tabela. As divisões iniciais são mantidas por cerca de 24 horas após a conclusão da criação da tabela. É possível fornecer até 100 chaves de linha em que as divisões iniciais devem ocorrer.

Por exemplo, é possível designar linhas específicas para dividir previamente a tabela se você estiver prestes a gravar muitas linhas nela.

Dividir previamente a tabela não é essencial, mas é benéfico porque isso fornece informações do Bigtable sobre o provável destino da carga e dos dados armazenados quando a tabela for criada. A divisão prévia impede que o Bigtable precise dividir as tabelas e reequilibrar a carga de uma só vez quando os dados chegam.

Console

Não é possível dividir as linhas previamente ao criar uma tabela usando o console do Google Cloud.

gcloud

Para dividir uma tabela por chave de linha, execute o comando a seguir. Acesse gcloud Bigtable instances table create para acessar uma lista completa de opções.

gcloud bigtable instances tables create TABLE_ID\
    --instance=INSTANCE_ID \
    --project=PROJECT_ID \
    --column-families=COLUMN-FAMILIES \
    --splits=SPLITS

Substitua:

  • TABLE_ID: um ID exclusivo para a nova tabela.
  • INSTANCE_ID: o ID da instância
  • PROJECT_ID: o projeto que conterá a nova tabela.
  • COLUMN-FAMILIES: uma lista separada por vírgulas de nomes de grupos de colunas. É possível adicionar mais grupos de colunas depois.
  • SPLITS: as chaves de linha em que a tabela será dividida inicialmente, por exemplo, 10,20.

cbt

Para dividir a tabela previamente com base na chave de linha, use a seguinte sintaxe para criar a tabela. Substitua [TABLE_NAME] pelo nome da tabela e [SPLITS] por uma lista separada por vírgulas de prefixos de chave de linha que devem ser usados nas divisões prévias.

```
cbt createtable [TABLE_NAME] splits=[SPLITS]
```

Por exemplo, para dividir previamente a tabela my-table em chaves de linha iniciadas com 10 e 20:

```
cbt createtable my-table splits=10,20
```

Modificar grupos de colunas em uma tabela

É possível adicionar famílias de colunas em uma tabela. Se a proteção contra exclusão não estiver ativada na tabela, é possível excluir grupos de colunas.

Adicionar grupos de colunas

Console

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

  4. Clique em Editar na tabela que você quer modificar.

  5. Para cada grupo de colunas que você quer adicionar, faça o seguinte:

    1. Clique em Adicionar grupo de colunas.
    2. Forneça um identificador exclusivo para o grupo de colunas.
    3. Defina a política de coleta de lixo para o grupo de colunas.
    4. Clique em Concluído.
    5. Clique em Salvar.

gcloud

Não é possível usar a CLI gcloud para adicionar grupos de colunas a uma tabela.

cbt

Para adicionar um grupo de colunas a uma tabela, use o seguinte comando:

cbt createfamily TABLE_ID FAMILY_NAME

Por exemplo, para adicionar os grupos de colunas cf1 e cf2 à tabela my-table:

cbt createfamily my-table cf1
cbt createfamily my-table cf2

Opcional: para adicionar um grupo de colunas agregadas à tabela, anexando o nome do grupo de colunas com o tipo de agregação. O exemplo a seguir cria uma tabela que tem um grupo de colunas agregado com uma política de coleta de lixo de never.

cbt createfamily TABLE_ID FAMILY_NAME:never:TYPE

Substitua:

  • TABLE_ID: o ID da tabela
  • FAMILY_NAME: uma lista separada por vírgulas de nomes de famílias de colunas. É possível adicionar mais grupos de colunas depois.
  • TYPE: o tipo de agregação. Precisa ser intsum, intmin, intmax ou inthll.

Excluir grupos de colunas

É possível excluir grupos de colunas de uma tabela em que a proteção contra exclusão não esteja ativada.

Console

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

  4. Clique em Editar na tabela que você quer modificar.

  5. Para cada grupo de colunas que você quer excluir, faça o seguinte:

    1. Passe o cursor sobre a linha do grupo de colunas que você quer excluir.
    2. Clique em .
  6. Clique em Salvar.

  7. Para confirmar que você entende que a exclusão de um grupo de colunas é permanente e que todos os dados nele serão excluídos, digite "Excluir grupos de colunas" no campo de texto.

  8. Clique em Confirmar.

gcloud

Não é possível usar a CLI gcloud para excluir grupos de colunas de uma tabela.

cbt

Para excluir um grupo de colunas de uma tabela, use o comando a seguir substituindo [TABLE_NAME] pelo nome da tabela e [FAMILY_NAME] pelo nome do grupo de colunas.

cbt deletefamily [TABLE_NAME] [FAMILY_NAME]

Por exemplo, para excluir o grupo de colunas cf2 da tabela my-table:

cbt deletefamily my-table cf2

Ver uma lista de tabelas

Console

Para ver uma lista de tabelas em uma instância:

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

    • Clique na seta ao lado do código da tabela para expandir uma lista de replicações dela.
    • Clique em Exibir métricas, ao lado do nome de uma tabela para visualizar os dados de monitoramento dela.

gcloud

Para ver uma lista de tabelas, execute o comando gcloud Bigtable instancestables list.

gcloud bigtable instances tables list --instances=INSTANCE_IDS

Substitua:

  • INSTANCE_IDS: uma lista separada por vírgulas de IDs de instâncias.

cbt

Para visualizar uma lista de tabelas em uma instância, execute o seguinte comando:

    cbt ls INSTANCE_ID

Substitua:

  • INSTANCE_ID: identificador permanente da instância

C++

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::cloud::StreamRange;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
   std::string const& instance_id) {
  std::string instance_name = cbt::InstanceName(project_id, instance_id);

  google::bigtable::admin::v2::ListTablesRequest r;
  r.set_parent(instance_name);
  r.set_view(google::bigtable::admin::v2::Table::NAME_ONLY);

  StreamRange<google::bigtable::admin::v2::Table> tables =
      admin.ListTables(std::move(r));
  for (auto& table : tables) {
    if (!table) throw std::move(table).status();
    std::cout << table->name() << "\n";
  }
}

C#

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

// Lists tables in intance.
// Initialize request argument(s).
ListTablesRequest request = new ListTablesRequest
{
    ParentAsInstanceName = s_instanceName
};
try
{
    // Make the request.
    PagedEnumerable<ListTablesResponse, Table> response = bigtableTableAdminClient.ListTables(request);

}
catch (Exception ex)
{
    Console.WriteLine($"Error listing tables {ex.Message}");
}

Java

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

// Lists tables in the current instance.
try {
  List<String> tableIds = adminClient.listTables();
  for (String tableId : tableIds) {
    System.out.println(tableId);
  }
} catch (NotFoundException e) {
  System.err.println("Failed to list tables from a non-existent instance: " + e.getMessage());
}

Node.js

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

// List tables in current project
const [tables] = await instance.getTables();
tables.forEach(table => {
  console.log(table.id);
});

PHP

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

use Google\Cloud\Bigtable\Admin\V2\Client\BigtableInstanceAdminClient;
use Google\Cloud\Bigtable\Admin\V2\Client\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ListTablesRequest;

/**
 * List tables in an instance
 *
 * @param string $projectId The Google Cloud project ID
 * @param string $instanceId The ID of the Bigtable instance
 */
function list_tables(
    string $projectId,
    string $instanceId
): void {
    $instanceAdminClient = new BigtableInstanceAdminClient();
    $tableAdminClient = new BigtableTableAdminClient();

    $instanceName = $instanceAdminClient->instanceName($projectId, $instanceId);

    printf('Listing Tables:' . PHP_EOL);
    $listTablesRequest = (new ListTablesRequest())
        ->setParent($instanceName);
    $tables = $tableAdminClient->listTables($listTablesRequest)->iterateAllElements();
    $tables = iterator_to_array($tables);
    if (empty($tables)) {
        print('No table exists.' . PHP_EOL);
        return;
    }
    foreach ($tables as $table) {
        print($table->getName() . PHP_EOL);
    }
}

Python

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

tables = instance.list_tables()
print("Listing tables in current project...")
if tables != []:
    for tbl in tables:
        print(tbl.table_id)
else:
    print("No table exists in current project...")

Ruby

Para saber como instalar e usar a biblioteca de cliente do Bigtable, consulte Bibliotecas de cliente do Bigtable.

Para autenticar no Bigtable, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

# instance_id = "my-instance"
bigtable.tables(instance_id).all.each do |t|
  puts "Table: #{t.name}"
end

Ver informações sobre uma tabela

Console

Para visualizar informações sobre uma tabela:

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância. O Console do Google Cloud exibe o número de clusters em que a tabela está armazenada, o status dela, a utilização do armazenamento e os identificadores de todos os backups atuais da tabela.

  4. Para visualizar os nomes dos grupos de colunas da tabela, clique em . Para fechar o painel Editar tabela, clique em Cancelar.

  5. Para visualizar mais detalhes sobre a tabela, incluindo métricas no nível da tabela e estado de replicação, clique no nome da tabela.

gcloud

Para acessar informações sobre uma tabela, execute o comando gcloud Bigtableinstances jornal describe.

gcloud bigtable instances tables describe TABLE_ID \
    --instance=INSTANCE_ID

Substitua:

  • TABLE_ID: um ID exclusivo da tabela.
  • INSTANCE_ID: o ID da instância

cbt

É possível usar a CLI cbt para conseguir uma lista de grupos de colunas existentes em uma tabela.

Use o seguinte comando, substituindo [TABLE_NAME] pelo nome da tabela:

cbt ls [TABLE_NAME]

Definir políticas de coleta de lixo

Uma política de coleta de lixo informa ao Bigtable quais dados serão mantidos e quais serão marcados para exclusão. Políticas de coleta de lixo são definidas no nível do grupo de colunas. É possível defini-las ao criar a tabela ou posteriormente.

Ao criar um grupo de colunas, você pode especificar o número de células que quer reter em todas as colunas desse grupo. Se você não especificar essa configuração, o Cloud Bigtable usa uma das seguintes configurações padrão:

  • Se você criar o grupo de colunas com o cliente HBase do Cloud Bigtable para Java ou o shell do HBase ou outra ferramenta que usa o cliente HBase para Java, o Bigtable manterá apenas uma célula para cada intersecção de linha/coluna no grupo de colunas. Essa configuração padrão é consistente com o HBase.

  • Se você criar o grupo de colunas usando o Console do Google Cloud, qualquer outra biblioteca de cliente ou a CLI cbt , o Bigtable reterá um número infinito de células em cada coluna.

Consulte Configurar políticas de coleta de lixo para instruções detalhadas sobre como visualizar, definir e atualizar políticas de coleta de lixo.

Fazer backup e restaurar uma tabela

Consulte Gerenciar backups para instruções sobre como fazer backup de uma tabela e restaurar a partir de um backup em uma nova tabela.

Se você tiver ativado o backup automático ao criar uma tabela, poderá modificar a configuração de backup automático de uma tabela para ativar ou desativar o backup automático ou mudar o período de armazenamento para até 90 dias a partir do momento da criação do backup. Para mais informações, consulte Usar o backup automático.

Ativar, desativar ou configurar um fluxo de alterações

Para instruções sobre as tarefas a seguir, consulte Configurar um fluxo de alterações.

  • Como ativar um fluxo de alterações em uma tabela que já existe
  • Como desativar um fluxo de alterações
  • Atualizar o período de armazenamento de um fluxo de alterações

Excluir uma tabela

A exclusão de uma tabela também exclui todas as visualizações autorizadas dela. Não é possível excluir uma tabela se as visualizações autorizadas dela tiverem a proteção contra exclusão ativada.

Console

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

  4. Clique em na tabela que você quer excluir.

  5. Clique em Excluir.

  6. Para confirmar que esta ação excluirá a tabela de todos os clusters na instância e que você tem apenas sete dias para cancelá-la, digite o ID da tabela na caixa de texto.

  7. Clique em Excluir.

gcloud

  1. Para excluir tabelas, execute o comando gcloud Bigtableinstances jornal delete.

    gcloud bigtable instances tables delete --instance=INSTANCE_ID
    

    Substitua:

    • INSTANCE_ID: o ID da instância
  2. No terminal, digite y para confirmar a exclusão da tabela.

cbt

Para excluir uma tabela, use o comando a seguir substituindo [TABLE_NAME] pelo nome da tabela:

cbt deletetable [TABLE_NAME]

Cancelar exclusão de uma tabela

Se você excluir uma tabela acidentalmente, use o comando bigtable instances tables undelete da CLI gcloud para cancelar a exclusão ou recuperar a tabela. Não tente criar manualmente a tabela excluída.

Para cancelar a exclusão de uma tabela, execute o seguinte comando no terminal:

gcloud bigtable instances tables undelete TABLE_ID --instance=INSTANCE_ID

Substitua:

  • TABLE_ID: o identificador exclusivo da tabela.
  • INSTANCE_ID: o ID da instância

Considere as seguintes limitações:

  • A capacidade de cancelar a exclusão de uma tabela ficará disponível por aproximadamente sete dias a partir do momento da exclusão.
  • Não é possível cancelar a exclusão de uma tabela usando o console do Google Cloud, as bibliotecas de cliente do Cloud Bigtable ou a CLI cbt.
  • Não é possível cancelar a exclusão de uma tabela de uma instância excluída.
  • Não é possível cancelar a exclusão de uma tabela com a CMEK ativada.
  • Todas as vinculações de política do IAM detalhadas que uma tabela tiver antes da exclusão não serão restauradas quando a exclusão for cancelada.

É possível verificar o status da operação undelete nos registros de auditoria.

Modificar a proteção contra exclusão

É possível ativar ou desativar a proteção contra exclusão de uma tabela se você for um principal em um papel que inclui a permissão bigtable.tables.update, como roles/bigtable.admin. A proteção contra exclusão impede a exclusão da tabela, de todos os grupos de colunas na tabela e da instância que contém a tabela.

Ativar a proteção contra exclusão de uma tabela não ativa essa proteção para visualizações autorizadas da tabela. Da mesma forma, desativar a proteção contra exclusão de uma tabela não a desativa para visualizações autorizadas. É necessário atualizar as visualizações autorizadas da tabela separadamente.

Console

  1. Abra a lista de instâncias do Bigtable no Console do Google Cloud.

    Abrir a lista de instâncias

  2. Clique na instância em que estão as tabelas a serem visualizadas.

  3. Clique em Tabelas no painel esquerdo.

    A página Tabelas exibe uma lista de tabelas na instância.

  4. Clique em ao lado do ID da tabela.

  5. Para ativar a proteção contra exclusão, clique em Impedir exclusão. Para desativar a proteção contra exclusão, clique em Ativar exclusão. Apenas a opção válida fica visível.

gcloud

Para ativar a proteção contra exclusão de uma tabela, execute o comando gcloud bigtable instances table update:

gcloud bigtable instances tables update TABLE_ID \
    --instance=INSTANCE_ID \
    --deletion-protection

Para desativar a proteção contra exclusão de uma tabela, execute o seguinte:

gcloud bigtable instances tables update TABLE_ID \
    --instance=INSTANCE_ID \
    --no-deletion-protection

Substitua:

+ TABLE_ID: the unique identifier for the table
+ INSTANCE_ID: the ID of the instance

cbt

Não é possível usar a CLI cbt para ativar ou desativar a proteção contra exclusão.