Skip to content

Commit

Permalink
Upgrade all tools.
Browse files Browse the repository at this point in the history
Add mimirtool
Standardize curl to use -sSLo or -sSLO when downloading
Add missing checksum checks for many of our downloads
  • Loading branch information
avnes committed Oct 10, 2024
1 parent c82093d commit 275cb2e
Showing 1 changed file with 86 additions and 60 deletions.
146 changes: 86 additions & 60 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ RUN apt-get update \
# GENERAL PREREQUISITES
# ========================================

FROM base
FROM base AS prereqs

RUN apt-get update \
&& apt-get install -y curl unzip git bash-completion jq ssh sudo gnupg groff gcc vim python3 python3-pip \
Expand All @@ -24,6 +24,18 @@ RUN apt-get update \
# Adding GitHub public SSH key to known hosts
RUN ssh -T -o "StrictHostKeyChecking no" -o "PubkeyAuthentication no" [email protected] || true

# ========================================
# KAFKA MESSAGE PRODUCER
# ========================================

FROM prereqs

RUN apt-get update \
&& apt-get install -y kafkacat \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/kafkacat /usr/bin/kcat

# ========================================
# COPY SCRIPTS AND FILES
# ========================================
Expand All @@ -36,13 +48,13 @@ COPY src/temporary /tmp
# AWS CLI https://raw.githubusercontent.com/aws/aws-cli/v2/CHANGELOG.rst
# ========================================

ENV AWS_CLI_VERSION=2.17.23
ENV AWS_CLI_VERSION=2.18.3

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -s https://awscli.amazonaws.com/awscli-exe-linux-${BUILD_ARCHITECTURE}-${AWS_CLI_VERSION}.zip -o awscliv2.zip \
&& curl https://awscli.amazonaws.com/awscli-exe-linux-${BUILD_ARCHITECTURE}-${AWS_CLI_VERSION}.zip.sig -o awscliv2.sig \
curl -sSLo awscliv2.zip https://awscli.amazonaws.com/awscli-exe-linux-${BUILD_ARCHITECTURE}-${AWS_CLI_VERSION}.zip \
&& curl -sSLo awscliv2.sig https://awscli.amazonaws.com/awscli-exe-linux-${BUILD_ARCHITECTURE}-${AWS_CLI_VERSION}.zip.sig \
&& gpg --import /tmp/files/aws-cli.asc \
&& gpg --verify awscliv2.sig awscliv2.zip \
&& unzip awscliv2.zip \
Expand All @@ -61,9 +73,9 @@ ENV TERRAFORM_VERSION=1.5.7
RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip \
&& curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS \
&& curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS.sig \
curl -sSLO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip \
&& curl -sSLO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS \
&& curl -sSLO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS.sig \
&& gpg --import /tmp/files/hashicorp.asc \
&& gpg --verify terraform_${TERRAFORM_VERSION}_SHA256SUMS.sig terraform_${TERRAFORM_VERSION}_SHA256SUMS \
&& grep terraform_${TERRAFORM_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip terraform_${TERRAFORM_VERSION}_SHA256SUMS > terraform_${TERRAFORM_VERSION}_SHA256SUM \
Expand All @@ -77,43 +89,49 @@ RUN export BUILD_ARCHITECTURE=$(uname -m); \
# OpenTofu https://github.com/opentofu/opentofu/releases
# ========================================

ENV OPENTOFU_VERSION=1.8.0
ENV OPENTOFU_VERSION=1.8.3

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -LOs https://github.com/opentofu/opentofu/releases/download/v${OPENTOFU_VERSION}/tofu_${OPENTOFU_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip \
&& curl -LOs https://github.com/opentofu/opentofu/releases/download/v${OPENTOFU_VERSION}/tofu_${OPENTOFU_VERSION}_SHA256SUMS \
curl -sSLO https://github.com/opentofu/opentofu/releases/download/v${OPENTOFU_VERSION}/tofu_${OPENTOFU_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip \
&& curl -sSLO https://github.com/opentofu/opentofu/releases/download/v${OPENTOFU_VERSION}/tofu_${OPENTOFU_VERSION}_SHA256SUMS \
&& grep tofu_${OPENTOFU_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip tofu_${OPENTOFU_VERSION}_SHA256SUMS > tofu_${OPENTOFU_VERSION}_SHA256SUM \
&& shasum -a 256 -c tofu_${OPENTOFU_VERSION}_SHA256SUM \
&& /tmp/scripts/install-tofu.sh \
&& rm -f tofu_${OPENTOFU_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip tofu_${OPENTOFU_VERSION}_SHA256SUMS /tmp/scripts/install-tofu.sh
&& rm -f tofu_${OPENTOFU_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.zip tofu_${OPENTOFU_VERSION}_SHA256SUM* /tmp/scripts/install-tofu.sh


# ========================================
# TERRAGRUNT https://github.com/gruntwork-io/terragrunt/releases
# ========================================

ENV TERRAGRUNT_VERSION=0.66.1
ENV TERRAGRUNT_VERSION=0.68.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -Ls https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_linux_${BUILD_ARCHITECTURE_ARCH} -o terragrunt \
&& chmod +x terragrunt \
&& mv terragrunt /usr/local/bin/
curl -sSLO https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_linux_${BUILD_ARCHITECTURE_ARCH} \
&& curl -sSLO https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/SHA256SUMS \
&& grep terragrunt_linux_${BUILD_ARCHITECTURE_ARCH} SHA256SUMS > terragrunt_SHA256SUM \
&& shasum -a 256 -c terragrunt_SHA256SUM \
&& mv terragrunt_linux_${BUILD_ARCHITECTURE_ARCH} /usr/local/bin/terragrunt \
&& chmod +x /usr/local/bin/terragrunt \
&& rm -f SHA256SUMS terragrunt_SHA256SUM


# ========================================
# KUBECTL https://github.com/kubernetes/kubectl/tags
# ========================================


ENV KUBECTL_VERSION=1.30.3
ENV KUBECTL_VERSION=1.31.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -Ls https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/${BUILD_ARCHITECTURE_ARCH}/kubectl -o kubectl \
&& curl -Os https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/${BUILD_ARCHITECTURE_ARCH}/kubectl.sha256 \
curl -sSLO https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/${BUILD_ARCHITECTURE_ARCH}/kubectl \
&& curl -sSLO https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/${BUILD_ARCHITECTURE_ARCH}/kubectl.sha256 \
&& bash -c 'echo "$(<kubectl.sha256) kubectl" | sha256sum --check' \
&& chmod +x kubectl \
&& mv kubectl /usr/local/bin/ \
Expand All @@ -125,60 +143,50 @@ RUN export BUILD_ARCHITECTURE=$(uname -m); \
# ========================================


ENV KUSTOMIZE_VERSION=5.4.3
ENV KUSTOMIZE_VERSION=5.5.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -LOs https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -Ls https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/checksums.txt -o kustomize_checksums.txt \
&& grep kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz kustomize_checksums.txt > kustomize_linux_${BUILD_ARCHITECTURE_ARCH}_checksum.txt \
curl -sSLO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -sSLO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/checksums.txt \
&& grep kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz checksums.txt > kustomize_linux_${BUILD_ARCHITECTURE_ARCH}_checksum.txt \
&& shasum -a 256 -c kustomize_linux_${BUILD_ARCHITECTURE_ARCH}_checksum.txt \
&& tar -zxvf kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& rm kustomize_v${KUSTOMIZE_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& chmod +x kustomize \
&& mv kustomize /usr/local/bin/ \
&& rm -f kustomize_checksums.txt kustomize_linux_${BUILD_ARCHITECTURE_ARCH}_checksum.txt
&& rm -f checksums.txt kustomize_linux_${BUILD_ARCHITECTURE_ARCH}_checksum.txt


# ========================================
# HELM https://github.com/helm/helm/releases
# ========================================

ENV HELM_VERSION=3.15.3
ENV HELM_VERSION=3.16.2

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -Ls https://get.helm.sh/helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz -o helm.tgz \
&& tar -zxvf helm.tgz \
&& rm helm.tgz \
curl -sSLO https://get.helm.sh/helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -sSLO https://get.helm.sh/helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz.sha256sum \
&& shasum -a 256 -c helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz.sha256sum \
&& tar zxvf helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& mv linux-${BUILD_ARCHITECTURE_ARCH}/helm /usr/local/bin/ \
&& rm -R linux-${BUILD_ARCHITECTURE_ARCH} \
&& rm -R linux-${BUILD_ARCHITECTURE_ARCH} helm-v${HELM_VERSION}-linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz.* \
&& echo "source <(helm completion bash)" >> ~/.bashrc


# ========================================
# KAFKA MESSAGE PRODUCER
# ========================================

RUN apt-get update \
&& apt-get install -y kafkacat \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/kafkacat /usr/bin/kcat

# ========================================
# Flux CD https://github.com/fluxcd/flux2/releases
# ========================================

ENV FLUXCD_VERSION=2.3.0
ENV FLUXCD_VERSION=2.4.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -LOs https://github.com/fluxcd/flux2/releases/download/v${FLUXCD_VERSION}/flux_${FLUXCD_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -LO https://github.com/fluxcd/flux2/releases/download/v${FLUXCD_VERSION}/flux_${FLUXCD_VERSION}_checksums.txt \
curl -sSLO https://github.com/fluxcd/flux2/releases/download/v${FLUXCD_VERSION}/flux_${FLUXCD_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -sSLO https://github.com/fluxcd/flux2/releases/download/v${FLUXCD_VERSION}/flux_${FLUXCD_VERSION}_checksums.txt \
&& grep flux_${FLUXCD_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz flux_${FLUXCD_VERSION}_checksums.txt > flux_checksum.txt \
&& shasum -a 256 -c flux_checksum.txt \
&& tar zxvf flux_${FLUXCD_VERSION}_linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
Expand All @@ -190,12 +198,12 @@ RUN export BUILD_ARCHITECTURE=$(uname -m); \
# Go https://go.dev/dl/
# ========================================

ENV GO_VERSION=1.22.5
ENV GO_VERSION=1.23.2

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -LOs https://go.dev/dl/go${GO_VERSION}.linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz \
curl -sSLO https://go.dev/dl/go${GO_VERSION}.linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& tar -C /usr/local -xzf go${GO_VERSION}.linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& rm -f go${GO_VERSION}.linux-${BUILD_ARCHITECTURE_ARCH}.tar.gz

Expand All @@ -205,13 +213,13 @@ ENV PATH="${PATH}:/usr/local/go/bin"
# Eksctl https://github.com/eksctl-io/eksctl/releases
# ========================================

ENV EKSCTL_VERSION=0.188.0
ENV EKSCTL_VERSION=0.191.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -LOs https://github.com/eksctl-io/eksctl/releases/download/v${EKSCTL_VERSION}/eksctl_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -LO https://github.com/eksctl-io/eksctl/releases/download/v${EKSCTL_VERSION}/eksctl_checksums.txt \
curl -sSLO https://github.com/eksctl-io/eksctl/releases/download/v${EKSCTL_VERSION}/eksctl_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -sSLO https://github.com/eksctl-io/eksctl/releases/download/v${EKSCTL_VERSION}/eksctl_checksums.txt \
&& grep eksctl_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz eksctl_checksums.txt > eksctl_checksum.txt \
&& shasum -a 256 -c eksctl_checksum.txt \
&& tar zxvf eksctl_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
Expand All @@ -228,31 +236,49 @@ ENV K9S_VERSION=0.32.5
RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -Ls https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz -o k9s.tar.gz \
&& tar zxvf k9s.tar.gz \
curl -sSLO https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& curl -sSLO https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/checksums.sha256 \
&& grep k9s_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz checksums.sha256 | grep -v sbom > k9s_checksum.txt \
&& shasum -a 256 -c k9s_checksum.txt \
&& tar zxvf k9s_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz \
&& chmod +x k9s \
&& rm -rf k9s.tar.gz LICENSE README.md \
&& mv k9s /usr/local/bin/
&& mv k9s /usr/local/bin/ \
&& rm -rf LICENSE README.md k9s_Linux_${BUILD_ARCHITECTURE_ARCH}.tar.gz checksums.sha256

# ========================================
# Azure CLI https://learn.microsoft.com/en-us/cli/azure/release-notes-azure-cli
# 1Password CLI https://app-updates.agilebits.com/product_history/CLI2
# ========================================
ENV OP_CLI_VERSION=v2.30.0

ENV AZ_VERSION=2.63.0

RUN pip3 install azure-cli==${AZ_VERSION}
RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -sSLO https://cache.agilebits.com/dist/1P/op2/pkg/${OP_CLI_VERSION}/op_linux_${BUILD_ARCHITECTURE_ARCH}_${OP_CLI_VERSION}.zip \
&& unzip -od /usr/local/bin/ op_linux_${BUILD_ARCHITECTURE_ARCH}_${OP_CLI_VERSION}.zip \
&& rm op_linux_${BUILD_ARCHITECTURE_ARCH}_${OP_CLI_VERSION}.zip

# ========================================
# 1Password CLI https://app-updates.agilebits.com/product_history/CLI2
# Mimirtool https://github.com/grafana/mimir/releases/
# ========================================
ENV OP_CLI_VERSION=v2.30.0
ENV MIMIRTOOL_VERSION=2.13.0

RUN export BUILD_ARCHITECTURE=$(uname -m); \
if [ "$BUILD_ARCHITECTURE" = "x86_64" ]; then export BUILD_ARCHITECTURE_ARCH=amd64; fi; \
if [ "$BUILD_ARCHITECTURE" = "aarch64" ]; then export BUILD_ARCHITECTURE_ARCH=arm64; fi; \
curl -sSfo op.zip https://cache.agilebits.com/dist/1P/op2/pkg/${OP_CLI_VERSION}/op_linux_${BUILD_ARCHITECTURE_ARCH}_${OP_CLI_VERSION}.zip \
&& unzip -od /usr/local/bin/ op.zip \
&& rm op.zip
curl -sSLo mimirtool https://github.com/grafana/mimir/releases/download/mimir-${MIMIRTOOL_VERSION}/mimirtool-linux-${BUILD_ARCHITECTURE_ARCH} \
&& curl -sSLo mimirtool.sha256 https://github.com/grafana/mimir/releases/download/mimir-${MIMIRTOOL_VERSION}/mimirtool-linux-${BUILD_ARCHITECTURE_ARCH}-sha-256 \
&& bash -c 'echo "$(<mimirtool.sha256) mimirtool" | sha256sum --check' \
&& chmod +x mimirtool \
&& mv mimirtool /usr/local/bin/ \
&& rm -f mimirtool.sha256

# ========================================
# Azure CLI https://learn.microsoft.com/en-us/cli/azure/release-notes-azure-cli
# ========================================

ENV AZ_VERSION=2.65.0

RUN pip3 install azure-cli==${AZ_VERSION}

# ========================================
# END
Expand Down

0 comments on commit 275cb2e

Please sign in to comment.