diff --git a/.automation b/.automation index 9ba253a9a..d9d1790b6 160000 --- a/.automation +++ b/.automation @@ -1 +1 @@ -Subproject commit 9ba253a9adba51011ce74aa87e708015dafc75fc +Subproject commit d9d1790b621963adbda9a0ef53a3206529118668 diff --git a/.github/workflows/stackhpc-capi-all-in-one.yml b/.github/workflows/stackhpc-capi-all-in-one.yml new file mode 100644 index 000000000..398e6d52a --- /dev/null +++ b/.github/workflows/stackhpc-capi-all-in-one.yml @@ -0,0 +1,374 @@ +--- +# This reusable workflow deploys a VM on a cloud using Terraform, then deploys +# OpenStack in the VM via Kayobe. Tempest is then used to test the cloud. + +name: All in one + +on: + workflow_call: + inputs: + kayobe_image: + description: Kayobe container image + type: string + required: true + os_distribution: + description: Host OS distribution + type: string + default: centos + os_release: + description: Host OS release + type: string + default: 8-stream + ssh_username: + description: User for terraform to access the all-in-one VM + type: string + default: cloud-user + neutron_plugin: + description: Neutron ML2 plugin + type: string + required: true + vm_image: + description: Image for the all-in-one VM + type: string + default: bb8c0a34-533f-42fb-a49b-3461e677f3f6 + vm_interface: + description: Default network interface name + type: string + default: eth0 + vm_flavor: + description: Flavor for the all-in-one VM + type: string + default: general.v1.medium + vm_network: + description: Network for the all-in-one VM + type: string + default: stackhpc-release + vm_subnet: + description: Subnet for the all-in-one VM + type: string + default: stackhpc-release-subnet + OS_CLOUD: + description: Name of cloud in clouds.yaml + type: string + required: true + secrets: + KAYOBE_VAULT_PASSWORD: + required: true + CLOUDS_YAML: + required: true + OS_APPLICATION_CREDENTIAL_ID: + required: true + OS_APPLICATION_CREDENTIAL_SECRET: + required: true + +jobs: + # NOTE: Runner needs unzip and nodejs packages. + all-in-one: + name: All in one + runs-on: [self-hosted, stackhpc-kayobe-config-aio] + permissions: {} + env: + KAYOBE_ENVIRONMENT: ci-capi-aio + KAYOBE_VAULT_PASSWORD: ${{ secrets.KAYOBE_VAULT_PASSWORD }} + KAYOBE_IMAGE: ${{ inputs.kayobe_image }} + steps: + - uses: actions/checkout@v3 + with: + submodules: true + + - name: Install terraform + uses: hashicorp/setup-terraform@v2 + + - name: Initialise terraform + run: terraform init + working-directory: ${{ github.workspace }}/terraform/aio + + - name: Generate SSH keypair + run: ssh-keygen -f id_rsa -N '' + working-directory: ${{ github.workspace }}/terraform/aio + + - name: Generate clouds.yaml + run: | + cat << EOF > clouds.yaml + ${{ secrets.CLOUDS_YAML }} + EOF + working-directory: ${{ github.workspace }}/terraform/aio + + - name: Generate terraform.tfvars + run: | + cat << EOF > terraform.tfvars + ssh_public_key = "id_rsa.pub" + ssh_username = "${{ env.SSH_USERNAME }}" + aio_vm_interface = "${{ env.VM_INTERFACE }}" + aio_vm_name = "${{ env.VM_NAME }}" + aio_vm_image = "${{ env.VM_IMAGE }}" + aio_vm_flavor = "${{ env.VM_FLAVOR }}" + aio_vm_network = "${{ env.VM_NETWORK }}" + aio_vm_subnet = "${{ env.VM_SUBNET }}" + EOF + working-directory: ${{ github.workspace }}/terraform/aio + env: + SSH_USERNAME: "${{ inputs.ssh_username }}" + VM_NAME: "skc-ci-aio-${{ inputs.neutron_plugin }}-${{ github.run_id }}" + VM_IMAGE: ${{ inputs.vm_image }} + VM_FLAVOR: ${{ inputs.vm_flavor }} + VM_NETWORK: ${{ inputs.vm_network }} + VM_SUBNET: ${{ inputs.vm_subnet }} + VM_INTERFACE: ${{ inputs.vm_interface }} + + - name: Terraform Plan + run: terraform plan + working-directory: ${{ github.workspace }}/terraform/aio + env: + OS_CLOUD: ${{ inputs.OS_CLOUD }} + OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} + OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} + + - name: Terraform Apply + run: terraform apply -auto-approve + working-directory: ${{ github.workspace }}/terraform/aio + env: + OS_CLOUD: ${{ inputs.OS_CLOUD }} + OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} + OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} + + - name: Get Terraform outputs + id: tf_outputs + run: | + terraform output -json + working-directory: ${{ github.workspace }}/terraform/aio + + - name: Write Terraform outputs + run: | + cat << EOF > etc/kayobe/environments/$KAYOBE_ENVIRONMENT/tf-outputs.yml + ${{ steps.tf_outputs.outputs.stdout }} + EOF + + - name: Write Terraform network config + run: | + cat << EOF > etc/kayobe/environments/$KAYOBE_ENVIRONMENT/tf-networks.yml + + admin_oc_net_name: admin + admin_cidr: "{{ access_cidr.value }}" + admin_allocation_pool_start: 0.0.0.0 + admin_allocation_pool_end: 0.0.0.0 + admin_gateway: "{{ access_gw.value }}" + admin_bootproto: dhcp + admin_ips: + controller0: "{{ access_ip_v4.value }}" + EOF + + - name: Write Terraform network interface config + run: | + cat << EOF > etc/kayobe/environments/$KAYOBE_ENVIRONMENT/inventory/group_vars/controllers/tf-network-interfaces + admin_interface: "{{ access_interface.value }}" + EOF + + - name: Write all-in-one scenario config + run: | + cat << EOF > etc/kayobe/environments/$KAYOBE_ENVIRONMENT/zz-aio-scenario.yml + --- + os_distribution: ${{ env.OS_DISTRIBUTION }} + os_release: "${{ env.OS_RELEASE }}" + kolla_enable_ovn: ${{ env.ENABLE_OVN }} + EOF + env: + ENABLE_OVN: ${{ inputs.neutron_plugin == 'ovn' }} + OS_DISTRIBUTION: ${{ inputs.os_distribution }} + OS_RELEASE: ${{ inputs.os_release }} + + # Use a heredoc to define a multiline string output + # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings + - name: Set SSH key output + id: ssh_key + run: | + echo "ssh_key<> $GITHUB_OUTPUT + cat terraform/aio/id_rsa >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + # The same tag may be reused (e.g. pr-123), so ensure we have the latest image. + - name: Pull latest Kayobe image + run: | + sudo docker image pull $KAYOBE_IMAGE + + - name: Host configure + run: | + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/overcloud-host-configure.sh + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Magnum container build + run: | + sudo -E docker run -it --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/overcloud-container-image-build.sh magnum + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Install management cluster + run: | + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/overcloud-host-command-run.sh --command $MGMT_SCRIPT -l controllers + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + MGMT_SCRIPT: | + # # Install `kubectl` CLI + curl -fsLo /tmp/kubectl "https://dl.k8s.io/release/$(curl -fsL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + sudo install -o root -g root -m 0755 /tmp/kubectl /usr/local/bin/kubectl + + # Install k3s + curl -fsL https://get.k3s.io | sudo bash -s - --disable traefik + + # copy kubeconfig file into standard location + mkdir -p $HOME/.kube + sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config + sudo chown $USER $HOME/.kube/config + + # Install helm + curl -fsL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + + # Install cert manager + helm upgrade cert-manager cert-manager \ + --install \ + --namespace cert-manager \ + --create-namespace \ + --repo https://charts.jetstack.io \ + --version v1.11.1 \ + --set installCRDs=true \ + --wait + + # Install Cluster API resources + mkdir -p capi + cat < capi/kustomization.yaml + --- + resources: + - https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.3.3/cluster-api-components.yaml + - https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/download/v0.7.1/infrastructure-components.yaml + patches: + - patch: |- + - op: replace + path: /spec/template/spec/containers/0/args + value: + - --leader-elect + - --metrics-bind-addr=localhost:8080 + target: + kind: Deployment + namespace: capi-system + name: capi-controller-manager + - patch: |- + - op: replace + path: /spec/template/spec/containers/0/args + value: + - --leader-elect + - --metrics-bind-addr=localhost:8080 + target: + kind: Deployment + namespace: capi-kubeadm-bootstrap-system + name: capi-kubeadm-bootstrap-controller-manager + - patch: |- + - op: replace + path: /spec/template/spec/containers/0/args + value: + - --leader-elect + - --metrics-bind-addr=localhost:8080 + target: + kind: Deployment + namespace: capi-kubeadm-control-plane-system + name: capi-kubeadm-control-plane-controller-manager + EOF + kubectl apply -k capi + + # Install addon manager + helm upgrade cluster-api-addon-provider cluster-api-addon-provider \ + --install \ + --repo https://stackhpc.github.io/cluster-api-addon-provider \ + --version 0.1.0-dev.0.main.26 \ + --namespace capi-addon-system \ + --create-namespace \ + --wait \ + --timeout 30m + + sudo dnf install -y python3-pip + + sudo pip3 install python-magnumclient kubernetes + + - name: Get kubeconfig + run: | + echo "kubeconfig<> $GITHUB_OUTPUT + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/overcloud-host-command-run.sh --command "cat ~/.kube/config" -l controllers >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Set kubeconfig + run: | + echo $KUBECONFIG > etc/kayobe/environments/$KAYOBE_ENVIRONMENT/kolla/config/magnum/kubeconfig + + - name: Service deploy + run: | + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/overcloud-service-deploy.sh + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Configure aio resources + run: | + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/playbook-run.sh etc/kayobe/ansible/configure-aio-resources.yml + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Tempest tests + run: | + mkdir -p tempest-artifacts + sudo -E docker run -t --rm \ + -v $(pwd):/stack/kayobe-automation-env/src/kayobe-config \ + -v $(pwd)/tempest-artifacts:/stack/tempest-artifacts \ + -e KAYOBE_ENVIRONMENT -e KAYOBE_VAULT_PASSWORD -e KAYOBE_AUTOMATION_SSH_PRIVATE_KEY \ + $KAYOBE_IMAGE \ + /stack/kayobe-automation-env/src/kayobe-config/.automation/pipeline/tempest.sh -e ansible_user=stack + env: + KAYOBE_AUTOMATION_SSH_PRIVATE_KEY: ${{ steps.ssh_key.outputs.ssh_key }} + + - name: Upload test result artifacts + uses: actions/upload-artifact@v3 + with: + name: tempest-results-${{ inputs.os_distribution }}-${{ inputs.os_release }}-${{ inputs.neutron_plugin }} + path: tempest-artifacts/* + + - name: Fail if any Tempest tests failed + run: | + test $(wc -l < tempest-artifacts/failed-tests) -lt 1 + + - name: Destroy + run: terraform destroy -auto-approve + working-directory: ${{ github.workspace }}/terraform/aio + env: + OS_CLOUD: ${{ inputs.OS_CLOUD }} + OS_APPLICATION_CREDENTIAL_ID: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} + OS_APPLICATION_CREDENTIAL_SECRET: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} + if: always() + + - name: Prune Docker images over 1 week old + # May fail if another prune is running + run: sudo docker image prune --all --force --filter until=168h || true + if: always() diff --git a/doc/source/contributor/environments/ci-multinode.rst b/doc/source/contributor/environments/ci-multinode.rst index 93341113a..9f266d97b 100644 --- a/doc/source/contributor/environments/ci-multinode.rst +++ b/doc/source/contributor/environments/ci-multinode.rst @@ -203,3 +203,124 @@ instance: ls testdir If it shows the test file then the share is working correctly. + +Magnum +====== + +The Multinode environment has Magnum enabled by default. To test it, you will +need to create a Kubernetes cluster. It is recommended that you use the +specified Fedora 35 image, as others may not work. Download the image locally, +then extract it and upload it to glance: + +.. code-block:: bash + + wget https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/35.20220410.3.1/x86_64/fedora-coreos-35.20220410.3.1-openstack.x86_64.qcow2.xz + unxz fedora-coreos-35.20220410.3.1-openstack.x86_64.qcow2.xz + openstack image create --container-format bare --disk-format qcow2 --property os_distro='fedora-coreos' --property os_version='35' --file fedora-coreos-35.20220410.3.1-openstack.x86_64.qcow2 fedora-coreos-35 --progress + +Create a keypair: + +.. code-block:: bash + + openstack keypair create --private-key ~/.ssh/id_rsa id_rsa + +Install the Magnum, Heat, and Octavia clients: + +.. code-block:: bash + + pip install python-magnumclient + pip install python-heatclient + pip install python-octaviaclient + +Create a cluster template: + +.. code-block:: bash + + openstack coe cluster template create test-template --image fedora-coreos-35 --external-network external --labels etcd_volume_size=8,boot_volume_size=50,cloud_provider_enabled=true,heat_container_agent_tag=wallaby-stable-1,kube_tag=v1.23.6,cloud_provider_tag=v1.23.1,monitoring_enabled=true,auto_scaling_enabled=true,auto_healing_enabled=true,auto_healing_controller=magnum-auto-healer,magnum_auto_healer_tag=v1.23.0.1-shpc,etcd_tag=v3.5.4,master_lb_floating_ip_enabled=true,cinder_csi_enabled=true,container_infra_prefix=ghcr.io/stackhpc/,min_node_count=1,max_node_count=50,octavia_lb_algorithm=SOURCE_IP_PORT,octavia_provider=ovn --dns-nameserver 8.8.8.8 --flavor m1.medium --master-flavor m1.medium --network-driver calico --volume-driver cinder --docker-storage-driver overlay2 --floating-ip-enabled --master-lb-enabled --coe kubernetes + +Create a cluster: + +.. code-block:: bash + + openstack coe cluster create --keypair id_rsa --master-count 1 --node-count 1 --floating-ip-enabled test-cluster + +This command will take a while to complete. You can monitor the progress with +the following command: + +.. code-block:: bash + + watch "openstack --insecure coe cluster list ; openstack --insecure stack list ; openstack --insecure server list" + +Once the cluster is created, you can SSH into the master node and check that +there are no failed containers: + +.. code-block:: bash + + ssh core@{master-ip} + +List the podman and docker containers: + +.. code-block:: bash + + sudo docker ps + sudo podman ps + +If there are any failed containers, you can check the logs with the following +commands: + +.. code-block:: bash + + sudo docker logs {container-id} + sudo podman logs {container-id} + +Or look at the logs under ``/var/log``. In particular, pay close attention to +``/var/log/heat-config`` on the master and +``/var/log/kolla/{magnum,heat,neutron}/*`` on the controllers. + +Otherwise, the ``state`` of the cluster should eventually become +``CREATE_COMPLETE`` and the ``health_status`` should be ``HEALTHY``. + +You can interact with the cluster using ``kubectl``. The instructions for +installing ``kubectl`` are available `here +`_. You can then +configure ``kubectl`` to use the cluster, and check that the pods are all +running: + +.. code-block:: bash + + openstack coe cluster config test-cluster --dir $PWD + export KUBECONFIG=$PWD/config + kubectl get pods -A + +Finally, you can optionally use sonobuoy to run a complete set of Kubernetes +conformance tests. + +Find the latest release of sonobuoy on their `github releases page +`_. Then download it with wget, e.g.: + +.. code-block:: bash + + wget https://github.com/vmware-tanzu/sonobuoy/releases/download/v0.56.16/sonobuoy_0.56.16_linux_amd64.tar.gz + +Extract it with tar: + +.. code-block:: bash + + tar -xvf sonobuoy_0.56.16_linux_amd64.tar.gz + +And run it: + +.. code-block:: bash + + ./sonobuoy run --wait + +This will take a while to complete. Once it is done you can check the results +with: + +.. code-block:: bash + + results=$(./sonobuoy retrieve) + ./sonobuoy results $results + +There are various other options for sonobuoy, see the `documentation +`_ for more details. diff --git a/etc/kayobe/ansible/cephadm-commands-post.yml b/etc/kayobe/ansible/cephadm-commands-post.yml index fbca30dfd..d60a135a3 100644 --- a/etc/kayobe/ansible/cephadm-commands-post.yml +++ b/etc/kayobe/ansible/cephadm-commands-post.yml @@ -10,4 +10,4 @@ - import_role: name: stackhpc.cephadm.commands vars: - cephadm_commands: "{{ cephadm_commands_post }}" + cephadm_commands: "{{ cephadm_commands_post | default([]) }}" diff --git a/etc/kayobe/ansible/cephadm-commands-pre.yml b/etc/kayobe/ansible/cephadm-commands-pre.yml index 08047cc51..abe58caa5 100644 --- a/etc/kayobe/ansible/cephadm-commands-pre.yml +++ b/etc/kayobe/ansible/cephadm-commands-pre.yml @@ -10,4 +10,4 @@ - import_role: name: stackhpc.cephadm.commands vars: - cephadm_commands: "{{ cephadm_commands_pre }}" + cephadm_commands: "{{ cephadm_commands_pre | default([]) }}" diff --git a/etc/kayobe/ansible/configure-aio-resources.yml b/etc/kayobe/ansible/configure-aio-resources.yml index 48263c641..643d61756 100644 --- a/etc/kayobe/ansible/configure-aio-resources.yml +++ b/etc/kayobe/ansible/configure-aio-resources.yml @@ -31,6 +31,20 @@ name: python-openstackclient virtualenv: '{{ venv }}' extra_args: -c "{{ pip_upper_constraints_file }}" + + - name: Ensure magnum openstack client is installed + pip: + name: python-magnumclient + virtualenv: '{{ venv }}' + extra_args: -c "{{ pip_upper_constraints_file }}" + + - name: Ensure octavia openstack client is installed + pip: + name: + - python-octaviaclient + - munch + virtualenv: '{{ venv }}' + extra_args: -c "{{ pip_upper_constraints_file }}" - name: Include kolla secrets include_vars: @@ -69,3 +83,25 @@ OS_IDENTITY_API_VERSION: 3 OS_REGION_NAME: RegionOne OS_AUTH_PLUGIN: password + + - name: Run aio-magnum-init + script: + cmd: scripts/aio-magnum-init.sh + creates: /tmp/.init-runonce + environment: + KOLLA_OPENSTACK_COMMAND: '{{ venv }}/bin/openstack' + OS_PROJECT_DOMAIN_NAME: Default + OS_USER_DOMAIN_NAME: Default + OS_PROJECT_NAME: admin + OS_TENANT_NAME: admin + OS_USERNAME: admin + OS_PASSWORD: "{{ kolla_passwords.keystone_admin_password | mandatory('Could\ + \ not find keystone_admin_password in passwords.yml') }}" + # Use kolla_external_fqdn in wallaby + OS_AUTH_URL: http://{{ kolla_external_fqdn | default(public_net_name + | net_fqdn) | default(public_net_name | net_vip_address, true) }}:5000 + OS_INTERFACE: public + OS_ENDPOINT_TYPE: publicURL + OS_IDENTITY_API_VERSION: 3 + OS_REGION_NAME: RegionOne + OS_AUTH_PLUGIN: password diff --git a/etc/kayobe/ansible/octavia-amphora-image-build.yml b/etc/kayobe/ansible/octavia-amphora-image-build.yml index 8272b1f69..e8c003204 100644 --- a/etc/kayobe/ansible/octavia-amphora-image-build.yml +++ b/etc/kayobe/ansible/octavia-amphora-image-build.yml @@ -11,6 +11,7 @@ RedHat: - debootstrap - qemu-img + - python3-virtualenv - git - e2fsprogs - policycoreutils-python-utils diff --git a/etc/kayobe/ansible/scripts/aio-init.sh b/etc/kayobe/ansible/scripts/aio-init.sh index 817225dd2..e63a10c8f 100644 --- a/etc/kayobe/ansible/scripts/aio-init.sh +++ b/etc/kayobe/ansible/scripts/aio-init.sh @@ -1,7 +1,4 @@ #!/bin/bash - -#!/bin/bash - set -o errexit set -o pipefail @@ -142,4 +139,4 @@ if ! $KOLLA_OPENSTACK_COMMAND flavor list | grep -q m1.tiny; then $KOLLA_OPENSTACK_COMMAND flavor create --id 5 --ram 16384 --disk 160 --vcpus 8 m1.xlarge fi -touch /tmp/.init-runonce \ No newline at end of file +touch /tmp/.init-runonce diff --git a/etc/kayobe/ansible/scripts/aio-magnum-init.sh b/etc/kayobe/ansible/scripts/aio-magnum-init.sh new file mode 100644 index 000000000..cd0304f37 --- /dev/null +++ b/etc/kayobe/ansible/scripts/aio-magnum-init.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +set -o errexit +set -o pipefail + +KOLLA_OPENSTACK_COMMAND=${KOLLA_OPENSTACK_COMMAND:-openstack} +IMAGE_PATH='./' + +if [[ $KOLLA_DEBUG -eq 1 ]]; then + set -o xtrace + KOLLA_OPENSTACK_COMMAND="$KOLLA_OPENSTACK_COMMAND --debug" +fi + +if ! $KOLLA_OPENSTACK_COMMAND flavor list | grep -q ds2G20; then + echo Creating flavor ds2G20 for ubuntu image + $KOLLA_OPENSTACK_COMMAND flavor create ds2G20 --ram 2048 --disk 20 --id d5 --vcpus 2 --public +fi + + +if ! $KOLLA_OPENSTACK_COMMAND image list | grep -q ubuntu-2004-kube-v1.26.0; then + echo Downloading ubuntu k8s image.. + + curl -L --fail -o ${IMAGE_PATH}ubuntu-2004-kube-v1.26.0.qcow2 https://minio.services.osism.tech/openstack-k8s-capi-images/ubuntu-2004-kube-v1.26/ubuntu-2004-kube-v1.26.0.qcow2 + $KOLLA_OPENSTACK_COMMAND image create ubuntu-2004-kube-v1.26.0 \ + --file ${IMAGE_PATH}/ubuntu-2004-kube-v1.26.0.qcow2 \ + --disk-format qcow2 \ + --container-format bare \ + --public + $KOLLA_OPENSTACK_COMMAND image set ubuntu-2004-kube-v1.26.0 --os-distro ubuntu --os-version 20.04 + + echo Registering new driver template.. + + $KOLLA_OPENSTACK_COMMAND coe cluster template create new_driver \ + --coe kubernetes \ + --image ubuntu-2004-kube-v1.26.0 \ + --external-network public1 \ + --label kube_tag=v1.26.0 \ + --master-flavor ds2G20 \ + --flavor ds2G20 \ + --public \ + --master-lb-enabled +fi + +#old driver +if ! $KOLLA_OPENSTACK_COMMAND image list | grep -q fedora-coreos-35.20220116.3.0-openstack.x86_64; then + echo Downloading fedora image... + curl -L --fail -o ${IMAGE_PATH}/fedora-coreos-35.20220116.3.0-openstack.x86_64.qcow2.xz https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/35.20220116.3.0/x86_64/fedora-coreos-35.20220116.3.0-openstack.x86_64.qcow2.xz + unxz ${IMAGE_PATH}/fedora-coreos-35.20220116.3.0-openstack.x86_64.qcow2.xz + + $KOLLA_OPENSTACK_COMMAND image create fedora-coreos-35.20220116.3.0-openstack.x86_64 \ + --file ${IMAGE_PATH}/fedora-coreos-35.20220116.3.0-openstack.x86_64.qcow2 \ + --disk-format qcow2 \ + --container-format bare \ + --public + $KOLLA_OPENSTACK_COMMAND image set fedora-coreos-35.20220116.3.0-openstack.x86_64 --os-distro fedora-coreos + + echo Creating old driver template... + $KOLLA_OPENSTACK_COMMAND coe cluster template create old_driver \ + --coe kubernetes \ + --image fedora-coreos-35.20220116.3.0-openstack.x86_64 \ + --external-network public1 \ + --master-flavor m1.medium \ + --flavor m1.medium \ + --public +fi + +#setup octavia management network to be reachable from control plane +if ! $KOLLA_OPENSTACK_COMMAND router list | grep -q lb-rtr; then + echo Ensuring control plane access to octavia network... + $KOLLA_OPENSTACK_COMMAND router create lb-rtr --disable-snat --external-gateway public1 + $KOLLA_OPENSTACK_COMMAND router add subnet lb-rtr lb-mgmt-subnet + ROUTER_IP=$($KOLLA_OPENSTACK_COMMAND router show lb-rtr -f json | jq '.external_gateway_info.external_fixed_ips[].ip_address') + SUBNET_CIDR=$($KOLLA_OPENSTACK_COMMAND subnet show lb-mgmt-subnet -f json | jq '.cidr') + + eval sudo ip r add $SUBNET_CIDR via $ROUTER_IP +fi diff --git a/etc/kayobe/environments/aio/centos.yml b/etc/kayobe/environments/aio/centos.yml new file mode 100644 index 000000000..9631e8896 --- /dev/null +++ b/etc/kayobe/environments/aio/centos.yml @@ -0,0 +1,2 @@ +--- +bootstrap_user: cloud-user diff --git a/etc/kayobe/environments/aio/inventory/group_vars/all/dev-tools b/etc/kayobe/environments/aio/inventory/group_vars/all/dev-tools new file mode 100644 index 000000000..f60fe8cd1 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/all/dev-tools @@ -0,0 +1,6 @@ +--- + +dev_tools_packages: + - tcpdump + - vim + - telnet diff --git a/etc/kayobe/environments/aio/inventory/group_vars/compute/network-interfaces b/etc/kayobe/environments/aio/inventory/group_vars/compute/network-interfaces new file mode 100644 index 000000000..a2aca2528 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/compute/network-interfaces @@ -0,0 +1,17 @@ +--- +############################################################################### +# Network interface definitions for the compute group. + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use eth1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['eth1'] if 'ansible_eth1' in hostvars[inventory_hostname] else [] }}" + +# Ceph storage network IP information. +# ceph_storage_net_interface: +# ceph_storage_net_bridge_ports: +# ceph_storage_net_bond_slaves: + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/inventory/group_vars/controllers/network-interfaces b/etc/kayobe/environments/aio/inventory/group_vars/controllers/network-interfaces new file mode 100644 index 000000000..21a1c9256 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/controllers/network-interfaces @@ -0,0 +1,15 @@ +--- +############################################################################### +# Network interface definitions for the controller group. + +admin_interface: "{{ terraform_state_access_interface }}" + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use eth1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['eth1'] if 'ansible_eth1' in hostvars[inventory_hostname] else [] }}" +aio_zone: public + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/inventory/group_vars/monitoring/network-interfaces b/etc/kayobe/environments/aio/inventory/group_vars/monitoring/network-interfaces new file mode 100644 index 000000000..71db21a6d --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/monitoring/network-interfaces @@ -0,0 +1,12 @@ +--- +############################################################################### +# Network interface definitions for the monitoring group. + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use eth1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['eth1'] if 'ansible_eth1' in hostvars[inventory_hostname] else [] }}" + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/inventory/group_vars/network/network-interfaces b/etc/kayobe/environments/aio/inventory/group_vars/network/network-interfaces new file mode 100644 index 000000000..e07607c74 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/network/network-interfaces @@ -0,0 +1,12 @@ +--- +############################################################################### +# Network interface definitions for the controller group. + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use eth1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['eth1'] if 'ansible_eth1' in hostvars[inventory_hostname] else [] }}" + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/inventory/group_vars/overcloud/ansible-python-interpreter b/etc/kayobe/environments/aio/inventory/group_vars/overcloud/ansible-python-interpreter new file mode 100644 index 000000000..54abbf23c --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/overcloud/ansible-python-interpreter @@ -0,0 +1,3 @@ +--- +# Use a virtual environment for remote operations. +ansible_python_interpreter: "{{ virtualenv_path }}/kayobe/bin/python" diff --git a/etc/kayobe/environments/aio/inventory/group_vars/seed-hypervisor/ansible-python-interpreter b/etc/kayobe/environments/aio/inventory/group_vars/seed-hypervisor/ansible-python-interpreter new file mode 100644 index 000000000..54abbf23c --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/seed-hypervisor/ansible-python-interpreter @@ -0,0 +1,3 @@ +--- +# Use a virtual environment for remote operations. +ansible_python_interpreter: "{{ virtualenv_path }}/kayobe/bin/python" diff --git a/etc/kayobe/environments/aio/inventory/group_vars/seed/network-interfaces b/etc/kayobe/environments/aio/inventory/group_vars/seed/network-interfaces new file mode 100644 index 000000000..3cb9db178 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/group_vars/seed/network-interfaces @@ -0,0 +1,14 @@ +--- +############################################################################### +# Network interface definitions for the seed group. + +admin_interface: "{{ terraform_state_access_interface }}" + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use eth1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['eth1'] if 'ansible_eth1' in hostvars[inventory_hostname] else [] }}" + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/inventory/groups b/etc/kayobe/environments/aio/inventory/groups new file mode 100644 index 000000000..7a1971bec --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/groups @@ -0,0 +1,86 @@ +# Kayobe groups inventory file. This file should generally not be modified. +# If declares the top-level groups and sub-groups. + +############################################################################### +# Seed groups. + +[seed] +# Empty group to provide declaration of seed group. + +[seed-hypervisor] +# Empty group to provide declaration of seed-hypervisor group. + +[container-image-builders:children] +# Build container images on the seed by default. +controllers + +[docker-registry:children] +seed + +############################################################################### +# Overcloud groups. + +[controllers] +# Empty group to provide declaration of controllers group. + +[network:children] +# Add controllers to network group by default for backwards compatibility, +# although they could be separate hosts. +controllers + +[monitoring] +# Empty group to provide declaration of monitoring group. + +[storage] +# Empty group to provide declaration of storage group. + +[compute] +# Empty group to provide declaration of compute group. + +[ceph] +# Empty group declaration of ceph group. + +[overcloud:children] +controllers +network +monitoring +storage +compute +ceph + +############################################################################### +# Docker groups. + +[docker:children] +# Hosts in this group will have Docker installed. +seed +overcloud + +[docker-registry:children] +# Hosts in this group will have a Docker Registry deployed. This group should +# generally contain only a single host, to avoid deploying multiple independent +# registries which may become unsynchronized. +seed + +############################################################################### +# Baremetal compute node groups. + +[baremetal-compute] +# Empty group to provide declaration of baremetal-compute group. + +############################################################################### +# Networking groups. + +[mgmt-switches] +# Empty group to provide declaration of mgmt-switches group. + +[ctl-switches] +# Empty group to provide declaration of ctl-switches group. + +[hs-switches] +# Empty group to provide declaration of hs-switches group. + +[switches:children] +mgmt-switches +ctl-switches +hs-switches diff --git a/etc/kayobe/environments/aio/inventory/hosts b/etc/kayobe/environments/aio/inventory/hosts new file mode 100644 index 000000000..2355dca3c --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/hosts @@ -0,0 +1,36 @@ +# Kayobe hosts inventory file. This file should be modified to define the hosts +# and their top-level group membership. + +# This host acts as the configuration management Ansible control host. This must be +# localhost. +localhost ansible_connection=local + +[seed-hypervisor] +# Add a seed hypervisor node here if required. This host will run a seed node +# Virtual Machine. + +[seed] +# Add a seed node here if required. This host will provide the Bifrost +# undercloud. +seed0 + +[controllers] +controller0 + +[compute:children] +controllers + +[monitoring:children] +controllers + +[baremetal-compute] +# Add baremetal compute nodes here if required. + +[mgmt-switches] +# Add management network switches here if required. + +[ctl-switches] +# Add control and provisioning switches here if required. + +[hs-switches] +# Add high speed switches here if required. diff --git a/etc/kayobe/environments/aio/inventory/kayobe-automation b/etc/kayobe/environments/aio/inventory/kayobe-automation new file mode 100644 index 000000000..502c43ca1 --- /dev/null +++ b/etc/kayobe/environments/aio/inventory/kayobe-automation @@ -0,0 +1,2 @@ +[tempest_runner] +controller0 \ No newline at end of file diff --git a/etc/kayobe/environments/aio/kolla.yml b/etc/kayobe/environments/aio/kolla.yml new file mode 100644 index 000000000..52e3797c1 --- /dev/null +++ b/etc/kayobe/environments/aio/kolla.yml @@ -0,0 +1,31 @@ +--- +# Kayobe Kolla configuration. + +# Whether TLS is enabled for the external API endpoints. Default is 'no'. +kolla_enable_tls_external: false + +############################################################################### +# Kolla feature flag configuration. + +kolla_enable_neutron_agent_ha: false +kolla_enable_prometheus: true +kolla_enable_ironic: false +kolla_enable_etcd: true + +############################################################################### +# TLS certificate bundle management + +# External API certificate bundle. +# +# When kolla_enable_tls_external is true, this should contain an X.509 +# certificate bundle for the external API. +# +# Note that this should be formatted as a literal style block scalar. +# +# NOTE: kolla_tls_cert has been renamed to kolla_external_tls_cert. Support for +# the deprecated name kolla_tls_cert will be removed in a future release. +kolla_external_tls_cert: + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/aio/kolla/config/magnum/kubeconfig b/etc/kayobe/environments/aio/kolla/config/magnum/kubeconfig new file mode 100644 index 000000000..e69de29bb diff --git a/etc/kayobe/environments/aio/kolla/config/neutron/ml2_conf.ini b/etc/kayobe/environments/aio/kolla/config/neutron/ml2_conf.ini new file mode 100644 index 000000000..a5ccdaf4c --- /dev/null +++ b/etc/kayobe/environments/aio/kolla/config/neutron/ml2_conf.ini @@ -0,0 +1,2 @@ +[ml2] +extension_drivers = port_security diff --git a/etc/kayobe/environments/aio/kolla/globals.yml b/etc/kayobe/environments/aio/kolla/globals.yml new file mode 100644 index 000000000..bd54118b6 --- /dev/null +++ b/etc/kayobe/environments/aio/kolla/globals.yml @@ -0,0 +1,42 @@ +--- +# COMMENTED for linter {% raw %} +keystone_identity_providers: + - name: "openstack" + openstack_domain: "Default" + protocol: "openid" + identifier: "http://10.60.210.1:8080/auth/realms/openstack" + public_name: "Authenticate via keycloak" + attribute_mapping: "attribute_mapping_keycloak_openstack" + metadata_folder: "{{ node_custom_config }}/keystone/identity-metadata" + certificate_file: "{{ node_custom_config }}/keystone/identity-certificate.pem" +keystone_identity_mappings: + - name: "attribute_mapping_keycloak_openstack" + file: "{{ node_custom_config }}/keystone/identity-mappings.json" +# COMMENTED for linter {% endraw %} + +# Disabled until keycloak installation is automated +enable_keystone_federation: false + +# List of projects to add the caso user to. +caso_projects: + - service + +# Get kolla-ansible to configure firewalld +disable_firewall: false +enable_external_api_firewalld: true + +# Elasticsearch memory tuning +es_heap_size: 1g + +############################################################################## +# Octavia networking +octavia_amp_network: + name: lb-mgmt-net + shared: false + subnet: + name: lb-mgmt-subnet + cidr: "{% raw %}{{ octavia_amp_network_cidr }}{% endraw %}" + allocation_pool_start: "10.1.0.100" + allocation_pool_end: "10.1.0.200" + gateway_ip: "10.1.0.1" + enable_dhcp: yes diff --git a/etc/kayobe/environments/aio/stackhpc-ci.yml b/etc/kayobe/environments/aio/stackhpc-ci.yml new file mode 100644 index 000000000..9ead2b93e --- /dev/null +++ b/etc/kayobe/environments/aio/stackhpc-ci.yml @@ -0,0 +1,73 @@ +--- +############################################################################### +# Kolla configuration. + +# Kolla feature flag configuration. +kolla_enable_barbican: true +kolla_enable_central_logging: true +#kolla_enable_cinder: true +kolla_enable_magnum: true +kolla_enable_octavia: true + +############################################################################### +# StackHPC configuration. + +# Host and port of a package repository mirror. +# Build and deploy the development Pulp service repositories. +stackhpc_repo_mirror_url: "https://pulp.128-232-222-245.sslip.io" + +# Build and deploy released Pulp repository versions. +stackhpc_repo_centos_stream_baseos_version: "{{ stackhpc_pulp_repo_centos_stream_8_baseos_version }}" +stackhpc_repo_centos_stream_appstream_version: "{{ stackhpc_pulp_repo_centos_stream_8_appstream_version }}" +stackhpc_repo_centos_stream_extras_version: "{{ stackhpc_pulp_repo_centos_stream_8_extras_version }}" +stackhpc_repo_epel_version: "{{ stackhpc_pulp_repo_epel_version }}" +stackhpc_repo_epel_modular_version: "{{ stackhpc_pulp_repo_epel_modular_version }}" +stackhpc_repo_docker_version: "{{ stackhpc_pulp_repo_docker_version }}" +stackhpc_repo_centos_stream_nfv_extras_version: "{{ stackhpc_pulp_repo_centos_stream_8_nfv_extras_version }}" +stackhpc_repo_centos_stream_advanced_virtualization_version: "{{ stackhpc_pulp_repo_centos_stream_8_advanced_virtualization_version }}" +stackhpc_repo_centos_stream_nfv_openvswitch_version: "{{ stackhpc_pulp_repo_centos_stream_8_nfv_openvswitch_version }}" +stackhpc_repo_centos_stream_openstack_wallaby_version: "{{ stackhpc_pulp_repo_centos_stream_8_openstack_wallaby_version }}" +stackhpc_repo_centos_stream_openstack_yoga_version: "{{ stackhpc_pulp_repo_centos_stream_8_openstack_yoga_version }}" +stackhpc_repo_centos_stream_opstools_version: "{{ stackhpc_pulp_repo_centos_stream_8_opstools_version }}" +stackhpc_repo_centos_stream_powertools_version: "{{ stackhpc_pulp_repo_centos_stream_8_powertools_version }}" +stackhpc_repo_centos_stream_storage_ceph_pacific_version: "{{ stackhpc_pulp_repo_centos_stream_8_storage_ceph_pacific_version }}" +stackhpc_repo_elasticsearch_logstash_kibana_7_x_version: "{{ stackhpc_pulp_repo_elasticsearch_logstash_kibana_7_x_version }}" +stackhpc_repo_grafana_version: "{{ stackhpc_pulp_repo_grafana_version }}" +stackhpc_repo_rabbitmq_erlang_version: "{{ stackhpc_pulp_repo_rabbitmq_erlang_version }}" +stackhpc_repo_rabbitmq_server_version: "{{ stackhpc_pulp_repo_rabbitmq_server_version }}" +stackhpc_repo_treasuredata_4_version: "{{ stackhpc_pulp_repo_treasuredata_4_version }}" +stackhpc_repo_ubuntu_cloud_archive_version: "{{ stackhpc_pulp_repo_ubuntu_cloud_archive_version }}" +stackhpc_repo_ubuntu_focal_version: "{{ stackhpc_pulp_repo_ubuntu_focal_version }}" +stackhpc_repo_ubuntu_focal_security_version: "{{ stackhpc_pulp_repo_ubuntu_focal_security_version }}" +stackhpc_repo_docker_ce_ubuntu_version: "{{ stackhpc_pulp_repo_docker_ce_ubuntu_version }}" +stackhpc_repo_centos_stream_9_nfv_openvswitch_version: "{{ stackhpc_pulp_repo_centos_stream_9_nfv_openvswitch_version }}" +stackhpc_repo_centos_stream_9_openstack_yoga_version: "{{ stackhpc_pulp_repo_centos_stream_9_openstack_yoga_version }}" +stackhpc_repo_centos_stream_9_opstools_version: "{{ stackhpc_pulp_repo_centos_stream_9_opstools_version }}" +stackhpc_repo_centos_stream_9_storage_ceph_pacific_version: "{{ stackhpc_pulp_repo_centos_stream_9_storage_ceph_pacific_version }}" +stackhpc_repo_centos_stream_9_docker_version: "{{ stackhpc_pulp_repo_centos_stream_9_docker_version }}" +stackhpc_repo_rhel_9_treasuredata_4_version: "{{ stackhpc_pulp_repo_rhel_9_treasuredata_4_version }}" +stackhpc_repo_rhel_9_mariadb_10_6_version: "{{ stackhpc_pulp_repo_rhel_9_mariadb_10_6_version }}" +stackhpc_repo_rhel_9_influxdb_version: "{{ stackhpc_pulp_repo_rhel_9_influxdb_version }}" +stackhpc_repo_rocky_9_crb_version: "{{ stackhpc_pulp_repo_rocky_9_1_crb_version }}" +stackhpc_repo_rocky_9_highavailability_version: "{{ stackhpc_pulp_repo_rocky_9_1_highavailability_version }}" +stackhpc_repo_epel_9_version: "{{ stackhpc_pulp_repo_epel_9_version }}" +## Use derived vars from etc/kayobe/pulp.yml to switch between +## minor Rocky versions using stackhpc_pulp_repo_rocky_8_minor_version +stackhpc_repo_rocky_baseos_version: "{{ stackhpc_pulp_repo_rocky_8_baseos_version }}" +stackhpc_repo_rocky_appstream_version: "{{ stackhpc_pulp_repo_rocky_8_appstream_version }}" +stackhpc_repo_rocky_extras_version: "{{ stackhpc_pulp_repo_rocky_8_extras_version }}" + +# Rocky-and-CI-specific Pulp urls +stackhpc_repo_rocky_baseos_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/BaseOS/x86_64/os/{{ stackhpc_repo_rocky_baseos_version }}/" +stackhpc_repo_rocky_appstream_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/AppStream/x86_64/os/{{ stackhpc_repo_rocky_appstream_version }}/" +stackhpc_repo_rocky_extras_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/extras/x86_64/os/{{ stackhpc_repo_rocky_extras_version }}/" +stackhpc_repo_rocky_9_baseos_version: "{{ stackhpc_pulp_repo_rocky_9_baseos_version }}" +stackhpc_repo_rocky_9_appstream_version: "{{ stackhpc_pulp_repo_rocky_9_appstream_version }}" +stackhpc_repo_rocky_9_extras_version: "{{ stackhpc_pulp_repo_rocky_9_extras_version }}" + +# Pull through cache mirring ark.stackhpc.com +stackhpc_docker_registry: "registry.128-232-222-245.sslip.io" + +# We don't use auth against the pulp server +secrets_pulp_password: "" + diff --git a/etc/kayobe/environments/ci-capi-aio/compute.yml b/etc/kayobe/environments/ci-capi-aio/compute.yml new file mode 100644 index 000000000..e5bd95d6d --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/compute.yml @@ -0,0 +1,3 @@ +--- + +compute_libvirt_sasl_password: "{{ lookup('password', kayobe_env_config_path ~ '/secrets/libvirt_sasl_password') }}" diff --git a/etc/kayobe/environments/ci-capi-aio/controllers.yml b/etc/kayobe/environments/ci-capi-aio/controllers.yml new file mode 100644 index 000000000..86ef1fad5 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/controllers.yml @@ -0,0 +1,7 @@ +--- +############################################################################### +# Controller node configuration. + +# User with which to access the controllers via SSH during bootstrap, in order +# to setup the Kayobe user account. Default is {{ os_distribution }}. +controller_bootstrap_user: "{{ os_distribution if os_distribution == 'ubuntu' else 'cloud-user' }}" diff --git a/etc/kayobe/environments/ci-capi-aio/globals.yml b/etc/kayobe/environments/ci-capi-aio/globals.yml new file mode 100644 index 000000000..3a6674de3 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/globals.yml @@ -0,0 +1,63 @@ +--- +# Kayobe global configuration. + +############################################################################### +# Local path configuration (Ansible control host). + +# Path to Kayobe configuration directory on Ansible control host, with an +# environment path appended if kayobe_environment is set. +#kayobe_config_path: + +# Name of Kayobe environment to use. Default is $KAYOBE_ENVIRONMENT, or an +# empty string if $KAYOBE_ENVIRONMENT is not set. Can also be set via the +# --environment argument when invoking kayobe. +#kayobe_environment: + +# Path to Kayobe configuration directory on Ansible control host with an +# environment path appended if kayobe_environment is set. +#kayobe_env_config_path: + +############################################################################### +# Remote path configuration (seed, seed-hypervisor and overcloud hosts). + +# Base path for kayobe state on remote hosts. +#base_path: + +# Path in which to store configuration on remote hosts. +#config_path: + +# Path in which to cache downloaded images on remote hosts. +#image_cache_path: + +# Path on which to checkout source code repositories on remote hosts. +#source_checkout_path: + +# Path on which to create python virtualenvs on remote hosts. +#virtualenv_path: + +############################################################################### +# User configuration. + +# User with which to access remote hosts. This user will be created if it does +# not exist. +#kayobe_ansible_user: + +############################################################################### +# OS distribution. + +# OS distribution name. Valid options are "centos", "ubuntu". Default is +# "centos". +os_distribution: "{{ lookup('pipe', '. /etc/os-release && echo $ID') | trim }}" + +# OS release. Valid options are "8-stream" when os_distribution is "centos", or +# "focal" when os_distribution is "ubuntu". +#os_release: + +############################################################################### + +# Avoid a reboot. +disable_selinux_do_reboot: false + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/network-interfaces b/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/network-interfaces new file mode 100644 index 000000000..24f050906 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/network-interfaces @@ -0,0 +1,12 @@ +--- +############################################################################### +# Network interface definitions for the controller group. + +# Controller interface on all-in-one network. +aio_interface: breth1 +# Use dummy1 if it exists, otherwise the bridge will have no ports. +aio_bridge_ports: "{{ ['dummy1'] if 'dummy1' in hostvars[inventory_hostname].ansible_facts else [] }}" + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/tf-network-interfaces b/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/tf-network-interfaces new file mode 100644 index 000000000..612d2daf7 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/inventory/group_vars/controllers/tf-network-interfaces @@ -0,0 +1 @@ +admin_interface: "{{ access_interface.value }}" diff --git a/etc/kayobe/environments/ci-capi-aio/inventory/groups b/etc/kayobe/environments/ci-capi-aio/inventory/groups new file mode 100644 index 000000000..43967dac1 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/inventory/groups @@ -0,0 +1,5 @@ +[controllers] + +[container-image-builders:children] +# Build container images on the all-in-one controller. +controllers diff --git a/etc/kayobe/environments/ci-capi-aio/inventory/hosts b/etc/kayobe/environments/ci-capi-aio/inventory/hosts new file mode 100644 index 000000000..a16582738 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/inventory/hosts @@ -0,0 +1,9 @@ +# A single all-in-one controller/compute/monitoring host. +[controllers] +controller0 + +[compute:children] +controllers + +[monitoring:children] +controllers diff --git a/etc/kayobe/environments/ci-capi-aio/inventory/kayobe-automation b/etc/kayobe/environments/ci-capi-aio/inventory/kayobe-automation new file mode 100644 index 000000000..5ab47462a --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/inventory/kayobe-automation @@ -0,0 +1,2 @@ +[tempest_runner] +controller0 diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/config/grafana b/etc/kayobe/environments/ci-capi-aio/kolla/config/grafana new file mode 120000 index 000000000..0e711c2ae --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/config/grafana @@ -0,0 +1 @@ +../../../../kolla/config/grafana/ \ No newline at end of file diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/config/ironic.conf b/etc/kayobe/environments/ci-capi-aio/kolla/config/ironic.conf new file mode 100644 index 000000000..45f848825 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/config/ironic.conf @@ -0,0 +1,2 @@ +[DEFAULT] +minimum_required_memory = 256 diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/config/magnum/kubeconfig b/etc/kayobe/environments/ci-capi-aio/kolla/config/magnum/kubeconfig new file mode 100644 index 000000000..cda061db5 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/config/magnum/kubeconfig @@ -0,0 +1,20 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyT0RJMU1UTTJNVFF3SGhjTk1qTXdOREkyTVRJMU16TTBXaGNOTXpNd05ESXpNVEkxTXpNMApXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyT0RJMU1UTTJNVFF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSTG1TMXhaaVlCTjJ6dUVnaFdSVFBjb2VGeU5LaFlXUHp0eHRVQ3E1K1AKcXFROFMyNWorbUlVZzhHTlRaZFNSSld4azhKR0U4ZFhuY0I3dForcjJXTllvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUpYTUh3UEVzMG82QTYwTWtsVHBFCms3d2EvcWt3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnQWthRmlyMENqVmhjMG9WOE9CcTR3RFczTEE0N1Z5VGwKcTRUL2ZtNzlWRWNDSUR1K2FqMC92Y1BXa05MNmszdnJuNjh2R09Ra1NIckw2QWNTTlpjS0ppRDUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://127.0.0.1:6443 + name: default +contexts: +- context: + cluster: default + user: default + name: default +current-context: default +kind: Config +preferences: {} +users: +- name: default + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJTXpqZ2U0VUdzUEl3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOamd5TlRFek5qRTBNQjRYRFRJek1EUXlOakV5TlRNek5Gb1hEVEkwTURReQpOVEV5TlRNek5Gb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDV2pPN1MxRjluOWtEbnIKLzhNaVRJOXZUMEUrY2dLT0N6MmpNaGNBUDBpS09GSy9qMm12cnpGb0o4TGg1RUV5V3dXd0dGeVVha1E5Snp1NgpaaTBuNGJXalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCVHVEU1ZYT3cxd0k0TzgyUjRGUm9jNURrQVpLVEFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlCRlF0YVlFRTZqK3ZFYU0rdnNRWEZMT3dvK1pqMS85bkJlQXJIcm9nU0hhQUloQU5Va3YxYWRHUmdYSTBuZgp5RWwxcGFZNk5hOHM1L1dZa0FTYzRYR0lUUTJlCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUyT0RJMU1UTTJNVFF3SGhjTk1qTXdOREkyTVRJMU16TTBXaGNOTXpNd05ESXpNVEkxTXpNMApXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUyT0RJMU1UTTJNVFF3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRY2daWW01RnN6cURVOHU4ZE9MY1YzbzFWOEVlY3RvMHZZelFKVUdMRDMKcVppNUIralBrV3FGZko1ajJvVXh0bXFzQlp4VVdxMkdocUFqaUwweWFHVVlvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTdnMGxWenNOY0NPRHZOa2VCVWFICk9RNUFHU2t3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUt5c1pHNzQxck5lVEJGRUZyclJPdkErTy9mcnYzM2cKcHJ6c2dQWFhOZmZSQWlFQXZxWWhoVUJRMWNGbkk5VmtWSHlsNW1rZXVRd0tMbkF3NGtPWE5DaXpjT0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUhodXJ2S0dDSUNhRTBwMFNoM2s4STlSY0tDUThnRy9jc1dVLy9YM1k1b1BvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFSmFNN3RMVVgyZjJRT2V2L3d5Sk1qMjlQUVQ1eUFvNExQYU15RndBL1NJbzRVcitQYWErdgpNV2dud3VIa1FUSmJCYkFZWEpScVJEMG5PN3BtTFNmaHRRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= + diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/config/prometheus b/etc/kayobe/environments/ci-capi-aio/kolla/config/prometheus new file mode 120000 index 000000000..9a40a2c64 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/config/prometheus @@ -0,0 +1 @@ +../../../../kolla/config/prometheus/ \ No newline at end of file diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/globals.yml b/etc/kayobe/environments/ci-capi-aio/kolla/globals.yml new file mode 100644 index 000000000..57af9b384 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/globals.yml @@ -0,0 +1,32 @@ +--- +# Most development environments will use nested virtualisation, and we can't +# guarantee that nested KVM support is available. Use QEMU as a lowest common +# denominator. +nova_compute_virt_type: qemu + +# Reduce the control plane's memory footprint by limiting the number of worker +# processes to one per-service. +openstack_service_workers: "1" +openstack_service_rpc_workers: "1" + +docker_yum_baseurl: "{{ stackhpc_repo_docker_url }}" +docker_yum_gpgkey: "https://download.docker.com/linux/centos/gpg" + +# Elasticsearch memory tuning +es_heap_size: 1g + +# Increase Grafana timeout +grafana_start_first_node_retries: 20 + +############################################################################## +# Octavia networking +octavia_amp_network: + name: lb-mgmt-net + shared: false + subnet: + name: lb-mgmt-subnet + cidr: "{% raw %}{{ octavia_amp_network_cidr }}{% endraw %}" + allocation_pool_start: "10.1.0.100" + allocation_pool_end: "10.1.0.200" + gateway_ip: "10.1.0.1" + enable_dhcp: yes \ No newline at end of file diff --git a/etc/kayobe/environments/ci-capi-aio/kolla/passwords.yml b/etc/kayobe/environments/ci-capi-aio/kolla/passwords.yml new file mode 100644 index 000000000..9175175e6 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/kolla/passwords.yml @@ -0,0 +1,1610 @@ +$ANSIBLE_VAULT;1.1;AES256 +32363736386263636430363361356664353736616464393766643830353965383834666234343530 +3361636665316236343365356531356632633965643262360a373432303963343630333236653536 +66646463383633396432366132656336666439646235623661323663323032363030333838396339 +6530333239383030370a373537383837346436363766346331663131363637306432316539383339 +37663433656132313562383831613433323664333639613038356164636365653064663466663864 +39363430653539643538326562376432343534336637666333643238356664393831663038633432 +35376464303236373065343432393166393836373161626232393433333733303764313237376132 +36373963623663376664613033373531386463666563666531666666323765613466363662313665 +65346533333062323565316336616461663263616334633935626662626530623535623963613936 +66353738626138386265343631383563376566343730303762343233386466653537656365636637 +65663163336164336136316361353633663131636630396461353661373131336663376432613762 +31626262326234356535363534623731613136653636346466313639616333656336303066323635 +34373336666339313263646665353738653332633034376631303533656363623831623633316231 +62393463303133653866396237376664646130363736643735623261653238653061343034346364 +63333663353039333162633032313061373136643932396132646366663936393564653030316333 +66643933643064333763333235646430336137623362353565623631366333623030373337306335 +66656432633162626336333766373030306163666165333061356636633165653136616430343364 +63343865313265623939613361313536303833383266386430316236346339623764656630356334 +33373731376632306562303361336365356261633431373635306536326665346534386139363734 +32376639356236326465363339346264643566333235626337366163656464316436383162616365 +37393731326665393938636563386334396333376163336263323861303936663465383135306464 +66343336323661656164383563366636646166313139356636363032366461393362323164373430 +64353266336561353765356530343062313030656161636532633161666361356236333330363165 +64643539373634303837636166363437353737323339306564626563373862663131323263616561 +34623836306266346432363932646562363836383164646263353431346631343062656137643736 +33313465393537633662623836613261663535373139646466666362363263663231646164336363 +35653830616334386262383135333531616333653165346564653566363865316433613030633665 +65333865343333633164633265633436323364393561616438336664623430623033323130626466 +62393736633230303131343434393631393333313463383538326339656361346630353336383532 +65656264363237336234356562343837656138393164333565396334653564383435333935373231 +35333639613631363264346362373764626266396533376237306331383631643632643564333162 +62616661623561316663303439363931346633613039616338623437396534656339366266643161 +35646663376336376237373730643139326332343137613762303432323130626630663864383633 +66643738366166383833306631653963323234643430393261313336343930353766373639643663 +31616563366634326339623037636662326132393931323839636338333836643463386339613235 +62636135633562356530353665323131366565376463346530326634656137626335623332343163 +37656265646532343038613964643738636334643162313034303239323038353165383033303737 +35626463333232363964383262323737353732363666353132613936646561313934383338633736 +36333738393062623163383337616562636633353431383661363839363466363664383461383431 +65633138313265366139656461373733386637346533626232316336356532323339373132363166 +66393832393164383437323436633430323365613735386533373935353732373036366235356334 +61636138346438313164366234383037386464636632303063663834646538333962646366646137 +61366166643666653534396261393136626537393532363235623939666265616463626330393935 +36633231626362646538643066643030306134343962343130353737343237383935343264356136 +63313665643963326237313938353038623964303761623866313962643865653464383530363962 +32633565333164396231633163306635366235633235303838303239303938636161343235383262 +61386261346136326434366462336331623662646331376632386265343862653537623234333735 +37653866623763373631626132306466663535653462393934386131393033653537393036363933 +39353737633761366332616261306438343037623265626337616538636333383737376632623339 +31653139633532653763303936356136663731323064383334343235636664663565653235336531 +32373539346439316466333630633339613266306633353862346264653738626433626564663035 +36383638666263303231376663386439396432373863616533643937383431393337653166373962 +61356339383738666462396234656133346535326561333564366231366536306435363165633039 +30393935306531396639616231393230303466386262346531626532623363356136306537303233 +39343437623066393965646131353866383662343837346566633731626334663561623032326631 +30626564633332663132353961613436346332313336376535313937613761663832373234366234 +63353437313661643266303232656665646264336439393136623562663534393961656664323237 +35613164666663396430613061303531313966363364323037303564363235313737376663303763 +36306534643738316662363965333362323661306662326638306331613733633465353439616462 +39346533323236313039373161373736393665343638636330366135323034643731643165353636 +64326136386335363335383430643963313532396130316561656438376364363263363261346663 +63326562303431303535343562343138373265376665373866316131613264303331356537633333 +30666466396331373266646234386433613333353935396131383162636230346665376135323038 +35633730636236666562303866316264343938313737303065333061323461666532356431376130 +34653666326234306466373339633365306434363533623035653330323137346239636539663237 +32373966306630656437656363363735386136636534336162383062313534303065656563303231 +32653738316337613535393139303238653163353238643336643263663965653434376432303934 +33303538623133623064353738386435356535343066353638623938616537623531386338313061 +35636562313034366464346637353836363937623332376162343333306139643136653338343932 +31343837383636643065343337306666323230343337623363376233616433653531653633383434 +35306333653337373531333130343439616661353261396137663465326238653439393332653032 +37306564353661343334633536386131383766306566623336326661373939373833396231356238 +31663638323032333063373539393663396165356137313831363263396531313563386132616234 +32383265343633316565313063313465343764313766643136663839633735343334376561303766 +34383239343266393262373861396362303331373231393861343439666232313937636638383063 +62656335646434303236333530656634663066623935366531356434353630316561613265633630 +63346639373666613836366666343231346536323937346236326632643665373566336630343330 +38333836323737343534383565373866333433383263656536343461366465613236393164313935 +64366661633839623965353362356263383039323030326334613131646233303231323765316635 +63636639623361623564373735613032626334313461613338346638656130326230326362616564 +31376635303964653031393738316331353566666361626336346637363832646439366135383538 +31663430323164346133346139323362333166326465656536396533626266653638373739653937 +65326539343230623161353461336263616236373534663938643734383139306533383637333530 +36366263643833616331393732333431633037376361343636623831366261393934343561303439 +36653536383634323432376131383566633738366565663832366666643566393039643930663334 +34363435353634623737343366363936333837663330306138366231656239643338646232313963 +34353739303661336563326438326631303236313864313266626666376164313135303635626361 +33306161626533626662343161333662393530343534633234326266656136343036616633353333 +63646236653636383064366239643061663834643933303663336538323131346236363438646334 +39366536333735376434366666383163633432316665356531393135373039313965633266656163 +64303039616536396332333734353334353839373561373439613439346363363737366235613962 +61623637393634633535616434333735353938633063363033323836333831643835636633343565 +34626432363637306431383764343366366538373964376532383738643537353665633536363663 +39666134306534613462336266353230333936633233383136383365323439393037643531333237 +33613738626665613161636164653333376562363662343866383534616538323738383064363163 +30626466613264396361616535623638316337353365386463613233306137636438373935363162 +39346238666664343833396337316437636261613466636434303966313665663233376534633363 +31386165633730393363306333643765373261343934353436633764303738353365646131366664 +39343661626663663339653137353937316238306465613835666265386538326363316666316234 +65366335313630373438313165393164353535646130343830623733303536623538326365373837 +34636432656464366433623562346461643465313430343937366332663362353537643264343533 +33653761393431353665616364376566373662323666653863313861653266633932633830386335 +61643534363061653639353939313464663938643331613762356332393565653736323035616633 +31333631313135666535336137393137323731323431343963636431643738653730333333356338 +64613063663939333163353864393064333631383936306238663136363966613037363061316463 +63366563623461306434616438653633633830633839363465613238386137316430393864383835 +32363636366134636630363965626362303431376237383230343638616461383963376130366265 +35326335396362346262303765643663643161356664633465623435303633643062326434363361 +65356232656337383034343662303063383533336338323736643138666565643837633830396637 +63656561623661653763366664376263623533323335313161626339383364386334656638623462 +31616636353934343561346464346335623061633962333137306661613263646266613235636239 +35616238323661373065383337346435383136666536386537373165663936356564646638383433 +30383232653935343333656134666666396538666639626562383334663037663664393064326532 +66356236333666333939356330333939303162633033646461666433376432373131363232616135 +66643964633961636332303862643563323238663266383439363837643330366365663035343935 +31333232353638373831363436626634323232643763373039326333643735333066313438323837 +33353736313933646331383039376133363537626336326264333964356237663535653666663338 +31343030663462356163363330373934633639373339616161373334353839323535653036373561 +35623464386566313466656536663766306534386634636333353033366465376462653032363637 +30303130353636613564646564666636396230633531343133326230613034303132626565613130 +30633265343830313139316439666466623932376132393530653163613537653633376365323434 +39363030386364393734303861383762396662616264323865656139356130303233333632643263 +64653438656136383036643763303738323534333138336262633665313838363630373136366436 +33666566343766646637333536663636326138336235316632363166633936643465386466623163 +30383839386236646135656634363463663464303333376461323130303566626666393236356630 +30373061373033316631353861303338386265336161326236346263363461326537613462343537 +34343534653262376362333132383566373235316534343232323037343233616138343035346361 +62343566613030633936613262303866396663343861366235623430626535313830393731386534 +61363437356539653930653363356263306533306638626163396161303864346661386266376231 +34386563616432373638366263393263323532386132643563393937346532666230313033346161 +39376264363936313565333933353363326564313337383036623163663238353164346562323466 +32356563613237646161376663393237663434656231333733666438636334333337306465366335 +35383735353335373266646236656466346662353939373539313833373734333136303938363738 +39653836333733363136363261386136383730646538333237633838616239613165373138633530 +30383130633839356638343531653830303361643534363634343832393962656265656466636431 +38633165626164373238666464663237666134383265303261306437353036336663633234616566 +65306333613163346434636338663864343339393131336632633032383137333666653866633664 +39653035383530653962393736663839396532303563316565303961303539333763303532346562 +30653563653032393335383864336366323831306363396338356636356336376530383438666362 +39656637613236626135373561626338306161343164333339373033316337636330393062663236 +39616563356566643164303963646239663038343235396430646161613537333061373865646261 +35623962396636373166656338663964353131616236633562386464663562383430306139653433 +38353531386430313033616236323366333133343438313335653532653664633739376532373936 +33626462636165613931303862326461316161616464643937313039366331306132663037343566 +62306336666266353061623536393966653938613865323066666464633232396532313961373165 +36316466623535323930316436373834333664663262373036393236373066613133396166386265 +66383263356636303834633730313834313664663566376663313038393063386235613131363463 +61663530306534313435626535663766636133346332653938386336323133376361323961316535 +39396638643262323631636334336666343865303831646133656162303165386536316535373734 +33383636383733386530363131333263633732316230373062303264666437386266623431613033 +35336562663563303265316435613435333434333737393538633233656562393966316130346630 +66373936333863346135306634303366303334626263323565643634646261646430373033333863 +30383530366565393238303230353764643939643330303736333635333463633533656161366439 +61643063646439363365353831616636623764646336623266333838363631376461353765376238 +61313834336561643865646131616463313330616233363031366463313630663162366266643733 +39313063323636386364336263636262643036306362383361666638623632336632383064306134 +64326263353933366532613163353638336338333563643630623061613536363864373565313236 +65333735383039323264303631363939356636636339623765343362386464353137366364633030 +33623266373039626161353537316431373165326262646566636136393062653733613238666564 +61636665663032363937353639333163326561663837316632633739313437313765376130313862 +37386338616365323666636433653334386637316663633332303333396461393533353065343564 +61343037376235383265326230373533633364393861303139383030613939633339306535666432 +61373966353338666633653236343234326132386534363934323765316133653536323666316563 +65613538616637643064663136623837663338356434626534363265346631303439303931613633 +37363564316265323537643266633335636666663833313430343836313965333366663933323062 +65383562393866383765376162633565303231353038316634303662336461366137313666343231 +61636237393266366430343262336463656636653739653031313461636238356631653363643335 +35336463633530633436663863623939616265623737383835396538346663393337646234623435 +32653136383634643364373037626565353566643837343065376333333566356130303334656535 +64316230616538346630633165393533316132306633396438356661663163393935616232653362 +37386635386437343739646239326261306436343762373438656665326330376438643735633861 +39353861333263323334633330386136363732346166373462646332396565383539646139356135 +34356565323237333335613636393538656338386361333330623038656536613532386233376365 +61636133656665323762663239623334616261333237383562656339613037323539376234386633 +31343130313635336336646665343739666664313735313066336135333564343764336538303933 +61386262633331326437303739633064393963386237333961313662336161343431383763336236 +32666532346465646664373662303636366161623537333234326430333833386434366463326238 +63646237623566366664613661306537623633336466613530363930373134656230663861663230 +30383065663736643833626635626266323064643833326565366362343166636234633436303663 +32366637663837346333646639636239313537623431626439353566393137393031303033336436 +65393438306336336264616664333439313266333039636431656162363637373565306533636461 +35313963623832333666316465656365636439326561336562343465343463383930323233653534 +31646462316433623763313737363237633339626235363066653863653133373238383832343564 +38656634323236323330633962363831663063343233333733313962646463653238393730626434 +63643161303834646435396234346630313865326330363132326561623738383438306132653537 +34656662653430616530616133363534616131643362376136366233383537663136376430666331 +65336431613264613263343337623463656531666334363639396362623533363261353163313962 +37393166616566373432336133653263366265393931323864336361663539663536666234623737 +65393361363261366430323339333839306333353535316637393063643436373233306165363237 +64393865323564393063366361636536646531363134386139376338623263333039646437356137 +63663232656633656537383432623464393764633338393931616633363461386133313563393137 +36353331626262336366326163386133303566353637656531336532613031646538363632323562 +36383334623339396163303731633834633636313166653864663961623335346565353036663561 +32356431626137383937316235393961353662386536366437366364663262613230396234323565 +32336562626634346339303334343832356261653638363130633232393361363261316264636238 +33646535353765623866356338386463613039353432366630396633656139356561313638366463 +66346664616331313135623230613634383730366462373864313037326163613930363630336436 +64366636316162626165393863386338633238353932653432646431303266303734343338323663 +34393434633737396664356262616262353937346264613461383966396531303831333335316263 +38313230663930623932353338653539656436306233646531666631323161376335616265376535 +61626464653737356339363037653732386531633935323432616232396236396238386438326335 +64303564306235363735383739626464663264633561613039626130386431396238346130393661 +30313136386130363730646665373464313961313435613664366239363834666533303263633839 +34663466623932623031313234623561356364373662336334386432646438656464376236633337 +63333931646236623135656633376636356539306665306130373562383531383135373834303961 +37663162316336323962353635313563326139393931316638333730656462626166386531653737 +62643937323733636632663365366132393533313035353961643463313061393732363938353762 +31316532613065306465353965383134646534643736333561323239333666336230313735623231 +31323665633937356439356165373830336561636163316338613137646335346430393663396665 +62653233303233333136613463666362346532616232383063363237373432363939303534323534 +38666661626665333835363133636434383766383232623138396235666665623163323461666139 +36333832643239363037396335323762376563373933313762306635373934383034356466663231 +33323531343964663531336132343230333832306636643461646635656639383034393730336436 +35643932396630613837323935326334633339616333343637363866366535666564316637353236 +33336137323537663261373534316439613532643039383730366435393430656264366132333566 +38346133623763393165643434343930396436376634356266326630636263643033613030656164 +33356230333837353236316137623632363634666266656563373166373966653230626430383365 +35393465393239636364383962393130383265343538393634393964613566383237613735346236 +33303035323833313266613831363938613233363130306639336332353334653133353032633538 +63353565386330316239313930616233333936343061303533323239376262643765663732643261 +61616234626438376535393235633365386664383633613766363330383766373566343235316466 +32613330333565623137666562363364393335333738613865373762616434643333383063383538 +63396138393730306336646638346339633932656330333035323861613439336162613033356364 +36316564356435663039623264623834633631333861386434333962343264623864383763656335 +36316165336462346131313437633030373437353461623034643432366332383738363465633032 +33353962633766623865663134306634333733643233386266393439386234633830363766376337 +35633665386563313465653332376235393332653035643738393035366231333333316230643565 +37663334336663366639623733643435316630303134396437336666373437353634333365613964 +63636338633964383337636565343162356137313636666430363739383832393131393032393735 +31356639646136653737356232386538646364393465323663653463643332353061613465616631 +37326266396131643438363961303264386433353335656633666637646565653130326165646565 +37333261633330323831663462306361653761393733313066383437313561616133646163313130 +63646336613530383066613238626264393238376238383766353732343232303638303237303430 +38336162646233633163376137623363383931626231346531666362653866643737613431313436 +63363331363466383439656234653332663937363131323131363330323363646332323065653131 +35393432363239633761626665396166386333333637303963636138323961383239383033373332 +64343364393633356335646134663163346662623162386136643866313230356337616135633561 +38623033343836326230313633336462326664363431643666353866373234653434326237373666 +39643737656337643132613137306636386466653432386539336666656132396130323537653465 +61376532336632363731306566383435643834323736313338613064393465343161633836336634 +33613833353538393564646366363663623163323166613936346461656635336535396537383764 +62353538386333663065636365656364393430646639366439396664386134303633353263366462 +38626436663237626339366232633565353764366434613230373234366639653338633231313865 +33326234626533663031313137313937383036346136383564316132616238396663383831376565 +64633066666165626161666335643938343663383935646333356139313630316564333465646264 +37313834363865663639373332393062636231306463323430643436356530303863343932303035 +64646165306632363636333337333238656237313037346565613236396338616538353736663561 +39323439316132663232636138346562663236336434626663636433666638653632646566353639 +65653364386331333132303039306337633663346463356562666638383435613663646234316231 +64346462306461376434633762376136666530623532306530666532343961663034346439656439 +61306637666630343834653534376231383265373731623365633138376235353938656461363437 +62623938336131653939633462303665343433383931316637303036393231396532323233636132 +61383535636138386131666533633233646164326637376562323835386566303539343565623736 +63393961623237396634373337336164393234663562343432323534346263346239633237353064 +31636663626264336139356365336632653762373535663630326232366532643833303831353439 +63613036373938306466343661383263323866386430363266656361313534373465653862653535 +62393063376665666534386634653034666264613230363938306539633964373066323634376534 +62663861333266373935613862663933393731333438303462363831336639313737396337363063 +39336531333565306331623365313230316161323237316338356536353133613263393565323661 +66353130383632613566353662643866313734633536396335323334633734323431353730393564 +39373266333536303765663639643064326336613162656363373835303430663838306132333735 +34323234633532306438633762636562623037303637356130643462643331313335306564633861 +33323062663338343731366533376364306331313735316363663438386537346336633161656561 +36303663366465643262666461366539363834303532313133666563633430656136303865366263 +30633438346366613566323835363765323836366461313432363033623530656463313432333236 +62343038366263343339366135393030363931616332656638306538343732366637353462336531 +62393730623461366237653139316633643739353439666138633461656132393561353062663737 +30336633373636393537653564323862613236366238636636633438333265636532343035336630 +37396663356235303331653866393665346338306263363434383737613831326232323434636639 +39656335663031303634366436373665336330353931663231633563323763343834326532393732 +62313537663832306538613832636533303866663663323865303330353765316666393666336330 +62363432626466636131643661353937623233363830613863643963663939346662383535353030 +35656230333333356166333230363838336332333535336563316635343963626361653331626164 +33666266623462366431366532636235353031393932633532633435333265316162393561343664 +66646136396239643035653936376337303065303236643535353838653662353736616135376633 +62656437343334653635363639306361326661353032353438316538663336663739653964643561 +65393061663838613738613931623431303762633335653462363236353836613731306632633539 +63336266353133653539666261633236643062323131633239303564376130633335326133316336 +61666465626632386539623566396438373266383238336532373664636562626165393134333265 +63656237343334356534646161396538626666393262643236623433303333666633336265646230 +33333239316561343835343635636331633762336533356538353337366235343862623731326263 +39366538303164633962373732623439336232316531353636623264376535636538656639393466 +35653235633730313432333639346461646437656136323833333562383361336563303336653434 +39326538666333363131626233653637613461393838666665653766643663343265326661356430 +34393863643662323262636332663461656461616138653162653233393432316466393138613336 +36376234303439653931363461653066656530653661666536303364386639376163386631323339 +35343364353965626330653535666636646562333965323431303061376137616230386335613438 +64666139323238386631663766633035643033336234633639373639303137653230336330363561 +64326139363166323265363462653461333461333236326634383635623765343232653730613130 +30656531623730316531646462666133626636666263363633373865646166313664386133303536 +39623834343935306262363966306535323361343536653332323036313939353065323539343133 +64386466396539393836646639666132326662653061396539666632663536396262646535373735 +63613036343061633236303330663437383262643438643332303437376339323030353163626638 +61393366616338386636663862353664613036653161323965336430346235376236656630343438 +66666262393538623232666535373739323430643234333733393165373832646333393864323838 +36666135613433663532366535656337323737373138666465363135343533633139353131613136 +33363030376638653732626666356662396438306430623139396430653961363830383233386362 +64316466613033613735663463336538343664393039363437653630303937663465656362316437 +33366238376539656364326166303534316561313861653739616463316665633136663562663630 +36653866363933643636366232366235346665333638386161373637636361396266303835636235 +37623963653731366132623934623161633831616231626266613739386234646163336635303334 +63643261363538653633303561383866313163646336663261306361303564353361353936613837 +65646234613065303531356137323866623765663837626333336636336562316163396239363631 +66313265636162333830353438633631653665373233616261636631336534366530663561313663 +35313335353330613136386566396365616433656563333136373137343964306562343835663939 +31633063303630656234623066383034613964333934643234373639356166343936393231303164 +34373236313562643437363637356366613238303832663565376233663261373262323861653261 +35633435656663353336316530636665633562323839383237343032373239336235383538386365 +35346438343133313462646365626333326232646136646265623636666438336364356639663036 +30363732626566663331316636623934313836363639643730313531316662306263643930356138 +62396362363735643565313033306566383535623434323938643535373537653439333861636531 +36623537616130653833326430363136643439663665383061373036656333353335616130623732 +34313736326635646336666634623564356538633265313636363536333831383832623239333162 +32363264613939653538626433316465396232303435613763326164346133323962393637313730 +35353931333664356238333165326437366636353132623930646661613637323864346366383964 +34663332656632663837623237356261623361636632626636326565623331343236396431316663 +64383235333462333565303736303539356339303333313537366637356433386632346138383730 +37326463386635393130393236663862326461623365613636613938396362626461306231363633 +38313661333838383534373738356531346632643264666266343765633832656238643032656632 +30393736653065306335653332623831333061643433343261343136383339386466326539626131 +62393135323934393132356463323939633464653430383439663934383037313936656538633962 +35346661656334376631626131666265366635356461633765373133363365643666373536353862 +61653034633361386663353366633236653066313564653631376139346439346564313839303737 +36326462643535616330333235323737383465636132656235303964316439326237346165323331 +62386562386166313730303338643463353361366238636331653835363865373439313937383562 +62393761646235666139313034656136363638306632653233626335656464343930653332383161 +62663939323036626431613666363463313733343637666261323938653265383435393563666534 +32363438343462373838303863336436393931313332323862323663343732306234303966306232 +63366664323733623531613539343739303063653363366566636366316130376239633563343039 +62383632633636326534373265306632343736333838383965623835643139363263343031366238 +61613634633037653339383565383035393737343261376530393931633666373537663739336566 +35613863323361346431326339663561393135653265326432643964366263356161336537323765 +33656338346137323034393764363130323166663265343864313233636137363064346564363336 +33393831656133323064306431663161386635313135663064616537633034323834633031626164 +34363934663862393165326664623765636366666231393035613739356633303834353332373230 +31313038376530643330633565613037356337393935623064633535336130353231323130353061 +31316566353739383736636331333636393533626634326635396163363436326238616436396134 +33646634396561343564383362393832336431353633373830323939366139323665303339646662 +37303631306530383237316138666633633838633538623338646432366665373564613039623831 +30313063383065636336643635383333383863323162383636616637626361326430343030316635 +39666338346364663231363262346239653735306361323338343839613563346234383638623162 +37303638366266653832366438646461643831353130386562373461316534306236313739623938 +33663931336565623065323030653038363435326363386638383835333931346232636430363330 +35386136613561613232333630333238373637653834336261336336333431323265326337356232 +32393939333766643961373164613266396433323837343234316564386133323731363030666264 +37383132313931633366623033633434303461633562373335386134313537383032353561666334 +63383364376461663630336164653934626633653332336565623262626563336636636464366366 +33306132313530663736336535353264653133373362363936363765356138636535326537366530 +38646136346338353436303263313537616166333833663530376630666666376133343439333930 +31613634333738363363653365366236636464373733313036383637383733636330373431373462 +36343961666361383832323466333430646632353230633031353864613734306366366362383035 +37373462373739336437636134623231386463343266623662343831626265663332373066306139 +66363530323862643665623030346339656363346638316333653966616331626631656537393963 +32643637656564356631386337326438613963333634353633373036396237663830323261613736 +63663934343935313733343065353535623665653463663330323262303865656132343638636561 +30326665303662666663373764346636633661613039363635646233613936356561373834363933 +36366638363833316337383866366264333938386136623363646263376338353861313636393261 +64376330366634613636333464613133323537363738306462346561353435326532306262303337 +61363938303966663232303766343632626464373662363832346166313431633337373361636465 +34623335343139386334376366666366383932313961353632373039313631643439303337653366 +39383936396434613834313035383734366264656130306137643361343531313863643066346663 +36613839316566303933373139663332653834363862303236663033623062613537333937633338 +39393134323635313432386365366531353866373561363931626161363932643337303035653136 +34316531306331346261646335303064323438613361646264663938383532633830343562346234 +37363363373361326535353034323035653530343262633136633733636631363839356337363162 +32336139616263393830353965396230633333303065343934633137306136346131646439386264 +35313932386435626534376366643461383931633364376533326530303438393039366539623931 +32373935393437633830663932303265633735336234373861373039656662373066373535643064 +62663564333439333362666633396537336633393933373938623037386533373862376631336533 +65333363636464663963316530313663353466653562646435616436356336386166346162323838 +63616562633064373363303033386265633135663332363562653235386638323034353539306332 +38316131626138623433626438633533353336326137386335313137343739313235626136353934 +39323137313632396631323039363064376234633362663163653161643164346566356262363138 +61656636316632633463303131333738323434623238633966646237616133323964343032623835 +34636433323638613535323535333130613432663338343363343161653438323438336465333830 +33313166306366613337363936353433376634366132656436383431636266633039663333643035 +33393062353037393434653764623331333034343061616238326235333837386338666233616632 +33323163646530636430323666383964623565656663616462633035643064636630393536653861 +61343236386164636363633439383738346630353630663139396539303035393564303432346163 +62653732396663663731663931653431333133396536343766313566636662313261313836383165 +35653433626638343535613939616639383533393337373463653935666331343732383234336439 +31666230386366363238663031356561396561356630623036396635326635326261636538346632 +32313561306364343337306665343666303235316632656265376262353639323939393030643437 +31313161316337643261643131643037373539386461363330313863336532613238306361373239 +37393366646639666662373731666438643462663762346633316564383737633632653463306161 +37613562363662666230633063313666376562353461363634326566653336396338303665623661 +63316463313830383863663133346364656564333762643838653330313864633331336437646433 +34353330616336313265356664636161613537636366393431373936316635333437333366663533 +32663636346234303464353931656538346330373138663134373135346137353339346137333966 +39393262663430663061393165353938653335343262366330613963613164363237363834633837 +31326261373366666139653863373732653432663861646165653639353936616563323963373136 +66356439373132636435343962656162663737356438373333393961333539323430623765333964 +31646666356664363466666434653462633333636465353032343038343066646561653765323337 +31623034363736333233613432373464623466303165303431633966306431663030373862356161 +62303531373966623430346364393030656330346362393338303732303430343061376336353336 +33343037373838303962386632663864356462383464396538623237323430386634663032386639 +36396166666334313330366566386335646164323238633938373762663764373636343566643961 +64326234643165613464363432396564666333393030346462323130663465396161396462643765 +32643630303466636662353036373432653231393064363939383764376138353232316635333962 +37346233663132356561356134363132306335386337356364333835623266306134373731633435 +33303132336161633833383561616166383838336266333061383865396433636138386139363134 +35313039663033633431393332643362353661643961323233313939386134373635663639656235 +62663965656337636262643932623832373362623438333332653930633433656561326235396139 +38643838396338653561326538343562383365313436333234323538316639663131616665376662 +32393866343731353434333637336564353261303166313163343466393763353265666161313130 +36383638353761376662373265643033613134363362623336383138346166626633346161666530 +34353961383737353733396536626238336566653065323737376134356464633362386631303264 +39373239303838653739636534396134643839373534373232613032626666663336613834643731 +31653361323034356565653763356231663032343261616230623962333234653333323436646631 +64636663633362623937653439306139373736333738313533313963393637373865383230633235 +62366433623764303534613237653837626638383639393532616337393734393863353738306330 +34643738613266623762633031396365643361636135616438353834353830393533323432373239 +36666263373361303237663235353833316463353835363763323137623761376565323030646165 +63333437303138336135356339373732306436343331663736396136353239373639373066643766 +37366530333763383335356233643363346330663633333166373066633863353765376433303464 +33383930363438343632626336353434326135306631323935303831333463333531323866643764 +32303739646536663561386163636139643532383439303133313737363231656539383063343136 +37636332313139666466373339313061666338323135316235396538303463373661363261383263 +30643936323839376263343764323339373961633033353762343163643066316662346530653863 +62343065303932633138396330666264373763636634656432623036643337323065653033393539 +62326566353133333062633933333662656662323263613461643066646631623761353463643037 +34643764366633626264633563323734353435323937633738303735303539356331396131326139 +62323837653736336437646462356534663132653939666566366636663036616531663363656137 +36316635356235383461336161353762323630343365363463393430643030653439316233646466 +33333565636336326463373362633937306437636133643732666264306238356537626531313637 +37326530343134616234653564353833656361376537363666653862626532326331363337656134 +66663638373838636363653333336134613036616631613461363661393633643731353630313130 +61373364643632653430663765626266363831363334376235663264636434663936623734653839 +30353434656262363461366330306539336336343065383830323636623435356532343063336138 +39323564356464313930336439303561313862636164316436663139303434623130336638626236 +31656334353232323662386639626130653330663233666632653963373731323832376638373764 +62666534666666663539653439323663393338303365303165333234656237336166643965613263 +62643362633736663031366363363063386232313733303337653439626135373937613636663263 +36636637643033363163626639316339393564633733623762646137323662646633366339616136 +39303733383633323239656130353930303936326562333731386462363165303734323930626532 +62636562633937656266373437343936373738626663353439396637333639376232323366646364 +65633462616232613166323432383939616334383936303632316163393736383632323464396332 +61373364353861613631643262643031363966613132633039396664386261636462333665366664 +31336533333763326134616664326236323036373437386334656663386630623839666639356266 +66666530396165323765306566646665613730653035376437343365363364616635643830656539 +61376163383030326363623734373639363066336230613262666233313632393464363561306537 +33366335616532323338346162636461333432663135373535656335306465373961643433653135 +37316434326134343032306337336432333537326637613763643863353336326165656636663135 +33326334646666623939383262653164343265313064343930353866376266313062383035333961 +30396665313439316135643431636637353166666632623562356665643634323863646237303963 +38313733616434643131623831363963653665663230306334366564623361326566346438323339 +63376534356639333535363839653336363932363631333366656230633434333366656133643664 +37396561386336343637386363613438393936386265633965373763393866346565623335363333 +30356133613861323535613861303831623562653430646133613533363538613536626332363663 +34396133613636343239616562646331643061346162666666323962633334636430363433326333 +35316264306661306634366435636639633739666662373631313261353839663530356131313237 +31626366353239303538393833636134353834336461633735366462343839616262313838313839 +37313839623535613031336561663638383734626333393963306230323035363530303264663236 +34353030323934613936323138353535653136386632333634313934643563393261383764333730 +39363061633234666564656661333331643263303430623938356465623661653338396639393237 +34323337353739393161656261316431363334386333303534633462623866303130353934633939 +38643439626434633865663731353636343435353937303164373033623737343338343563623462 +66333936343663313235316463643336326462306164376261663132363163643734353235326138 +66626531393731376139656565373035346537623538656661653637343037303234383930646438 +65363763623039383939626466616239323566313663646133626363346337613263363132313831 +66366565356633383565306361366166646631346534383731616334623336383939313362653435 +35343961336130376137393464363266643834376530333065333236306433646331393862623564 +64613732363766373962656234623034383062643063663561323934633637323435623531643334 +34323538306364393930626534306366306431353562393663363534393232383533313164636130 +32636566663831373439616565613766356633633839356632643166326632326662303934613266 +33343537393934343665316436396464306530613935303362636637616630633164656132306462 +32373039333064343538303466346566633465383836353739623066383731326461353363636332 +30346663326564353361623738633530623234316364623032653264623539633463636533333139 +65663133383130383330363464336561653336613034303762626464643463323138343034306634 +64363435396362613565316238643035393062333730613133356230333363356436626464313861 +33373638303765316434633435613334396564346537343534656632343332323139396436663233 +66316239323466396166323564613866663862393763636135323538326536303564663935363866 +37356335363639633832633631653630353163636432363832616539393438303939336430613632 +64663536613262613830646235636139393831353531376165393133623635623331666539343838 +33393932666336653165633465653232333563356639643861636163343765643535633335623566 +62306236376636643364383565323737353465613832373866396337366331363564383339363361 +33323632386463366363326436663035333939353136336439613865313834306562613434336465 +31323533633265663939356163636661323935633234343537346639363262313238336363346534 +66396633333936333431336434343135323239666366323865633462633639663263393033623263 +30643431346362363466343564653230386537356163613964393535383231393333333464363434 +62643833313736306663346165643839643732326630643237306361613933333233313163613366 +31663233643362326435646538306662383362343032313233306462643531623262343764623830 +66636137623839316431346261386539623565363239323863643134373339663032333064396361 +66316539346438343035316134383931663737616266623062393230626265653862656637636130 +33646365633238623666323563383664356661376264323930656635393861653236313332336432 +34613838643637323363303236363965306462396665643061663563393830303939316636643737 +37393836666636653762333031623038636231656162343166316434613137373638626263313239 +30316638336661376138663564663731303965366663326336653266373831306665333035663130 +36393962356433343936343063393163633762623330616238613931373866623364363735356630 +30333937343865343533653035346233373264656162336432303763333564303530643935333561 +61396235333332363936313031643032386135633666316637396634336364663932393033623133 +30363063303438636239636162343332623264303366363966373866343265643533643963316366 +36616532333166613335373634336465643166633135313038353438623435396235306466623666 +61666430386335393764626561333836363563323730313634346366616463626464623233363034 +34396366643235306238313439313736613933373062376236353931613738653966343632306336 +62373766306634623232313332333563316435613561376434373230353335336433623263353762 +38356464383461623365353735306334333761643537336131356165646432643831366431333632 +64353164613630343135616235323963363130663733656466393966393264386566363635646135 +38396438643730323538353065383066653766303564366235393861346635343033613332393433 +63653035316463303036663837633530383636386365663934393431303236643333633737666162 +61306431383832323533633539663832333637373036663066323537666465613335363137356533 +35613739396238376639346561376464376238623461353838326666636337323235326338343832 +36313764303338623162646239333464346435643730366232643336393735653135613264646366 +37343238613163343465666662373237343261333534663964643737666163613333643233303133 +35643634636162326239386466643061656361633639373332636363363032656161633235623332 +39353961306462643235363536383262613062313565313861386164646264663239323166616534 +62386239663562663762346538393839303131383937623537646139653838373937363831653331 +33383962613462346561343835393135643938343633316562323036316436353339386366643231 +61313336303138636439656638636438616533396662336539626531646436356561306639306530 +65336332666631343431303965663436623833343963636134663039353737663163663061386562 +62333532336534343234633938643266333337383437613034313063373865626462313831656235 +62346439613966363362663961336661383937613735316663336630666462373338346133383036 +32663034613739353839343537343434396565346430633561353766316630336634396264313433 +37333136623361363137343033623061346638366639656232346635633163663961336366396330 +37386630643230633238633232326264313635663933353865373130306461333462313338326539 +34636364346538656136633666353236303861616332333533303735326666333332393138626138 +32343366663464623436666363626534383939323539386433626462363434656465653966373234 +37303962373762666439663531393237633666363563393234363566353762636138643534313662 +61663435646631613331643163396436386137356261336137366330653633643739643830373164 +35653332336463313934383236306136326666393162633464336365326530383563393139386235 +31303263346166346438663632323134326363376431633362313031393362316361663532316362 +64313433633938613962666238656366393761323639663136323839616235636463393635363837 +39626534626539323032386231613835643535356262366637633737663939393134333861613737 +31646236326163663531333937646339636339366332373064313130303633616334653265393766 +63306535343662653931653037633033316462366265393662346236646364376532363162633234 +37643432366132336632336663626263383030313132656136653861623132623737356332663837 +35383439303433353335343137643764376432396332653565313931386561326539383464336333 +30303762383066343939393738363832373638343932333939336239653133383238366331636531 +37663332633933376136626137653035393566396630363636616331353762623138393937623830 +32666463663963346163333666333733326336636334353263303635336561346231303966663933 +62363134613939653338643530636335333662383965346233613563323534393362326161356161 +35633134316332356136333862313461643663643862623034653930303061363463396161323831 +37303131313532613838323464623463646165646330343335386234646365663935656562393437 +31653636333632363062646236333937623265353935613233636333313066313735623038633133 +64353962613038643334303331356665313839623039386462626263303766653162643832346539 +37343430393864363066303539356231343332326336626564623463636564386265656332393163 +38636634303530636635383634346434386263306337333962386565306330333232636535633961 +64376234386363333338363734373531366233336263636237316661656538666263636332346462 +33343531613363386439613863346233303334396266353034623937333334646564306633666433 +31376436656364633838663564616333363433306332383030353438393866313161323037613634 +39336534616461643665373962393635346566306538663562663337636338376431653062373436 +38643164306339656461656538633863346664613538383564386665643064383137373462346631 +33626632666434333030636635333362623461316232653961303531643634623833373865363132 +32636237623666313066383631643136623037333137653435363833313364646137656637356465 +34663863663137623733643639663234333334393665373232653539336261346162343833616336 +38666132376232343532613163623837373632316637346335643566326334353364346433356637 +33393132393533616463353439376232303130346431363731383636613538333337373136636166 +35333864356261353234646232303636626434306234663831653166396163623339653439313838 +62373235356532396363636439353661326562313935346433343932353339343663373863303262 +34326264643461343863393236346139663362326664313330333138663165643836366131353864 +34623836616132343336313538313864663530336631323465346465396433633639346431313337 +37306137356633383332653639643639653131396237623833646230333764383838653231336565 +30366236373632313761373938313435626361356163353663643737303763313236336263396332 +30636231383538313836303636643233356261383365353538636332316139653265663362303163 +34626436666136633332653534383337386665613064333038386438616464343134343863643133 +34633131313761656338613233623966346438386161353630353463633032333932363630643965 +64363561353939383764343039333832666533323436666430393138663963623334303735336135 +66393531623230663862663163336661363936636136363064333761396235373331633865623162 +66616236396631666563613431653334366266363133363539616666346537326537666632663463 +39356332316162353963386161313236316664303361363465643039616266383938323237396439 +36393933653037323336623962306563656337303064383531343531626530323566303861343465 +63333332353066306132636435653838623063653333616666643130663231633436343833666562 +62633566326139323237316538306537373037316630383664326462303831653930396635336530 +37666364656562623333343662643862326230363137353332343138373866663338386636633235 +32666363343334373431666139323431313863373762373064323636336263636163353533373861 +63616564326632666233313931633163313462636263636130666139653335373965346164333938 +31336131333632316339633934623732336463313131383037333333653238336162353337373836 +61326434613833333737376236373266643830616566363862363230376339653461643833326631 +36653731626636613834623839613563353762333435386461373132633238353563323338366638 +30613634316339616535613337366130303963616261383965306461333661663261316134326539 +65366665666139343132663230346266363731653363656466333166353431353034303737393232 +38303233396438366161346530666265623964306365383966313537633734346132613132373736 +36356365613964333764363466363634376638643338303538323834386339366139396262393431 +38646339633334636664346565383331326139396138633533353732623830303164336365303133 +65393962353033356262383339313462383665343266363337313264346166353561653434303336 +31336331366339303633393132326337663436303739383562643835343437353432313565323664 +37336236363431346566636230326437613462303731316530663633636162373261383361663963 +34616530373134363633366463623739383932613463633464386538623731383531333235323966 +33393836343738643866633536646663363433383263343832313264383833663666363530666135 +35636437356238373236613132626162653237653264623338653066363164363034353537386639 +65633066633135656237653962393665343634363836353763363430313162306635386432613464 +61613730656333396636623934623233646535353630623633303534323562313531616539366166 +33313631336435386462393562373462316666613766363034663634393563363163386632396237 +66393436643734326133323838623864666534356238613138633662373334303765353438376132 +37623566633064373932323461386132393633306436656365373130346133306232643531326538 +30623036393263376264316461343034633962343030313437366163633838376430313534383933 +37313339313438393037616564373131623062393534306365323538633862323534306263343465 +64336535353261643339356164616531373964616666343762346433303334663664343932643333 +63376663373336356363323030343239373761376133333265656362623130643162356164366632 +62353537623331396534346335316537623033393765383833333130323762333663643732326134 +37363338623337643063393636313264343363646261633662336361396233363233323061643265 +61336366396138633537666137646135636661373765346462626530386238313063646637323865 +30643732396635363231623436666337306339333930386130613130363230666432326161323935 +66666165663934376330636635633135363132616362376536613062616564663333376162386332 +38323439323531303937336231383264393963613961626461343262383663613435383431343965 +38653266303532363933316430356262663966343665333430633035396533316434363366396162 +65396138316462363131646162383939313934656566376331643537663136303663316531623465 +33366463396431346439373063366361616435326466326266373364643163386437366635366238 +66633363346362616636646563383231303131636330313138646231366530386230386561613436 +65333839376263653932303330313739333666663863623161326364373333386334353135613232 +62636330346631306335336439653262373931353662363461366262316639656361376634373363 +62653462626138363264386339663665313065626238333765326366363764326662396134323639 +35643663373461636438383033383364316366646463353930316433323136366437393063623465 +33653038376262373263656639303830343731613833613332386234313931313866386562306232 +38653438333233393830353331613731323138623132393031373463316139363930623463326430 +31373435326136306666333334326565356131386263653937643363633332373530373334666162 +63313362396237353763363634373261383032386339653632323834303838623665303530363032 +31383162393063613837386466313538656331623631396433613630326231663538343830363631 +34663538616562353231643166396566376634623863666530396532346434656433383831336532 +65633862653239303566376664663332366437646332313634653763393934643838633163343131 +61303062653137663464643832303136363432356539346463313334313935346564366331623166 +64326635646365643738373135643336643366373536613063393262313336656637396432376331 +65653432643538643936663365376561316331353331346637653264306565636639303937386633 +32323061373662623062643364383262643535396661303166633639633839396265313839646432 +31366331303737353130663834633365653735653137316632336435343638653532303863303433 +35636262333830616539623965386665663837353065396539353634666161383836663933343930 +33663732396532343732333834366434363162333132396231653763376537643437333037366561 +63643732353032386364633563323534306435626137356438633532633239383162613333626561 +62613064366435616164326264393466616163636561653162613561643233623532396463333766 +36643065626334633731343563313265636535326466383461653832633034633961356666663166 +34613063303436316661306165383338386361643436393764333361626338303962613238303434 +34303665303730306566613834313639306432306365346336633962383835393664646165623933 +65326535356366633431373266633131656139623661646136373430303862333135383635626662 +34343162643638303630303339643666346264343365343638626162373439636334316536346235 +64313238616464333563343661366232393237343562363139613265356236366566396436383539 +39386563376561393533343761636364356162333063343566363538396563613330343365636436 +38386630356334366232353334333735373136633636636432613461626636363231376436613434 +31316232326665396633303233313061613539623531653735366166313763653630616263656238 +31363533643862353365633465326137626137333931346233303037636536363962356633633466 +32653766616161626164636261646461363832323531653933373235306436646566313566333463 +66663162323532373139343661626634656366366364333838626633653634613535373364616664 +31366164653233643261383664366337636564636665303139343332643836653431326134646437 +65376639633636323666643935623865313865306362663264373766306532383530326237646431 +65346638363165323639396238393733333565366665613963666161346533633436623665643262 +65393063323730333736653261316532666236383963646334643538623665303038653230393434 +32383964633866363161346432366233633065393838363136646464366566356162313665643361 +36383464356562653638656536396632373030623166303461303834306230303535663932306535 +32326234373466623732626334373264616666363766386566343966386631376434383664326635 +33643661653737353837613938313639366338623632373130303663306437346634326234666136 +62643835393533653031633863366364653332666534353133656332303765396238363031346639 +63616530646337616338336135353932306539363737343338613636633137356665353134633264 +62316638386237633739316666393037313639383737633839333932366536333737613465613562 +63633938653965393336616465653037316132623339626565636466366266626633646335626532 +37623234353136613961313235323666656265376364323934336334313331306265353266333966 +38353939303130356165303435656535616636623866373036383335656536616336623639666235 +35646539633161313535626663313962623139623330643031336239366638633634353165656461 +37626433306637653939393334663737376435396130363730313434333232613064656663643531 +66363637306230386539323535646630623364336436343236653034346237653836633364663234 +36663634383863383065373462333830383235656135346339646663363130313964393964666266 +65376561373735303263666465346530323632633332363739326538333635623430613133306436 +64623630373737646130306565393565353734363066623436663233616632623166316337623964 +30336136376563616463363933373034643863376230646539653061333835383931306432363263 +62366137316536386137366638393663643861306466356433393463623861323361373934313363 +37323161323062633839663766643266666165373439643935313531633462333838386133393530 +36333336313535653131613234636232346335623230656534666262316139643235313935346566 +34656632323136363164333832623563373534313437356666373362653364633638326631356139 +31656163663438326437616364343133616566653763636362663030643539663331666435643734 +30396333633662316566343238373061613266313964303563646238306266636166613463323237 +35303634663439326531633135633761356137383862636135613330663530666332663038396362 +31623230313438383037346461313866623163333565346330653135643761613461636430333234 +65613263643664643434383539343830316433613032383632386439653461353065303263613331 +61303566306161316534663062333334613136343634393763333465646536386662356234656230 +30643832323335383134636264393264623564646665373364346638326466326162313964333034 +32623237343934333463373530383135653733613966373238386239333261643865356434356231 +31333462666339633962353438626665636331343961333437333364343935653461326661343435 +66306239386139353535303537363539333361383731373532323737303462313738363635373234 +63393862336261373963323532313165326333663039633635366261613832356237633865373032 +31313835366166333661633964636463653733613632323335653634393536333131616335643833 +64643265343139633435323732626666306136353838386135343266616162313431666135646438 +38616431376266626466346638366163623131303739633837373132376233376561356438323863 +61646135616238323233333933333864343135666366663331363566633836313931396361653735 +65343464643032653663396631363833623862313934646132323964663832336563363463313036 +34306163386666376335356635373836313631653662396638386332656361326365393432303830 +35303232313533636634613534353837333539393561393433313831653430666561333435313435 +34363230616132386538643361636231623862616232663131616230643730363763313735643834 +32363965653365643432356136376438313037623437353031656164636635323438633739366233 +66343964363037343863663761316464383165303038633336643066316565383564383635626131 +39396334633239663832646333383862626333356461343665376330316630353064356165393732 +35333061333638663463393063383038366337373234653266383764343961623632313035353038 +37363765653038336363383265323037623538323338303134343532336365623834303837333839 +62393132393132323738366362326434626336323334613765643636613838333738653736633165 +64386236373562356337613431336365663362373035666466386662343635363161336432616131 +36333066316235666133383934373266656261316661653135626163333731396564623262633137 +37613564653664386339336132396138313935393564343238653632643366333166363233393537 +34323865363063336433636461643136306333613962326462313436323933663730636663623963 +30333838356462333366656162363135396666306263333366646635346239376634376130393263 +35663561643239616237343765666433363631376363663863623761663966303034653634626139 +37323536623431653832303461313631366537663865386261616262346436666233613162343939 +38333636613331363338613661346265393236306332313038346461313437656563666437386237 +61336635643762653764386664353662336635363835646466653636653532653339633735353166 +34373138636661343663663937613833663139653033643936633934623932313738343837613638 +38323131323831373332323162653531643465373731303233323062663763666435326134313864 +62633630643034653262316431343862376436303136626237343337356464346437393862646263 +35643863393138633130303362653730333739343633323137653336376136663633366639373166 +62626661653531343430363435653539336664386234656135316136653461393165313331373836 +30313837633264316335643334623031643735633234666366346538643435313938366666356661 +33356638346465353538633039353062636539343062633534316265623766323430656636626435 +61326662623865646561666166393565663339613832353731383565313864353330363634656634 +61353033643437303333626431323935373664643338613730356466356266363531666462333632 +36306535643830306539336633643238306630613865663637643839383630363033626361326635 +62356136393364613336343139363664626531306630373062346365313561336633303231363866 +62353138656365333630333463376430363462626432386564313336333738303564666164333539 +66643938663131356637613235336336313032316438333832613137393435636537343064666665 +61366436343433616233316161636162643737613566616530336338356161373032306266356562 +35373961333937396233326136326334663737383939316532383438393065643432393136383035 +65626261613665306562376333393163613238646165333161343538376566663664373931356338 +63393434313431343739393836303438613135663463363931386639313630643033323062333839 +39633063386434323161646331626636333738343466386133393534626363343562353932366130 +65346366636264633166396162653236633631633836646631646532393866633036323164383464 +34313638613464373663366331383931626638343963666663656637373435613763623335353632 +39343132306266353930356632343061363338363034323364396237356361636531323230663738 +38653939353738323666383136343935323730633632313836373335333433366338346132383339 +35336631616564316335316338313365393538346163363766396135373034326230346361393866 +35336631323561663662633934343762313736353731656464353762623737303837356130623338 +33666238393138343066663632343664353433313030656162636236623836636561356333376437 +66383461346635346565303033383662316364346166623334306462383033653665323730303662 +33356561363132336139623961303864653338343930656237313635363166326664623039643430 +61656435383261623963313161643262313838353733326632613438356665343161656238333565 +62373037636364326366303065316462656534383233666633396537643463646536613433616263 +37313163353937666630366135393763393936633663643733626134363737363035313839646465 +64616235316333373261376563623639643030366361353264336239653763383233653934323633 +33653063333236343136303439336230656339333261653630613334353634396538613138653632 +66363339306235656536373436653731646532646431326539643731356432313236316232373462 +33323963616135366165313363653236633330656137326634356539663666316336333730616666 +32613631336133656430306165626338663266613465306565326661653634653532633532363561 +64373962356132306435353836643935363664303161333465323364363164353239393931623233 +62616363393862626235633537663934646335656563363733353661343233356438366332643831 +34626665643763666437353162383632646161613566353831623332643066316666363036333939 +33343636643436383537353533333230643061336265623731356566366564646462623336663565 +32353265393565393039613535646631663061366464323339613765633563316639313336623630 +38666630363964343865616266353035386133353265306337623937323136366462303336643563 +61633336663432326536623134306230373163343833653766633730626363376639626530643536 +36316535666434616539316163363265363762303933346161663736636632373431336630313034 +34396232616666623932313535643234626335333832353262663736366236383563356165616138 +33623266613934353663663931393430646232616630333430376335393366376137393537633966 +32653636613561653738303563343130343739326339353865346233643537333133636230666531 +36626162616264376238643833663733386361333934663934396665653633303637656230663365 +35636236363262643639386336616638303433643333303237643435323330323236393639646431 +65306161653861666566656563666138326565633834636463363636343936333838613139383664 +34376431363436643332643930393164653831303433383133363866333166663238633966623865 +31333163333534623234656239613266393634333535333430363735373838646265653533393431 +33313162396335643066316132613963323938623262643137636339303139373635363237656266 +33623133616265313631333765343333663235663739643532396239646536663637613533626665 +39663839383363326331653664326630333462633134356666666434653838356533623533313936 +33643337623831623862386366633837663436383862633734383662343166353162396163653031 +31383030303632613432363663393535633931303135316666623064623836326434386232656536 +36313730333030653265636437386135363763656131653733306438366231353433353361656466 +66666563363331626464643165393536653138386261373437616462613937663133393736653962 +35636136396639633431333664643163363862343435613061626135353432613639633866316564 +63363438326265373934373766623264326264383636373962653538653664666333613832626264 +37336231323838346130623730356663353466623561353262626263613135373633623437383162 +39313132323833616636353839333935336538316232336639366434643362363562383332376434 +62353264366531313835313431386538663063303364643937623934356434663462393465333931 +61323630383965663234666235316466366165663235373037373465323465643463383566626237 +66326437343264343033663931383164656531616631373163306331326334646135363566623033 +37643633353736346233613466306365653336316334633836613063343639343330353764343932 +39613937643730343732643834336565323635636562343364393839336565363633303036383964 +38343937306633316438306566656639653562623535326636383732353231666162623863366161 +64303238613762386533613331356362353066343635313834356230386465646634343262316131 +64663239323234393237643330363161336239363836356661626366616532333530326335376132 +38376466376330613961613661613139616461343265316135626338336639383964613564363366 +38623065633632666430613238326431343661663430316432343065636136636661646462393932 +34356563616165666333386135653734323038633831663766343464306333393937343165383931 +63323336343366616261393165633363636465323762363637363263636265633362323330663835 +66653361316661356662353338646564363133336537313066666533616236353861346432343930 +30393432313838663762316333323932346135353964663334633766633536633965613064633539 +37323930373935333234656234646566386666373961663365636339643937666634633532383032 +39643136363333656237313630623831383436623433373439333531343239393437653238363033 +64306362366135646536646566383835636133663966323939373331623433363130336463663939 +65613435633836663438656263666137306363376661653263353635326566373530313438663239 +66393631333135323538623162346331623038316634353534363132613261363735653463323762 +63373936626263646137313630383933303032346236303831663664626631313266303330323165 +64393463353765366236336466316532643435376134363763646662376332373039393834396635 +35653238353736383661633238303936393431346565643936663133663261303539633565643461 +35643665643136623833616238343934363332303637333139646132333034616363653031373537 +38366236313166323763636462613539373064616131613932663735666365353731306333323864 +33653335393363313031393439646534323932306365633265336132323132343532326631373764 +39663436333532623362646266323161663066323434626435303834636638386366343061336637 +61623861306635636633346461333561646136353461353264326232326130333137343833393766 +63303738623638303962653734613231343266353939383230363933376462653037353031343034 +65636665346165636463313763633764366664393266303665316365626563623934333961366235 +65613861653761626430333733303163356263613736393639613937643032313461353234396264 +32303964613038346138363436633234303963353265393766633434653364343234356231633030 +35616635626165656437386132376533396562346461306530346661633237623564653239633162 +61316662653864306231653666393761643663636437386436393738623663623239383232323432 +64613936303438643138336661386532383731623464666566633636336232653739343230376366 +33633933343161666362363439353732356130623433373532663363643864666331626631363237 +35346431366131666562393166366531356539333838663636656265363637366262326636613865 +35366361366462396165663161633161616564623961636235326333333934626262316639616438 +61663766353861353231623737363265636534323564336264336461636564616262646638366535 +65653265643533633933333333393937303863656533343338353633356332306561313735623932 +39633062333036646531343130376531313135363634353136316166616564623164656134316133 +62353365333638633931346365646666613665303065663336303936656165323037326137303936 +65373763333236643737613465323036386563633236633862613462633263303166343836336662 +61336563306539336232623634643932623732626233656636616532666634373563353864306436 +66336232613731343365353634633837316131373531383765336163336433373262376339373038 +35363261383261663937373263643037323265623839623037303035663864313135373132353761 +63393966663130643462663666653665383532353734393663393139386161656232326338313861 +66393330303732316462376664333838633531346563623833343234373035613466643262626639 +35613434363830363561643433303438616336396237656363376165663063306462356437653237 +30636537366162353634666131303763353433653563326331373133343564633564346532336162 +65323835643034326265363133616466653064633765383032633062336664353234376435343764 +33313835336466646238383730346665333061303031343134633139636661616230316539613063 +61653539366438396134373037626232383939383662383864646133623531363333653562666630 +36313366623662323462386436396638666134326635373635396537393537663466646435356434 +34306238313730356634343530383536363261646131613136356534633031396539363465393966 +64353830656230633135373066626363383663396666663033616266333836633538623235613162 +33613438663938633036346635386231376565313036306265326536393337633365653566373132 +31326331636139376438373361386664613834613937613330386133313864643866356261626235 +65663965623665306532623362613863356263353635313531383732363066376633393836643564 +36613166656437373736366130316433643363373566653861623338326137383938616562303064 +38303233376664663733393862376537323237653931313439373661386237656566333931663566 +37613039353737313836336462626131353566663831353930396438663039386365656465653036 +38373162623032656431316166373263643266396431383161303733653663323663653031363135 +38613739366638366332306462653730353265366238353363656438303139313165643863613938 +66333466613161643432666265313762353236363637633732366330386665653264663965346563 +35636466626638616566636331393338356263653939383034383637356562333236383436663630 +61306636386364643139393433393264386431356636636531333531643438633430333834363263 +37626138343537613239666265636264333038343531373230313763313861393833363666356638 +33383535303530363635336361353035613035396334323062363130393033656430393639663137 +32626432343333303335616336343366313831643031386431336162326361613065373034643263 +35306463623639623936393665353735323134643838613433363539666564613739383032386432 +34643536343634366664383963663061636436313064313962363730626334633363626239666339 +33633361646364336539366164363938366365636131663831656162376163376362316639323664 +33623930613563663435386562333432393230653864643733646637396262313535396664636366 +37353030323361316633656433396366613763323965376230363732323864383730313539343262 +34396533326565353061323265663531663839393831643037323962346235643738316535306130 +38313763363235353662316430306265656133616233626131616233396464343035636666303664 +34623233353236303539633331306562383630386462613239303337383333646437633833363037 +36383732633537323138643532303633626264326137333130633936663864626262643135656539 +61306362333330336239393835396238336439343066633961316236643030333036376635623862 +32313065633962393463393236306135383962386238393534303837653732623563313365663831 +38613233383834303833636530656539396661343538326337356465343666393466326266656631 +31383164626131633064663639343763613233373630306436666566646632646331613030376434 +38663835646630383265383266376639653334323835396639663538303338313633363561653938 +65646363363262343434346332623838633034653432613239356230613864323934653735313433 +39336333306431393336376466373338396131346165393862356633656532353361633861353363 +38393637383837303961333366366463656364636536396433623566633464646234323264366164 +65393766306562393436343266656261623030643866333636306166363461396364663330353964 +33336263306336303463613434363264613364663136383662363330663733373839346538306631 +64666234643135343731373135616266316632653934363036336434386433313963306235393839 +32323436666465333064313061333135383831303464323163653636623633303462626332643238 +34353664373731636233633638376439326438336364633637663964346638373665626633656339 +30653239663261333833336238353736643866376631636464343962326132393565373065313266 +31306263303965323363663032323332666332653663633431383431663235303761626632313230 +61346431396630353965643538303565636162656334643738393866633965616138353562383862 +36346561346133306462303639386339663537623065326636323035306336613238643965653565 +37346438356636366535366262336238326539643831346436613938333630626235313964663763 +66666165623335343063666131666635363035623865663366613335393232386231643761376330 +38353761336361333931616133633564623764356463396635353939313733393231376363633339 +65363334396461323334383861373238643036643032633338623966616663626636353939356663 +32663832643564663437636563626136633833323061653332643164663465356132383433663639 +31386335373966643565366237386334346638366138616261303061313964333835386463646431 +65366262303462323261376565326437656463616637626364663262653838646161663438623961 +35353433336466376533373036636331396632643362303864636230306430303535353335333963 +66376336386432313531633736313361643764626264396538326135633537393134666635343438 +35636530313630323239336632346436346235356562666533626264663433636533316663363535 +66326564373039393032326133336536663034656233373662303339303432356663323233393739 +33343765326231386565613030343163316361306337316564393237323937316162613465303236 +35643934326639393531336438663038323034303762613537666565393239656331306533666634 +61643862646636386638373966643865386335333261313633616137353963653536323536386330 +39633537636363333737356661323465613363343634633733373030393264613363653633393834 +38383336313630656136363066333962623633356137306130626663323832653634343031333864 +64383665313932393164313738656364343264316239656362303932376336386138663738393266 +36346134396565656137663738626366626530646538303630656238346662383339346435386233 +30326136303736343162363964346530616562383536656336636365636333303563313366373335 +30666430316664663230363166386162303362303634373835326234376463623731356332366562 +34366231376138653430616635663938396331633666393633363333613064366362363431633434 +33656362306435303634346464396662653833326334323839663865336264376135623631323265 +38383332396461326433626564636163373435636131653662356236363164626565623935353635 +66346639613062643662653165336361626566616361303330616162613230623130376138316232 +62353934393565626463396634643435353831343136306439613139663032306464353238333564 +64656237636263393733626131356464656232353161353537363432313031393365393130613666 +37336136613862313862323564656234653233613838643430356232343165383066386164643233 +33646239646633323733366635643330666330613964383638346566363062353339333631616432 +33633339313666623732663862613134653938313737333063356163613435653662313033333231 +39393631373730643263366339316538306330396464313066663832343763613132323362316439 +66316136303830336363383839633265313865333632353837366530383432343535306663643034 +39396536363236336432336332333233343539656462383865643563326437373637353362343565 +34396539626338643437316332636162343632623465393561323330396332663132316566333539 +65353030336165313238373663323631646463316239316333643766373463353339666435626430 +38613232656134366265313963366363356630346430313564323663613533323035623562646264 +66323135393233663933396166636261306439656338613233376331613866393132366536303432 +39613030333839656235376161343262626232336337333265613165373338663530626634636235 +63623231353066366162653065653735363137313961366436663035363462386136643061333531 +32333131303930643362653131336666386331663263363534656465366330636339366266656435 +34363437666363353635396265663930386466666239376261623637336231363466323264663733 +64386635396461356662666339626166363938326435643733613030663664343337363035633261 +65333863363034633164336233613937633237303435313034343262636165346337383762653132 +35393631323334303966323734363066313862326362656433363637666137643935336266326235 +61323263663162353261373132633833356437353532653263363637626230333330643566663131 +65346132663830666234613433663130353639366330363639303862373633333932323930633137 +37663332336534623364346639396537303237396630633331323763333965613130666430323939 +33346134636361373235656164623865343164633862393938326365346633626439653038373734 +32656663343431616536333137613563343239393562313864396161663166653133393539623738 +38663136616662336638323834393430366563393061633437663035336632326534626664613939 +62383534393464356639646563303135356335306162356435653236643464336264306630373937 +61373631323834653963393032646237376434333331366633653631643230366433623638346662 +36393561303537613236343539633262313364303065353966386663323931306532623836326665 +30373434633161333333346466383464306631663661396639343839613866653231343964613431 +63356432373131343537346339643564353132306164313332323264383361626161336537323932 +32303134346432323930313137356564613838323039643863396566613032373336666435613364 +37303563633033636465346135326334633463376332623863633537623766623333356430323731 +39336230396434666666313664333864646235373065306630633964386665326463373532396534 +61626565616434663939616531373039656433663435653634393537616666613464376330363138 +32626437386561303934323631303436643232323534333437393663323565653830396230396262 +61643436396639616538613333633466343630663239343031313133393563336532336538353433 +63663965646430336264643532376534343831633836323631346336333435633565383331396635 +64623165386634386262376564386466376566633931373331333062303461396463633130633433 +37653537323639316666616234386661646434346431653365626130623430633839313666333533 +34396165333335616562316234626363313437313731383436333430363537666236663266633365 +36336531306538303234653939666261336261633165383334366663373261336439343965656135 +32616362336661623035356236343536623930363335613631346530306332386461346636373261 +36346461373166646139366138326663386339363935613332663639643632646164316534313339 +39326338376361396566653036376465636136326133306364646135373162643639393732656632 +63313930336334363834303237666162333865393132633362653363353331353362393935363562 +31653935623335643563363833333864663537623363336435303166343136363761383062303231 +64303662333865653461663933653337366262393466623765623632383163323337373034363334 +38333365323832376137623835373830333839333932366436663933353736393562613930313634 +36363734393164323662386532316661353639316132393034626264326331646166346165313533 +65383831386266353937313134326432616463303633623233663435636163316531623133653436 +36303338663461623761636132316235393332336535616332393333333030373162356432613433 +34643662373564616337363636396635343262316366366139623562353463393932363433396666 +64613932646163386633303634623234613466666461316436386330663232653438626632663239 +32333833373864323162363762653636343765316631326235616261346139623961626334303338 +35643533643739373335353965616134626436346365313762353234623132366538323433346366 +32303161323032373266626235356237653331343238616661666361623663616632643263623339 +34343765633562623139373963653235313234393565393061666330363638633335666131626164 +66366439356163643861323436313266363231393637636339646438313363346230343866613135 +36343466636462363062366335396461623333623835383430653737666164656535626464356533 +31326536303034396330376166613336313362636563623562353165643937623733623533343532 +39376164343439363966353265386639326338623362376136393032333733396230623561373261 +35616435666566613161663736643031306436393530306133643063393263633331336135343936 +31656338393732383162303138353066326237376439633636373334313138323364636439363133 +34383732356230633133386434646663616631363335396337663263326336623664346137633331 +66646232373563323061633734616136666337616338303132343439656435616365653834326539 +37393731643763613835643761376134626239613032346338343334663665663030623234383530 +62323635333436663530613864333866623739623634643134333537613335653265386139666131 +36386136643039623365323535326133393265663030313537323836343263343133336536323839 +64333130646664643330646364323165666439333339316635343231346334313635313939336139 +63363962373937633566633531336132356437363737613061633330656131356264373838633038 +35623962373164636632366337623331346164303666346430396437613262333233346163396265 +37656339666435373433653432653339373236643439343736343136653137316630376534666136 +34396435306163666438623361316234613337663666613363373663393030306230613834656338 +37346464393136656135386165643362353736383764616238336265636334383637376661346661 +66643239383630616263633231633632313064633961363837643831306539633734343238636130 +63376664653834633735633038356533663963653739393065633264636435383830613939316235 +33343837613737376432323231623433633965313061653239613235663130643633343264323330 +34636335643765373936313062326465376330376162636337396336376466653436393136366638 +61393136303036633433653934316430663766343033326536396361623334666532323135346237 +33623865383561613163373465626235363039313330343537623534366665613434643463643134 +62376365346135323936626436393334306462376431616165623963613230633136653834613364 +35623330303461376234393035656165366138346564656534616136396430666630303333383932 +63373731383864656232303061623133383534393062353538383966626365326639623064623963 +62383237333638663665363039626265653637363535386330636439356236363264366137323939 +35613430653264373063333639303264383266323334326633333237623561313864653939373438 +65643261303935653837383730376636333362376132313932353735643961313731313331383737 +39316261316661356362616636333166383263356235613236333462306466663233326263363661 +65623239613961613333366134323835646437373033653136383439353332666463653763653539 +31373337383734396164646163353030326661386166633862646234313733643732663863646130 +30663338646162393436643731366366646264316634373461623634643063636439386339373834 +38366562326664326631306639336437376532343763393264643663396166353637613736316439 +65353633636261376538613166353638323266323665366464353733616564333537323966313362 +36636232393665613863653838633966316531336436303930333238613138623135393538656136 +61306339363865316630343934366336366234666564356535396137643664343536313563346534 +35633733363433346233353030663833383534373362343233346235366234396632376238383637 +61616135643366646563666563356562306261663836376437316138383936653263613639346362 +63646537343039333366323931326535616435663533343664313832333231326466396131363935 +63626136373231393831373038666364663136333362333530646362363266346162343933353231 +66373036376239613833393630346661633434353133363864386266633230393231633466333432 +61656331643532383938366331326337373235373766646631666135623466353662313431396539 +30353734396331373062636364306464313463313361646563313630623730373032306137323764 +34613432353935656462323933633938636466383664393333326162343061613631373765366239 +38646138353066643065383561323638666233336636396532623030363632336637393164396133 +62376437306663393861313763366231343634393665353034623736616261316438646364363061 +62656336353963396165313430306537303530363261303235666433306465636462336436643635 +32333763393530623939376432323433353535616165653436366465303339393431613062653866 +62383536626363306235663630353030373861333632333538636639393532396165653132613936 +66316162646165316665353166646235353139356262373564616630366132313633653230323638 +36653630383765356666386232303364613866393130353036653535656237636433626236636232 +32356561343633623238636333303138623664643636346264336330666637646632353830313466 +39633462376635643730636238653935333265386135313861643032393637393932343962666362 +63303739613138623330306565303038643536386439626563616436653431396163356265353533 +66373834666139313862313631643765623837303037633239643365326661626130646132326237 +62643834653231326165383833383932343165306464316663313064333763656664373635616135 +37636333373738386361316437646361383764306631313965363633616565303037666461663266 +34306639643130643566373631313764373465333535383333396161643133323732343631353764 +61633239373336366362326635626131333966353635636336313332376536383930303839656632 +65656631613761323162376334393734356162376634356663656266373166636464343064643832 +39646666343432666666653939366364643734646361623239383136313864343532663637666530 +32633132333730386165313935656334393566316436333364333365356464393233666135386434 +30366164663262303133303935353162313061306430633231633362316539323765333766393462 +35396338613261323034643637386235303564663239356335353139323831626138303637383563 +33353165626537656234646538333462313531386537303239386630356633326666343936396362 +36633735333264613539323466373163653433326535303831373835613834313031373838376638 +65366364376233663838626433376339346239376436623764343961346234643931393232393531 +35316636393738356231613231643163373731643038343231393735313231663763383861636439 +38656665376162633434303563646462663135653034626539663364353530346462316134386138 +35396336343534656331366438363838643835343063643430656263353261633531636133383036 +36326239653735373037663864353762383532383964616232656565646463633664313861326134 +63386430303561663765316331303539653639346262336131633763653732333962323133376632 +35383936303265663765313938633739633966653038633832663964353562363963353432386133 +39386435316162656538663130333331326532383136323465373936643762366336343731393764 +30613064356165343631376461396565396539313462646636353339383462646132326263653866 +39333534333839316234393834633933656263663830306361306464666632303235396237396230 +34366361343431373761386433626435616433373666663035306437623930383233666364363930 +31356433306230303037666566326437343761653765633431306263373233656536306533396361 +36333039346536306133323231326262616533393735313232353534656563353434663266386333 +31313030316436646131313764306435633136326636333163343538306663653061666262376431 +30356264373131633831343332396237633839376138333962383530653731316633303433613934 +65343737306164383032343435393063363434343965383932323263333261376364316139616237 +32386438373433633736313830303134643063373639313539396632336437383136303937373661 +65343062353034663535656362336232393534663562646631323865323166316530303836663731 +30623138643039303265656661323663386231666636663566376566623637623333623861333739 +66613561383232306538636261396637643930646435396233646663623863616635383431393764 +61333438636637643237643237343130316639323631343563623239623566623936323337333366 +37343535643837316137396231353461633664386265356333616134623839636136346432663437 +66376335653036623033323061303365666535663464653137656264663537666532633635643039 +63316231356566336337343266353435613530393563313139313466326536373432306636656137 +32666534366238633334626131346535663938643236303337363365363862613237383139376462 +37333165306138353634613034636530623463343339353232663235376461303763383039653533 +32346365613135666466313264623830323636393062343235646661313265383934373566656236 +33333139636562343335323630356164313136636266356536393539366663373839636262326662 +39656538613537656338353630646235396665636264323864366161346234303963343863613136 +34616364333632326431303939636533376166633538666236616337366633643439393338656634 +34633463393132316163393634316164643261363231356563623661323564616534666338636239 +65383765363963393562613436616233313037383436343732396236653264396138663435333438 +64663039343239623737306161306264646266613037633932383832313830383465313765373839 +33633332376635373837666537653535623464643331663935383635643561303261653131646433 +63656261363535306432633761366166313731376465346632306365356532613563396466633562 +34373730303734616332633333636530363230376663343863633839333763656437636635323736 +34626232623731313834383539643433623636313337316333306463353363356665313535616564 +37633037626663363062396361333766613631326562343737633563393936363962333535633038 +31313439393532633766623166333035316366626662616565633765343162353835336565383230 +65396430376537613538633439363261633234373738646330323731666135636238373266343738 +63623638326530326463373839326339346436313364343337333335643635396438633733306430 +61623734323765623164316661663932643766623463656439656530383030346335383663303963 +66383635373262396362373431313730313330356535353663623233663035646662306231373432 +30353661353838633965663132613836396232326662613732386433636363336565366235636534 +64633735333533313864396337396563613235386336663232366439343664366538656262303137 +63653133653730626363326665623732393930396537373333363139396365363365373837376165 +33343334353036623762623635306664393761326562643630666136353334333631313534356234 +31303739316465363763313234356461353531313338613533363935343135643732323761646564 +38313266346238666164386338343764623930386262353066386532343763663931363762616234 +62346334393165633263666237373931346633396264343538366565666433366536316130356263 +64396662333063383935633031616131326165613138313966353364343132326639316336653939 +33653538383339356239343866336263386535613165623130663336613461383630636435353730 +33623563656365353332623631656338396530313466383661646263383162626532646334626533 +61613133663330646565346532396239653462386166393939363063363266373731363336383934 +33626366643139346630313038353061303530393264643230336661346666333333626336646139 +35643563633962383434323362623231666338356361616463656236313565333261333264356430 +33643433623865353463613833663535383162313832316563396135313933303363303437343163 +39366238663630396165623233393964633038613833336161613434343331633562623936623733 +30346662316263383061336130376330346161306333363763613933656139643234393338666531 +36306361316232363361626639653634326530366664396231326461343235373034633332636461 +34363539326239653133383461343030346230313333623836643032306335636433383365646539 +64383735343562633634323937393336663863356661393139353537313133643137613064643035 +32383034306462633937666566333033356531323664653561316134666630393862323039663932 +33393863326234373938373431303363373365383837396662353331383130363461313966363563 +63656632616137653565303036303530396665353564303235633532643633666366373632646433 +62323165306533623733313764613037636365303663346231363131363035386636303130393337 +65313734373161616637376435653735313032363566346338646134323830343035336564633230 +39303665306165623439643831313736323032353066343861376363313133303735346662393761 +35623136376336363864613361353862343963333330633334336330346634336462613131396335 +36353737356539663733646563363131373461373261643762623330333339653335323263386563 +39373264653662323133306532633562643465613238306636333735353733636665396239633237 +66383233353266633134326132336564383331343165616339616539613835643664346366353737 +38646330393936663436383364623830326232613838363039616165633738333062376664393263 +34643866343862333966633466346662663037333962306533316539356135653135643939313561 +37656532363964663864316665646435356665336161303031653730326337356263326335316538 +65366434383930643438323030343830376231366362393139306431323563356164393965613834 +30623965373566353761373963623165363666616234376165656363653239633163353931336363 +63386164613838316236626132323131376537616539383539646662646161363363373339653066 +63346336383930383537623063363061326339653762623762623464336161663937353134346634 +36383338626465623539333730386634363936393437613435323134373765336632653236346366 +38663532313633633039666666303062306232653762323036663437663338626234383164616161 +66373661356666353633373538343632363365353531383338626566646437616331346636663139 +31366362383563636164393262323763333330643337343837306233646633323561353330313238 +39353430353739373464353533356232616437653432393764613630336365656537643134616365 +33343961623332623163643231343165303634646566376330346463613033343032336435333538 +66363237393662633536353631646334396335373934643432373831366162393731346234363964 +65656139303039353864316630313462333436306535626533656539633230633766313131303266 +64353735613732653537343161653534633662623034383262396135346466303037616636666534 +33303061346236313662613862373362313234306337633632396464393661313739313436373735 +38363534646236363161313137376166366231333630383561356638306562656438316630343631 +64373436333932363439623931633664343661633636343830373538346331333262613431313639 +31373030396135626139313238613364626564663932636139353236646536393866353934393566 +37663662643163373030653531613432333236376534323931343630326665613434313930653131 +66643436656266303939623364326362383863393330626332636139376365363732656639386562 +61663034653362323637656532373837353865303861356532326138643363396238333065343364 +36363865346433323835353566306134653461306330666234316561373864643465326466363166 +30323666386366343935383961373863393332356132316334326161393165336463313463633363 +64653533336230393231303038623537363538393063333933383734636234313264356239346461 +30343835306338313431326365643739623762663764316331636433656136356534316661663437 +37303662306331643636656632343530386365393765316662383164633165393566316631336138 +30316665343461326232376365656163653031616636656532366233663632363836313830363634 +35613066646365336563386238386331326262653533333438336431616262373832363566343965 +31333831373165376235313839633165356339616363363461316633363266323938663765366235 +37633662393234313862343030393136323737393939313664343562303634663533623939306463 +33663735656430303062336661613065363833653133353563666637346639646438333563343530 +33303236353862613961303532393363393635333737393231346438613530636364323063663831 +62306332316666333936633238616164323336356462376163373930356136653563383931313931 +36303533633438363661356139666533396437353737316465306530333733626332396133333363 +36383538313763376433363762313231643832616134613339353562316139636630653833633537 +61373830356466663765303332643539373335623336356634636332303738613431393063383434 +61396639633965636466316436376331343437613539313531613635663862383936356565363538 +39323965356636356233336235663361646363336333323432613133343265373236313864363264 +36393339333561383633616335326635653663663862323930383464626331333262323265336566 +34623834393662316466636238353934396164363634623531636635356634316137666130353233 +65626632643933636361666366623238393761653261323865356163316634613532356636363433 +33353061333561366235346632636365356366323363376561636636353530336538353364313634 +39666330383334623163313638343362336362313336316665323766356235643535326138373666 +64393637393434393463383932343734613933643266613234383632366434393138616663366363 +31333337636634306461663137376236323536666231323761646565363935356336356630346161 +61656535633231616135363463663036316564646235326663326261363032323636323032383032 +62306537623932663038383965636162383834343364353161353136663263376138313633643737 +33646531333433353761313763333334306234356461383639663236316364613438323238326662 +31323332633139623930303138303931336230376538333239656165386135656138303834633134 +32626138373830363763646332376538343063396464336636623262306531333135333739383039 +34613330336434323132396238656136323264653139376330303031353763613662393739363639 +62653231643032323130616235303261373632363236393332636463363139633637333931376236 +30303963323265383264323537616362663965626530646464343231383536333431333930663131 +37306436613862386363613136356132623265376239366330616362343966303735373631633736 +36646166373335353334653533653732323330316631393033323361303264646235383365636164 +36623230343133616633363134626433653164333832613933396130323165326537663139633033 +65613461643330343364636633366265323464356362306139653833623166323839623236393633 +39356530303661613262343262383335616630333535383239633939353533613462326430316566 +32633365636461343836373262333261383639626135313031333232343161626364623736386262 +64366534366661336337353764343964323764643537386562366634613865303363303732373663 +38613164363466653831313931353965393932363130306466646433373831393930376261323433 +37623132333934636432313738313133316335376632303565383462316132613366376231663265 +30383136613030613130373065386535346139353837363164353230626266316163363831303365 +31393264613037613833373262353235313862346432653233623162633863313936653531336435 +39386532306434366564313834613862643535666636393965373439313539613766333934616538 +61363838326166353861613331643338626565353964653965656564303330323836653561336538 +30343262663438636336646334613931383538333431643732613463656635306337363433663066 +61356139653438616330373834373835326337333037303931306533343239323835633338653335 +65663961393530363136366139353263636565623836646636386235306537343366346339346161 +66306130363037346232343436653862383830333965343661303032656433346465366636333163 +37633236363939313937363864353338613137663566613737663366626438653563643335393639 +63306335356330343434386237383361396435336432666334316331376365323833653563333161 +36376434663037326235353863376563626233613832313361306363343833663635656266653035 +66313637313337306631376135306162653135636364386261623430663432353862666237626139 +30636336613839623231363137373766303266316433313864643365373238623532626666353639 +66393737346566386663343666363938303064383739393236373562633730306561616464663161 +31656465373836376536313966646666366336343965633133666433353736653333346231386663 +30363764363835663336313031613833666561336532343033353862636162656161373334323631 +65373362326361313632303834646263633764333266636335356363366632653562353235323236 +63396566646339663834636562336131613061663431626635306530383465383965313734633766 +66373236333662336630346465303966366631363438653533383632633833303064373562623535 +30626239646131326235373563333065613437356536366338373365313536623932623166336132 +30323935613862363063346133336334376662386461396136653132326438633934316536336562 +62333137633663663164316431656133613764333861643139366363396564343732303161363239 +39636233663338323264613766313534313762353066636433313563373261666636306135316164 +35653634643438613361613165616239346132333161376462366631613536323532346135393937 +33373333653139373033376164373536643161626136313135303435616530336663313731343961 +64366231383366373365346633653963346265306132306639663938323637353465636136353263 +38383138333032313364663930346261363261336437313362393234633263306135646433373738 +37383436303231616631313132643536623631373861313061353531613431323961373862623766 +37396435353634316534353762323763633238386165613338663131303337656531306332393535 +61656363353131323339323139626234393065633631613164396633646430306262396263353632 +65343038373761323064653061306139343834313733343565613633303432386238613434623566 +32333762333636613437623237313733643962386431346663623232653165303137373030346433 +38386338396561333938613866623763323161623938396530356366633263323434323937646561 +34303564316230383936373164383834303264313739306566633164623861626437393038623633 +38383131656439313763646131346261633666363232363439613536313130643430623166666430 +64306235633733303536643333656139363934613762643230366539343935343161656332366537 +33383361326531656131323366633736306139643565646636356631666236656637386236623539 +64363536613831366236346135393436303039303934353066323438343735353339646662653766 +30393839346139316134373561383461343935373663646361356639303230393735336662316136 +65383035306331356564663961633961396230623665616466666663383565616135323331336138 +39303632396330396533373130326538336137366665653932303666343130333134613033626463 +34666565303833383866626264643566336633656136333566633663336130356335303466346434 +38316536626565616266613638636437643639653435306264353966343034656233333561376366 +36333039666631343330366661346339383133616231646463363330653134343238636666643835 +62623865316132323235343231653461643638343963316561373731373865393039643238383562 +65313261666230323135333765346264663066373933396263613138303236633535373464643762 +33613938376331346632393861616430316334393034626538643566613666393361383636303865 +34343731666261366665333631646130353631353035633535323138636335346266313336626134 +32646266306464343362613766663137343465663663386339616439303739393931616561353864 +64386434343135373963333834636434373065343832353732373935303163353261323531303734 +31326437376230323736303831646364646135393865613763353935626631623761646662393631 +35346231333234643266373564393761313233346363363361623366353266386231376433346632 +37663762356262346337633538663233366432303634343534626661663739633266663264616539 +32333831373539336263316537323335356333356466653937346465633739363736653838633963 +65353862666464613137643361346563346463333237666663353135356437333461343566313361 +63636661326130666163616661643336393730396437313662316539313137386233313065636233 +35383630313537613436313464623763653661323331303939383531373134623032343032343730 +35346363343065656535373661343637346537333636663331343232336564316266303135346664 +33663864633561336233626431663030653064346666363266383036616332333563323234313135 +34353866633037323537626666623363373962366632383761373930376330313932393732366438 +38653539663735633039626238393430663738386137393635636236326564623666333465323232 +34303531353264656438386236383062323935666337323634633639633135643562396232616163 +33653065363439653833306463336663373361363239643530643264633264643635623762376435 +32376230643963343737363533633336343338333464396663613962366235323637343538363063 +31653530366434316131666163303934616132633733376330366530323561333739343137656465 +30316563663665356664656534623039393731333635386236626534353531323563663036633535 +62643066376339356338653937646562616438363933653334633165326266393364666265396536 +34623537643030663939323932623331313864313536396338373266336533373466636562623230 +30343135383662386630383166666362363134613833353336626235356639633831653361343666 +39306465646361323235303234636166663835326334656338616162353961336138646137343139 +62313830353761663034353231323235663138663765313737633830643731376532376161646533 +62626539393464633563373236613138333235396164363131663066303131393131613466623461 +33623232663061343031326338613739646631363830363362353238313165633061366662316462 +36393432396135383538343530346131353634613033363538393430343332623231366130643533 +30656232623666306133383262646437306437363639336566646363613931356263343231626262 +62656438636632376636663138373830383764353865373332303636323236633332613465663761 +66396462303235383631393336393161616236643366663935323464393938663064393034343830 +62396634623135396331323861306434363334323936636666636266306463353836376663303934 +62393038386664353861313239336533383635616666663835616235383337336534376461316139 +66626662386339616231306230636161326433353565346663616134646662626266613363366465 +64303434383838383766373762333065323936636135353338386466616135636331366135643934 +36356636376530316161333836666462623639663633356137613831333935356464306535396630 +64356532393361313833363831366234303031666331656365363634396338343064333330663764 +33363738653230633864323565316535376333303334363864356331356236626637353164646230 +63393666323339656632666437646535323432363939396162623330303039643435333739646539 +61363733653862373035363636666131346561363831316639616532623436343066343130313765 +64346536376531666565333137363131313235626662366636323637373437656439353966366433 +37666334326333386233333661343833333238633563623365353463336265326530373765663663 +32386437333038613933346365336533363039393766316263336365636161336632623066353562 +34373964616634336263393734376331346161623662366361333439316635663134346537643333 +35396262316238393234306135323937303765386430613861373563376363623665393739363033 +33356136306432653733343965656535343632386665633432363638346239613264323434353333 +65613666393663343163393732636133303132373666323538613938316162343631633434376634 +65653361393761343231663833663465663839393734633531343062363531336338643565666238 +35616266393032363934306535666565313039303733396239366266386137323139303037306138 +35663364643866316436393664393232656435366537346135333564613232656535356536663936 +35633862663239386638646562306634646230356132306438303663346238633332323762306165 +36636230346365306638613333383936306561373831393865353138383738656433643363396166 +66316639333565313434653731663334363433613433666563643331666537663539356137343061 +39346530636263346539336530333838333638396664393639336630333930663865323339343264 +65353930333231373432636135626530633266666563303862646261346130656562386465656561 +31376531303061343230383934333638636337303565626631663735633438613063306532393631 +64643236653734366139313430366565333034623339366662656333326261333838313464633730 +33373265303661656636363731643633633133303630346335636336383339643162333533623930 +35633539346138303061306538386633353636343766376430323831656365636561326565333062 +32386138386136383263346233343964393837626661393838616437353035613935323162343930 +38643338643563363363316562393465663661393436353664613932643039613531333735663931 +64396337653664633831303665373239636638326663373634326538613765393437323638623330 +66353435306663346139333330303166383662383865336463393361633336663433333837393064 +36666635316534313565356465613934323735643961313435386134373435356330646138663530 +61323634303734363966326335653837623963376532633536626137656132353964363830333831 +64323062353733353261663636343532646437613536366163613037616237303632323331326263 +35643330326265323464636436643231383430356533623561303635663461313761343962303061 +36356635396461353132313734623535616461386363363362663038363865363565646465316638 +65346630306661613830643431303066623836396332333136633331623234323965356131323935 +31323837303633623066633861393139313337386137616536663166343265393437666437393331 +30333965633739653433353835383032616239393433363465383966386565643864633338326563 +38343334313763663064373234353330626631643865643135373561613564643334363436323363 +33353336643834626431396462333039323231386464363939623530363065353134656234336662 +32333364363532383038616562396466303138333463666538633561396636323566623966383739 +66313034356532363737393130346662623030316363643165346633343132656236656265333834 +31363465636266326234363133393335643834383538643336663932323965643834303134326334 +33636338303531643139613437616631623165323235383339613561623835323332663166663664 +66356162363963313133353864623663393939313264636636333661363432656137643864373432 +65316263666434613634646334356261653636616439666362303738316635316337373461376531 +38313437626237316338366363393433353732343938646233643435316566646265316531643636 +63336462336232623434396234336265336232303366626631663665363930366235656336373765 +65333564663130653266333235613961333264313862653463333463363465356633386536663238 +36353334653331303434356334313162376636323733343830633833643838393564356263643365 +31643737346364396137353335333830303934353663353537393437396635366664656234376434 +65396162613366613164663137613366386564333932356466366431623666376530303764396664 +65366564376663663638633864303936313966636261373638356234623839383866373835393838 +33663238356538616539303534313938383261363837633230626130666231356235316433636437 +39393539386562363230373537646334646136333364353036323064323661306432306435353736 +37313035636336366438646137303135646462346330343330653234643364326233333532353236 +36363539376538663764373439626437656238333834623138313132613232613336303930623437 +36363133363039663864636431616262396436656539663366333664366634303038343061666133 +62313162656362643139366463626561386165623436376338326364316232653033306366346533 +39663834316465386334373439313661383934313338643033313663343834356235316331636666 +66313138636431376430623937323136323434393265633432353130313130313030643434353761 +38666164346539323163316633643538333565316564333039343737383432353139646434366236 +35316261363166373231353238643536323637373861353239343930333161366534666232633366 +37303066353661623433613062636634333335646164326434646638316463313436373063343435 +61373139386533643962333337643366393731623962356462303832313536386635353234623364 +66386265303231313331356232626435366563613561356566343034303436323330303061333236 +63303639626234343839336364393863363534396161396362326166326362623334376161623231 +61326637383932663665633035396331383237343732396233363031376230393034633331303332 +33633639656531316436316165346662623763326238376264353262643735396232623732623030 +36316566316237386462323731613634656332393530383231653534303733393237323165396261 +30343836663536383831373062636332333931343939666532363963356365343562353230316162 +64356237306439373566323830663639613437376534376237376138313662356234666535326133 +65306134653430356638613537393761356434656666336639393136653337316530643465336437 +37633365323731616539383531313235333831323964656430366639633135316365666339666633 +33353139646661363766346463376666356566393537386463663739383766306566333261373830 +61633165323066633666653532346235653165346134656531633939393166386265633666373033 +31613138636166643164663266623139393062306634303138643636316365393565383766663836 +35616133643833396539316131323061386234323466636634653562633032613339353935653431 +36613737656435353632303832383330376139363437303531613164613539306537336334363361 +34366235373365303139653637303439363130313063313762373463623039646337303632333734 +33636535373334316161366664646236383533343037643063386631316635623265383836653636 +62653666626130656363306631656261616333396236303762386637323264343631353738663434 +35353132366631656264393061663537623238363532356430343533366336616539373762333731 +64613466346430646261303939323836613562386237666365313936383565626463383033313436 +31643662316533663338666363623063343333646566363837393438616130623130633937653162 +39633065303363396563633938613133383833373631383832383131306633363238643330353566 +38363532363730386364343661313736626361383835376134373830646163396461616437653965 +65636164393439613335386263353138363837376462653466633033323832383835303563653066 +36656363326337313633353830323039333038613064366436363465613234313132623163306132 +30336332626366666638316331366631326162626631323533386233356162643831656163316630 +38636137623937663465613237616432323132316134653032333637646139373362383535633432 +36356331353161383565336635366539303865666437396239633133636665333462653965643431 +36356363366335386430613835306665396635343431323239633638386237373336663437613161 +32346465343536323634376132336239313633343037626231313764666136383233626265363234 +62313265326539386462663164653366353464363761393330373435663164373337646130393763 +63386338653134663536663264653963613239316532313733343232313332636637343061393037 +35383538356536613263343136616233316362383362346137313836646236343436333564353864 +38643336326635653665626264613563363261376539336163333030316538333330626639383761 +64326239356163373432346264643830336363373432343230316164393638366661323131366261 +61653434313531363935383338633431663231306533623863386163333566396561346166363535 +38323661646431316165663861653261653636353932306533643831373139656131623963653531 +30626331626563646366323362336163393135613139663831303933646563633337336538636632 +37383365343162323966636639313431333630643736313465303735373363336539353730346462 +30396336303135393338656132373234363663623437623366636462633864356535396638643536 +62313764646162333065393764626132356630343664636662663665386335616138323930353137 +33313139653166646236616561613736303564363233373634303532386530316330613639323835 +32643665386133326339613464633630386639346161323730643436343832326237623665333434 +36643862336431653731633761333166366663383138646632376238613833653662303337623039 +63623932643130323161663633666163393334613331646436333861333432313563303732316438 +61383863636563623431363234373031373632366262653666343861396431643361373830626162 +64653135656138353439383034353131396662306533373832353033396164633939356161303435 +39626230643162316333383130663965663561313065346130666631346531623764303736376464 +65633664346331656633383638323061313230313935313938663938653237326263393137633136 +37633337393134386533623538366565333232323336656365656236343931303633306565623763 +31343336636235333630646530626234393334653532336637373339623035633539363937313061 +35666164653965623862353563333030313139623864323638376465326634376530396633396661 +62306461376365303930623239613934306261633933376264656637633539353663373331383438 +66356636383036666434383732616233346564646166653431366333303864613031626662386664 +63313638353166316164356263386439363666323864653663633635316561323237323235336133 +32386161396336646336643363613664663038663731653333306533366431386364326265393437 +62313863666462633764396466666237663537356238643064346461636236616339363835373633 +31393961396461303032353033663965343637393730393765663538383736356462323035336433 +36316233663335643734376563353138363262353665373733383061633263323566653535663136 +33656539323132616334316466383136653830633564393134323830373262366361646238636464 +65393238343135386439666536643764633630386436616461306432653635343232323332636661 +39343633633764653965323532386661363936396236646131313233326633383539626133653061 +61393666666231653366346137333961373139333639356362386439313336393565663932646163 +33393566373962386536363535353136383635303433396435666664366530663965373931393233 +37376465316266326132303132303463386161656139643537303063323930373533343333383733 +33386336646361396230633339613030303239353638366331613635363932663737366533326431 +38393338326563343666626231353664326434643935636635376630316363656632333765643038 +65636332613332633961613961353839363038653864633233333162613063356562306362653763 +37633736393261613836633261326330373366613464626136666338393164643030353135316238 +35633262633130373737613232623436383635623234663738653466366564666336346535363234 +61623831613066346635386161393862323161363532323565333832373035656135393365363033 +65626437656266373161616430313331653033643364346161363032356531363738323136353838 +36346535306361386665363334396337613664333037353161656237316566653366303362353031 +63366336633837633534303966333139303534613439633430653733313666353832333337326339 +39376439363136333731393831616665613936663430353337613731653130313334633530623262 +31643835383333363731353239373663313930316533633533666337646465373639393865343337 +39633930353662656635333866396165393135656337336164646331623061393737333464373332 +31636234333037633434616566386665613635363833343663376562643830636465393666306364 +38323237623938353365636164326237326366326231653931326535303834323737646461633665 +39393032343463323761623331646339666238353234336438396138613061373563376135316634 +66646366623735343235326265323832386334623662336636313565323365623565373864336662 +32383162316263356334613038626137336563373763613964666338346434656335393036373633 +37663037386431376530636262653237343132373962376234343665313332366162363231303462 +31353733663162313533323966366164333431393061643037313265383536323263353366393463 +39633031633864613565316531663636383737353634333063393232376264383936626264643063 +38663039363531363633316333646264303166316432633632623466393532316432323337323031 +63613936623536313664663362623436373231313965646634626565643431653237616364313866 +38316132326238393437333533366534363334626235613334333036303435393865643836313931 +31383632303135363066303136386132633062646361303234666139653330653537363862356131 +36313938303635313034303932353062623933366130303132373863623366336333383630313934 +34366431326565353336336634623364353666636635396434623530616466376634323638663265 +33396564633037343437623165663832393732336530663331363431346566393964303132636430 +62353766303866643663663466366465326462363939623930376235666434316539393862396434 +63363639616662336136333664393739663339656233626563383537346335383039346236666162 +62393330396138356337313034633963333232383761376237643863666539666136653861363136 +31613439666135303233396263396465346234393931393739306339633633643238616362353839 +66643433316639653534386465383766623437383131643466323865323833643563633661613932 +30623433393663303063323638393262663031663935313764613438393434353665643634373736 +38633830626461616130616436396364383833353934613163313338316538313730376633393339 +37393535386663346535383432326435643331633930613266333764313065383162333261396162 +38323634303232613964373663396534363638646430366566343430643862346563363639383434 +30383865363038623635623162623634383562373436343134353265306463373432313466333865 +34383336616564373866363364613539633333366532376132386566353030356166313536383262 +39313330616265396639303566306230336636316338383431623134666564323066646161396563 +30346161356337396231356139376165396633303233623538323362623766303037633638393530 +63656565623165336435353739363663366235366338376535376165626539323236353564656565 +66323539363862356232613263623131376563373532613633616335636435653938323761636533 +38613836653532666535366538666339633134393263353861363930346637643039383230333532 +66313230393832336663343861633864373562643835663061383133383135383136643836623562 +66623439333666343136303738366339383736376566333466666334373465373435666464343733 +62656564353661653961383136333439636532646663613238656262646231653135363466626565 +38326363623561396332636665646365376262633239616663323339336135633638386430653231 +66663831656231616265643439646632666435386230646363393434363934393462613561646564 +35333164636361656262386637373537653436613364353562643762376161396236623735643433 +66376565353562653964653236303237626163356635353733376238383438303464373961396363 +32303663366266353563393264393139383839636162336132663133303466646664373030346234 +61393066363566343531393735653763313437333365663161326365363632393530643330326232 +64346430666535653334323736643637623432383632363438306362326632653439613933663332 +66653162333438303934326464353039643232346530333839323864666464393030653063373333 +37613564336261646133366136336365336334373636336436326539333930613337396634666134 +62343562666434613136376664356262636338353839373633393734613432323365633133336661 +65346138393833353833303432626535323430346430653562396361316231366264623032376435 +39303266346433326165333661326163303232353462326130613031393738636662353666646565 +63633136343438333138323162383434303164356235623931656462636364353731366361663566 +39666337366130343931373461353761626230613063623864353963343636393639393963376130 +34326565376263353463386135393031363864383761616635666664323538663463303332373833 +65303165356162616635396233343435656539643263303534313164353663376362643863646632 +35373363303334366363336262616161666563393534646166633431356438613161613430356235 +37343433396337353735396161373335333439623935646362626139643063663066656638333065 +34323561323933363930353861343637346336636262346537653563333363313832613831623663 +38343939663762393661313434663330306239663464316138343665303737343034326332393635 +61633136316139383037326632346437383235363262366264393932656232643863323866643838 +38616430383166663138383063323032336435393539366435323463636261653034623636353161 +31613664663666663636386435326663653430346137623636316365323837353765643239636532 +31643564346566663434363730333062313630633739386164366233643466363166313231663861 +61653132333433363537653639303137373462373533363434366166623337626161633466366638 +35626336666264626334326336323366643637303663386363356137323535326561643961653839 +63376364636534313738336361663464353261633965353061313334633739636631643062393330 +66623465383830626462663735666437326434613835303866653864653531633535626463386261 +38346637663631323263333639336138613031323037333233363033323262623430643464353566 +33396662633866326533303639663639303439326663396234653733653939326666393937343763 +34383139353038356364303562363233333837353565306133623034623738663731393238366334 +30633534306539373430353435656533653665656634363937343738303065626665656536396464 +32653861303134353935643539333638323131633435356530303633326132376335343032666564 +35666466323066303461383238366136613536323664616330613831346665653163353862303162 +63353262363962653235633030363433646432616434366564353065373634363761626332343332 +36626431343665343030336261383866626634363265303162653165653133313735343865366236 +63366166666239336336373262646134616632323564346536613264616635343733623937323831 +36343338336165386231623236633965633566343565653065633362386239323562363663343532 +33303262393462363466396532613732636134353337323065373439376265626436353337663866 +65616538313133663738306535636663303737323430623036656430396161646563663837303537 +30626538323535373939613134366534653733386237303038313833383234333839323432616439 +35336535323733623930613030666236326434646633623233346661623066613061343739656465 +63393735333138313435656239623535306365656333666533383435373565623865373833653138 +32366263666661633765666136663265306665396363386234383932306136613531663235373438 +64626236306663396638303438303938363365313565386262393637613162373636623134313636 +36376465316262623932373935636563306164616564643465393932363535303637316338343534 +33326665363639376135626263383665613534643030663339653931356136393430386262613663 +37656330366232633866346537333437386361633039353731646365636261363832623461376330 +66656239666231636362383839346565383031326533613337346263663630376434653238356663 +32336235653735626138613232396135636130373931346265306262613332353537643432643931 +36333637633866653934303237653639353964336232666137613961396265316339623730633866 +66653035616539623138326165626636633732663237643830653464363937316363633462323538 +62343530626639346135323630656564633261393534613934373466333363353866396465303164 +32663531663332666365666532376664646163393430616436326639663039663534633562653162 +62376531386234393633643466373065613130383732333736633736363162346338353161643731 +33346132646263353336316139383164613464393261333365376165613161373333626532363662 +39623861363830643966346166373565646231623137363436346332393264616334623262316535 +30333766643533313261643366666562363033613639376664646431613563323938383433643264 +64653836643038623238346432316138326364383238306166333463356137306435616630366232 +33393365636566663764326630656637376366396238336361663839616637656530613864643537 +63393464393963353033323037343361343731336261313461366461663534626530306637323964 +39633261616634663063313533346565376433353763343365376662643737623563323331306635 +37366131383064643664323035303034643637616130366661303064653631386635306137356432 +33396332313066653535633665363033636562663232646439646538393531336161303161346161 +34386633656330623966326263393764333537306333653062333735376363353663376233396363 +61613733663264613563633839393930386536633063386431363832643439333231363961393330 +66323235373336373438653663383334343564613635663533653539623964636335373437306162 +33333365316363313536386664353035363364613235336462616334383961316134343261323631 +32383634326562656233306539333631346539343965396534663137336166353932653431653034 +65343935303930343932346266613665396662613430623630653266613337313933323035633639 +33386163633463396334656431623931336662346336663532623365323065643936323239653732 +66383330323362336333623830316163303233396366613337376563363632363439656636376537 +64333535636339326131326331653563666165383337373337343935356136323262643364303038 +37323361396131326232623931316661633836366462366136616137386534646432663830383561 +34633933306439323430356531643737353266623265313134383262313532333033653838346639 +37346235373935303366333766316264303036316130353339383837353731376564386537353933 +64356532663539383461383831323934666636373865326637383635636239396664646466643438 +31316233353033393634623664303261343538363932336264633464663834393563626561353638 +37393062616265396262383062666130633263666265306534393632323632373163653666333636 +37333739326534666637636338376333623339626237383937353531363465396234613666663631 +39383936303733633331356139663762356665653765653761353132636532626436616236326665 +32623731626133373536626139353639336632316266356338353263656664613238636263623334 +66323332613532356365396364376532306235633766656262653932373735616131343262396162 +38613632373861363734636631313763393062376135653637333132613736366566613666333033 +36386265343239373030316436656539313930613039346334646131663330333966616635376566 +62643631353036366537303139316563363738396635656631303661613032343564663566663438 +63613338613336396431363036663636633861623766663537393535643231636134353266663437 +64393536323730303236363533313738636263666336303930376165383634626263343966643630 +38653030643463653365626237633338666338373361613064386461386437623431353766353762 +31646236663965326262623466323533653638313239633563333839303637393962626233613961 +36303231346636613537366339333932313636333530623030623635633162386262643861656239 +32343735353961336631363939313163396265396164653333336237323132646338626536386435 +62643766323436373639376432386561323265636266386233636663653536363565376266633064 +61616461653439626439616330666563393866313033633738646334313434633461643664646661 +62396664613465313838353962643938346432353338353164303331363261353966643935623533 +30636265353339663966373131643036366238626165306430663863313263393831666432363964 +63633562343738656364303739366238306465633165653862393436363339373134656431346664 +36333064316666333334393362363834366138633565373061313338313034613038386534666464 +39373832363230656464636564666139353064333535636237626334373361326338393537323435 +66346163393563396134316230626463323064393162656363656534663731396566356639306236 +33666565333064623566336638613231333539636339653165316662656537633132646333613364 +65363033383065353935353738646461376531313938313930323961326231376561353330326566 +62353431626463396230343237363035633236666665316636646230316339306339633139653161 +39636536333633316233383430633639386263343762663063353366333038353637326238316339 +62353330636362663731656135653462623134346266636130613738323565663436393161373965 +64653136396263636530646438653561666536353833303539376335376561326163633466343730 +38663266373462663539376463363766346532393835383236643239363739366238356138323661 +37646363303533613536376530363364653936396435356432616362336466613635343632393539 +34343133306238616233646163306436336636333761326135663931313865373831353936653334 +32353662356137386639663232376634666534306333613033323133303733303531366366373333 +37356538326233656163383162326437313331393361356436363766636533653133356533373965 +66366364613232633561653763303631633532366661383863363339306466623164346465656230 +61343839643461353138303435353634383265646363386230333065653231326163656562336434 +61323566323035393462356636633833393733653064653363316261303732303736353832646430 +37626461336361356630306461303736306566663763616562333631643763353331363831646461 +63396335323566343836626637366337363734343763326234643634623138313334663032343637 +30373736666132313634386466366233353334303435313766333162363536383134386661646534 +64363038626161313561663639656635613335376430363365616235363866636231666436323965 +65316438633438373039616261653565333136383535383362353366396232363835376665636333 +33633062346539653634343733333063623530313032343466663536633337363136666561346163 +37323330623535646433323831303337356631366362313731316433663762656434333736626663 +65356538363662393362623630383166313735313738306338353064373630343735366466613035 +62393038353437646163393761643162343333663538323434653130333264613536613536306363 +66616132636466346330663938396332643162373537663435363131346133656637356438393636 +35326434396338663738323663623135356237643730346261633235646535366438306230653562 +61383866663836353261373836386234343765333532633737343835346163353265633939646565 +64326566393532346265323861396539623135366130613564396633336530393932666636323333 +64303639613062313266643735366437333232393366633361663764386366346130653361353565 +64353031663931666634386234626338633663376266376331333339366162336466633364366434 +61363134356538386530626135343634363737363939353433666465386530393232323062656535 +37613864313566623839643137623961316435613731383562346435396565363338393432666332 +32333332393037306530393634653864386533313930366633303935333933353964633138336131 +33363137336164613338633238386630353262356434386130316637653461613434323132323932 +66386262333534623461313138366134616533666530613266636464373164633065396464383335 +62653962623939386636623532613838303032626239616661343731656561306163323262343631 +66626430316431363065306130386432336138363739333264386565393438623036363530646336 +39623461343337373562383463663733623237326233376437373463626133386539646666633037 +33333666373230353839306436303735363131633335666563346634353537303931653033346534 +66333732303033393762363730613531363935643936643933333336326563333836326165613831 +34386261366137336430363666343734373163366338366561333261653730666238363237313338 +64393330353563643139386633326165316364396565613336616166396633396132323236323633 +64343764393762373238633337366635643632626562323533343836323064346533623039373762 +34353034313762373332616636333931346566623033613237313363633730343463653366306665 +35656630643632393638363438373239303334623530313462373436643636383932326231616236 +34313238623661356566386531353439666232666336393438626530316534323034386435636166 +64326231326537336362636239646631326530646363626434356465303461313139323936376131 +30383262626462623234653162323037353035366666316464326635323037313864623932656230 +32373534663061363135646364643734663234376330353761626431653339303663316137653038 +65346337326366366139353333326330623462613932366235326361323664663432363734643630 +30663665336432633565313763653234393966656533356664633633346337383361353063626433 +32336664336362366664376437303966386661356436316534656462613435343339643764396533 +31643138633865636264323364306138666464326361343735613161326662623363373930663835 +35323066393039383465393563346632373633363561393836326438626363663365316435646633 +62363136373437643534343730623835363330616432643134383630393166386530663133323933 +32623065373236363635626432306165313232346165643433643937386638623561313233306239 +66336132396462316239653134323933653061633565376238346536396262363734616465646532 +61396530353735383933313263386331356132306531666464303639363131626165373432313662 +30346634356562636335613565383664353162363965626135633734633439393439393036626638 +64373265643631666565353432643237663433393461396537333535656438666566393035363663 +34303930316162653766313734346335393766333735313463303739353232643466356238396662 +33343936313834353533656564666163323865613035306235336634653234623233356565646166 +39333366613934333866376335643435343334373838363732653764353236343039343531636366 +66343834346235306438366330333064666435363161633733363837343635613130303166393764 +34313562623733376330663334313162383464343630383234383134623038303239383234633733 +36396238313962633763363964313537636231643936323962316434386630626161306334326664 +63363730633937303539366665373531373034646638396637333262643037363235393765623735 +66353837663766393838373237613765623639366536616330353563303531363730373331366131 +35666134363835306638376238626362373961613737303632393839613134336136643931373138 +38333966376437633164633261613034383431323061323036656664386566383831363366303130 +35386233346162643238373465373136356261656661656133326331646535653638323139323031 +37666564373834343537613265386563396664313034643837376462353437376161363433343438 +62636435373130646130626531373638373939303162373730313938313230343731623465633937 +37626530376439333765633561336565663864396361353333656534333164643366303238646139 +30393236356538656532306330623865623234396330336535333063336635353963656336623266 +30353663366638633633323463373933336161623134383761383932623837313866653930303437 +35343733613164356565333165353032303036316665626638656333613365643539633637383562 +62333835316465613266386232383332393462643531333566383030363562656138363762343861 +33323136396634636136386366383231636262353731353033613632653736303366393934613631 +36353566303166373765333165323262306163376265386138396538396330376536356132313665 +66396436303666633131376232303239386539333536633866366437363131366464366538613138 +38306131636535383039353035353530663361393136613930666237633935303736653366346330 +30323736386264613439383030666432643639373037636632383664643835323538363961323737 +31663535323361303930633165653639303465353335653433643430376533613538376666303631 +35363464616634633334613566353966343239343536353930336663303037643034623939376334 +30666330303336356239343439653232653436636636373435343737333165336561653436373365 +39643663643935383834373565613665646233326134383638323364613964643737633734653434 +32376364356539386236643264313963643333336636396436323539623139336338363732303166 +39653066633132633630313932656663313236313063636331393261326634316637663063616565 +31636136626435343837323965346332313635336239306132363837323762343831663562323262 +31336635323834333262396239363166306530313330303130666633353934373638383765663036 +61373363306132373134333664366137366339353763346331666431376136323339623465613162 +35326664373134326235613764306561636430333632613463643666313134366635313330633934 +62306337633638313336376230663337313139626134613432656361386230643764336261626330 +39656562653539353362643832643338393461353434653966383366386265643932653962346435 +36386233353963613161393435313463316435303833623632366665303765376363323263333338 +30666166623765623564626465626437396534616631303737323163616332333037376133623364 +36333062383133376561636330643063323865386637333834613631333163343731396432373934 +32623462646432653564393164376565336234663233306639393261313934646563626138633533 +31643332353663663965633436616332346230623539366237613833303634383665306539313765 +66333061376530326536326364643761373834613132306432356665326636333031656234636539 +35643666613631626365303462383436306163336332636565626365396266343565613963346161 +63313732383839333232396135303233353765313736346565383363396266336163303330376363 +31383963373239383039313538373433666637366632333131373061633664346263336362626361 +36343631353430346139633032626361623864626266383432396466333064303362333530396566 +39626636613739333033653037363932353737623362353738653834613566363432333532326434 +66613436303637386535653062336462643161663032653464316339646134306339373062666430 +62303539616165386233636263306235643232346264333639666131626530623939383032313939 +36393763353166316338353030373064623830333130663061356462313765653337393131636264 +37386136646138303032633765633364366134316165643566613238393635616166333866616332 +39653632626539666462653230363666663831663963393665396633663034383139366363313035 +63343632306539303232333935306536393166343136616638393532346538653461326461346437 +66376536343932626235346430613334613735616461366661326364346234633761343562616132 +61396535316130663065363565626362636563376466623062373534326362653362376634626461 +36383663366364313134363036353338353036303163313164346631663737346434356339343335 +35303037333562656637663161663166316661316230386534623836633562346430393331323938 +36393931373561393365653464646561386636356565663830366261373036333033633363313832 +63393739653135633039633935393662353938343930353164383637613939353730363733623566 +38613765343638663134373565313662333261316665316538653436363266303137306130356363 +61616431613831393030393332633532306633613937383361393730373930396435663639363562 +62326435653532373031656434333538636234643766383561643830303932306232663865633235 +39376661333639653338393536643135616164393263666663323339626435366238323366393463 +64313562393139313235366264373064353931383362386535333066343538346631383565306531 +36373532663564336362643333356463343231316462353265646665336562633535363566383565 +66326463373632633938343861643730383437616638383035643930303238663637 diff --git a/etc/kayobe/environments/ci-capi-aio/network-allocation.yml b/etc/kayobe/environments/ci-capi-aio/network-allocation.yml new file mode 100644 index 000000000..fa7158222 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/network-allocation.yml @@ -0,0 +1,3 @@ +--- +aio_ips: + controller0: 192.168.33.3 diff --git a/etc/kayobe/environments/ci-capi-aio/networks.yml b/etc/kayobe/environments/ci-capi-aio/networks.yml new file mode 100644 index 000000000..216696eaa --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/networks.yml @@ -0,0 +1,119 @@ +--- +# Kayobe network configuration. + +############################################################################### +# Network role to network mappings. + +# Map all networks to the all-in-one network. + +# Name of the network used for admin access to the overcloud +#admin_oc_net_name: +admin_oc_net_name: aio + +# Name of the network used by the seed to manage the bare metal overcloud +# hosts via their out-of-band management controllers. +#oob_oc_net_name: +oob_oc_net_name: aio + +# Name of the network used by the seed to provision the bare metal overcloud +# hosts. +#provision_oc_net_name: +provision_oc_net_name: aio + +# Name of the network used by the overcloud hosts to manage the bare metal +# compute hosts via their out-of-band management controllers. +#oob_wl_net_name: +oob_wl_net_name: aio + +# Name of the network used by the overcloud hosts to provision the bare metal +# workload hosts. +#provision_wl_net_name: +provision_wl_net_name: aio + +# Name of the network used to expose the internal OpenStack API endpoints. +#internal_net_name: +internal_net_name: aio + +# List of names of networks used to provide external network access via +# Neutron. +# Deprecated name: external_net_name +# If external_net_name is defined, external_net_names will default to a list +# containing one item, external_net_name. +#external_net_names: +external_net_names: + - aio + +# Name of the network used to expose the public OpenStack API endpoints. +#public_net_name: +public_net_name: aio + +# Name of the network used by Neutron to carry tenant overlay network traffic. +#tunnel_net_name: +tunnel_net_name: aio + +# Name of the network used to carry storage data traffic. +#storage_net_name: +storage_net_name: aio + +# Name of the network used to carry storage management traffic. +#storage_mgmt_net_name: +storage_mgmt_net_name: aio + +# Name of the network used to carry swift storage data traffic. +#swift_storage_net_name: +swift_storage_net_name: aio + +# Name of the network used to carry swift storage replication traffic. +#swift_storage_replication_net_name: +swift_storage_replication_net_name: aio + +# Name of the network used to perform hardware introspection on the bare metal +# workload hosts. +#inspection_net_name: +inspection_net_name: aio + +# Name of the network used to perform cleaning on the bare metal workload +# hosts +#cleaning_net_name: +cleaning_net_name: aio + +############################################################################### +# Network definitions. + +# All-in-one network. +aio_cidr: 192.168.33.0/24 +aio_allocation_pool_start: 192.168.33.3 +aio_allocation_pool_end: 192.168.33.30 +aio_neutron_allocation_pool_start: 192.168.33.31 +aio_neutron_allocation_pool_end: 192.168.33.127 +aio_inspection_allocation_pool_start: 192.168.33.128 +aio_inspection_allocation_pool_end: 192.168.33.254 +aio_vip_address: 192.168.33.2 + +############################################################################### +# Network virtual patch link configuration. + +# Suffix for Open vSwitch bridge names. +#network_bridge_suffix_ovs: + +# Prefix for virtual patch interface names. +#network_patch_prefix: + +# Suffix for virtual patch link interface names when connected towards the +# physical interface. +#network_patch_suffix_phy: + +# Suffix for virtual patch link interface names when connected towards the +# OVS bridge. +#network_patch_suffix_ovs: + +############################################################################### +# Network routing table configuration. + +# List of IP routing tables. Each item should be a dict containing 'id' and +# 'name' items. These tables will be added to /etc/iproute2/rt_tables. +#network_route_tables: + +############################################################################### +# Dummy variable to allow Ansible to accept this file. +workaround_ansible_issue_8743: yes diff --git a/etc/kayobe/environments/ci-capi-aio/secrets/libvirt_sasl_password b/etc/kayobe/environments/ci-capi-aio/secrets/libvirt_sasl_password new file mode 100644 index 000000000..13d7b6fa6 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/secrets/libvirt_sasl_password @@ -0,0 +1 @@ +i:DVuHrKeAsL.yMra9VK diff --git a/etc/kayobe/environments/ci-capi-aio/stackhpc-ci.yml b/etc/kayobe/environments/ci-capi-aio/stackhpc-ci.yml new file mode 100644 index 000000000..5526ddd99 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/stackhpc-ci.yml @@ -0,0 +1,82 @@ +--- +############################################################################### +# Kolla configuration. + +# Docker namespace to use for Kolla images. Default is 'kolla'. +kolla_docker_namespace: stackhpc-dev + +# Do not enable central logging if using Rocky Linux 9. It does not have elasticsearch +kolla_enable_central_logging: "{{ os_release != '9' }}" + +############################################################################### +# Network configuration. + +# Don't touch resolv.conf: use Neutron DNS for accessing Pulp server via +# hostname. +resolv_is_managed: false + +############################################################################### +# StackHPC configuration. + +# Host and port of a package repository mirror. +# Build and deploy the development Pulp service repositories. +stackhpc_repo_mirror_url: "https://pulp.128-232-222-245.sslip.io" + +# Build and deploy released Pulp repository versions. +stackhpc_repo_centos_stream_baseos_version: "{{ stackhpc_pulp_repo_centos_stream_8_baseos_version }}" +stackhpc_repo_centos_stream_appstream_version: "{{ stackhpc_pulp_repo_centos_stream_8_appstream_version }}" +stackhpc_repo_centos_stream_extras_version: "{{ stackhpc_pulp_repo_centos_stream_8_extras_version }}" +stackhpc_repo_epel_version: "{{ stackhpc_pulp_repo_epel_version }}" +stackhpc_repo_epel_modular_version: "{{ stackhpc_pulp_repo_epel_modular_version }}" +stackhpc_repo_docker_version: "{{ stackhpc_pulp_repo_docker_version }}" +stackhpc_repo_centos_stream_advanced_virtualization_version: "{{ stackhpc_pulp_repo_centos_stream_8_advanced_virtualization_version }}" +stackhpc_repo_centos_stream_nfv_extras_version: "{{ stackhpc_pulp_repo_centos_stream_8_nfv_extras_version }}" +stackhpc_repo_centos_stream_nfv_openvswitch_version: "{{ stackhpc_pulp_repo_centos_stream_8_nfv_openvswitch_version }}" +stackhpc_repo_centos_stream_openstack_yoga_version: "{{ stackhpc_pulp_repo_centos_stream_8_openstack_yoga_version }}" +stackhpc_repo_centos_stream_opstools_version: "{{ stackhpc_pulp_repo_centos_stream_8_opstools_version }}" +stackhpc_repo_centos_stream_powertools_version: "{{ stackhpc_pulp_repo_centos_stream_8_powertools_version }}" +stackhpc_repo_centos_stream_storage_ceph_pacific_version: "{{ stackhpc_pulp_repo_centos_stream_8_storage_ceph_pacific_version }}" +stackhpc_repo_elasticsearch_logstash_kibana_7_x_version: "{{ stackhpc_pulp_repo_elasticsearch_logstash_kibana_7_x_version }}" +stackhpc_repo_grafana_version: "{{ stackhpc_pulp_repo_grafana_version }}" +stackhpc_repo_mariadb_10_6_centos8_version: "{{ stackhpc_pulp_repo_mariadb_10_6_centos8_version }}" +stackhpc_repo_rabbitmq_erlang_version: "{{ stackhpc_pulp_repo_rabbitmq_erlang_version }}" +stackhpc_repo_rabbitmq_server_version: "{{ stackhpc_pulp_repo_rabbitmq_server_version }}" +stackhpc_repo_treasuredata_4_version: "{{ stackhpc_pulp_repo_treasuredata_4_version }}" +stackhpc_repo_ubuntu_cloud_archive_version: "{{ stackhpc_pulp_repo_ubuntu_cloud_archive_version }}" +stackhpc_repo_ubuntu_focal_version: "{{ stackhpc_pulp_repo_ubuntu_focal_version }}" +stackhpc_repo_ubuntu_focal_security_version: "{{ stackhpc_pulp_repo_ubuntu_focal_security_version }}" +stackhpc_repo_docker_ce_ubuntu_version: "{{ stackhpc_pulp_repo_docker_ce_ubuntu_version }}" +stackhpc_repo_centos_stream_9_nfv_openvswitch_version: "{{ stackhpc_pulp_repo_centos_stream_9_nfv_openvswitch_version }}" +stackhpc_repo_centos_stream_9_openstack_yoga_version: "{{ stackhpc_pulp_repo_centos_stream_9_openstack_yoga_version }}" +stackhpc_repo_centos_stream_9_opstools_version: "{{ stackhpc_pulp_repo_centos_stream_9_opstools_version }}" +stackhpc_repo_centos_stream_9_storage_ceph_pacific_version: "{{ stackhpc_pulp_repo_centos_stream_9_storage_ceph_pacific_version }}" +stackhpc_repo_centos_stream_9_docker_version: "{{ stackhpc_pulp_repo_centos_stream_9_docker_version }}" +stackhpc_repo_rhel_9_treasuredata_4_version: "{{ stackhpc_pulp_repo_rhel_9_treasuredata_4_version }}" +stackhpc_repo_rhel_9_mariadb_10_6_version: "{{ stackhpc_pulp_repo_rhel_9_mariadb_10_6_version }}" +stackhpc_repo_rhel_9_influxdb_version: "{{ stackhpc_pulp_repo_rhel_9_influxdb_version }}" +stackhpc_repo_rocky_9_crb_version: "{{ stackhpc_pulp_repo_rocky_9_1_crb_version }}" +stackhpc_repo_rocky_9_highavailability_version: "{{ stackhpc_pulp_repo_rocky_9_1_highavailability_version }}" +stackhpc_repo_epel_9_version: "{{ stackhpc_pulp_repo_epel_9_version }}" +## Use derived vars from etc/kayobe/pulp.yml to switch between +## minor Rocky versions using stackhpc_pulp_repo_rocky_x_minor_version +stackhpc_repo_rocky_baseos_version: "{{ stackhpc_pulp_repo_rocky_8_baseos_version }}" +stackhpc_repo_rocky_appstream_version: "{{ stackhpc_pulp_repo_rocky_8_appstream_version }}" +stackhpc_repo_rocky_extras_version: "{{ stackhpc_pulp_repo_rocky_8_extras_version }}" +stackhpc_repo_rocky_9_baseos_version: "{{ stackhpc_pulp_repo_rocky_9_baseos_version }}" +stackhpc_repo_rocky_9_appstream_version: "{{ stackhpc_pulp_repo_rocky_9_appstream_version }}" +stackhpc_repo_rocky_9_extras_version: "{{ stackhpc_pulp_repo_rocky_9_extras_version }}" + +# Rocky-and-CI-specific Pulp urls +stackhpc_repo_rocky_baseos_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/BaseOS/x86_64/os/{{ stackhpc_repo_rocky_baseos_version }}/" +stackhpc_repo_rocky_appstream_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/AppStream/x86_64/os/{{ stackhpc_repo_rocky_appstream_version }}/" +stackhpc_repo_rocky_extras_url: "{{ stackhpc_repo_mirror_url }}/pulp/content/rocky/8.{{ stackhpc_pulp_repo_rocky_8_minor_version }}/extras/x86_64/os/{{ stackhpc_repo_rocky_extras_version }}/" +stackhpc_repo_rocky_9_baseos_version: "{{ stackhpc_pulp_repo_rocky_9_baseos_version }}" +stackhpc_repo_rocky_9_appstream_version: "{{ stackhpc_pulp_repo_rocky_9_appstream_version }}" +stackhpc_repo_rocky_9_extras_version: "{{ stackhpc_pulp_repo_rocky_9_extras_version }}" + +# Pull through cache mirring ark.stackhpc.com +stackhpc_docker_registry: "registry.128-232-222-245.sslip.io" + +# We don't use auth against the pulp server +secrets_pulp_password: "" + diff --git a/etc/kayobe/environments/ci-capi-aio/tf-networks.yml b/etc/kayobe/environments/ci-capi-aio/tf-networks.yml new file mode 100644 index 000000000..1b57bf648 --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/tf-networks.yml @@ -0,0 +1,9 @@ + +admin_oc_net_name: admin +admin_cidr: "{{ access_cidr.value }}" +admin_allocation_pool_start: 0.0.0.0 +admin_allocation_pool_end: 0.0.0.0 +admin_gateway: "{{ access_gw.value }}" +admin_bootproto: dhcp +admin_ips: + controller0: "{{ access_ip_v4.value }}" diff --git a/etc/kayobe/environments/ci-capi-aio/tf-outputs.yml b/etc/kayobe/environments/ci-capi-aio/tf-outputs.yml new file mode 100644 index 000000000..40da332fd --- /dev/null +++ b/etc/kayobe/environments/ci-capi-aio/tf-outputs.yml @@ -0,0 +1,22 @@ +{ + "access_cidr": { + "sensitive": false, + "type": "string", + "value": "10.0.0.0/16" + }, + "access_gw": { + "sensitive": false, + "type": "string", + "value": "10.0.0.1" + }, + "access_interface": { + "sensitive": false, + "type": "string", + "value": "ens3" + }, + "access_ip_v4": { + "sensitive": false, + "type": "string", + "value": "10.0.0.133" + } +} diff --git a/etc/kayobe/environments/ci-multinode/inventory/group_vars/controllers/network-interfaces b/etc/kayobe/environments/ci-multinode/inventory/group_vars/controllers/network-interfaces index fed18bf18..7df8bec28 100644 --- a/etc/kayobe/environments/ci-multinode/inventory/group_vars/controllers/network-interfaces +++ b/etc/kayobe/environments/ci-multinode/inventory/group_vars/controllers/network-interfaces @@ -14,7 +14,7 @@ public_interface: "{{ vxlan_interfaces[0].device }}.{{ public_vlan }}" public_routes: - cidr: "{{ external_cidr }}" - gateway: "{{ public_net_name | net_ip('seed') }}" + gateway: "{{ public_net_name | net_ip( groups['seed'][0] ) }}" ############################################################################### # Dummy variable to allow Ansible to accept this file. diff --git a/etc/kayobe/environments/ci-multinode/neutron.yml b/etc/kayobe/environments/ci-multinode/neutron.yml index 1a7fd8255..44f50d00c 100644 --- a/etc/kayobe/environments/ci-multinode/neutron.yml +++ b/etc/kayobe/environments/ci-multinode/neutron.yml @@ -1,3 +1,12 @@ --- kolla_neutron_ml2_network_vlan_ranges: - physical_network: "physnet1" + +kolla_neutron_ml2_type_drivers: + - flat + - vlan + - "{{ 'geneve' if kolla_enable_ovn | bool else 'vxlan' }}" + +kolla_neutron_ml2_tenant_network_types: + - vlan + - "{{ 'geneve' if kolla_enable_ovn | bool else 'vxlan' }}" diff --git a/etc/kayobe/environments/ci-multinode/seed.yml b/etc/kayobe/environments/ci-multinode/seed.yml index 749c398d1..5e3f8bffe 100644 --- a/etc/kayobe/environments/ci-multinode/seed.yml +++ b/etc/kayobe/environments/ci-multinode/seed.yml @@ -3,9 +3,7 @@ seed_bootstrap_user: "{{ os_distribution if os_distribution == 'ubuntu' else 'cl seed_lvm_groups: - "{{ stackhpc_lvm_group_rootvg }}" -seed_extra_network_interfaces: > - "{{ seed_extra_network_interfaces_external + - (seed_extra_network_interfaces_manila if (kolla_enable_manila | bool and kolla_enable_manila_backend_cephfs_native | bool) else []) }}" +seed_extra_network_interfaces: "{{ seed_extra_network_interfaces_external + seed_extra_network_interfaces_manila if (kolla_enable_manila | bool and kolla_enable_manila_backend_cephfs_native | bool) else [] }}" # Seed has been provided an external interface # for tempest tests and SSH access to machines. @@ -26,6 +24,6 @@ snat_rules_default: source_ip: "{{ ansible_facts.default_ipv4.address }}" snat_rules_manila: - interface: "{{ storage_interface }}" - source_ip: "{{ ansible_facts[storage_interface].ipv4.address }}" + source_ip: "{{ ansible_facts[storage_interface].ipv4.address | default }}" # Only add the storage snat rule if we are using manila-cephfs. snat_rules: "{{ snat_rules_default + snat_rules_manila if (kolla_enable_manila | bool and kolla_enable_manila_backend_cephfs_native | bool) else snat_rules_default }}" diff --git a/etc/kayobe/inventory/group_vars/wazuh-manager/wazuh-manager b/etc/kayobe/inventory/group_vars/wazuh-manager/wazuh-manager index 9449683d9..cc715b0cf 100644 --- a/etc/kayobe/inventory/group_vars/wazuh-manager/wazuh-manager +++ b/etc/kayobe/inventory/group_vars/wazuh-manager/wazuh-manager @@ -133,17 +133,17 @@ wazuh_manager_vulnerability_detector: providers: - enabled: 'yes' os: - - 'bionic' - 'focal' + - 'jammy' update_interval: '1h' name: '"canonical"' - enabled: 'yes' os: - - '7' - '8' + - '9' update_interval: '1h' name: '"redhat"' - enabled: 'yes' - update_from_year: '2010' + update_from_year: '2018' update_interval: '1h' name: '"nvd"' diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml index 40dfc8802..bf4abbef5 100644 --- a/etc/kayobe/kolla.yml +++ b/etc/kayobe/kolla.yml @@ -131,7 +131,7 @@ kolla_sources: reference: 1.3.0 magnum-base: type: git - location: https://github.com/stackhpc/magnum.git + location: https://github.com/scrungus/magnum.git reference: stackhpc/{{ openstack_release }} neutron-base: type: git @@ -339,6 +339,11 @@ kolla_build_blocks: RUN sed -i 's/"pc-q35-rhel8.5.0"/"pc-q35-*"/' /usr/share/qemu/firmware/50-edk2-ovmf-cc.json {% endif %} {% endraw %} + #workaround for broken kubernetes client https://github.com/kubernetes-client/python/issues/1893 + magnum_base_footer: | + RUN pip install kubernetes>=24.2.0 + RUN pip show kubernetes | grep -o /.*/site-packages | sed 's/$/\/kubernetes\/config\/__init__.py/' | xargs sed -i 's/kube_config_path/config_file/g' + RUN curl -fsL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | head -n -1 | bash # Dict mapping image customization variable names to their values. # Each variable takes the form: diff --git a/etc/kayobe/stackhpc.yml b/etc/kayobe/stackhpc.yml index d85b31f99..dbc7647e6 100644 --- a/etc/kayobe/stackhpc.yml +++ b/etc/kayobe/stackhpc.yml @@ -185,7 +185,7 @@ stackhpc_kolla_source_url: "https://github.com/stackhpc/kolla" stackhpc_kolla_source_version: "stackhpc/{{ openstack_release }}" # Kolla Ansible source repository. -stackhpc_kolla_ansible_source_url: "https://github.com/stackhpc/kolla-ansible" +stackhpc_kolla_ansible_source_url: "https://github.com/scrungus/kolla-ansible-new-magnum/" stackhpc_kolla_ansible_source_version: "stackhpc/{{ openstack_release }}" ############################################################################### diff --git a/releasenotes/notes/multinode-magnum-docs-00607f139dc2b53e.yaml b/releasenotes/notes/multinode-magnum-docs-00607f139dc2b53e.yaml new file mode 100644 index 000000000..004e3b1f0 --- /dev/null +++ b/releasenotes/notes/multinode-magnum-docs-00607f139dc2b53e.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Updated the documentation for the ci-multinode to include instructions on + how to set up and test Magnum. diff --git a/terraform/aio/terraform.tfvars b/terraform/aio/terraform.tfvars new file mode 100644 index 000000000..de0f131fc --- /dev/null +++ b/terraform/aio/terraform.tfvars @@ -0,0 +1,7 @@ +ssh_public_key = "id_rsa.pub" +aio_vm_name = "kayobe-aio" +aio_vm_image = "CentOS-stream8" +aio_vm_flavor = "general.v1.large" +aio_vm_network = "stackhpc-ipv4-geneve" +aio_vm_subnet = "stackhpc-ipv4-geneve-subnet" +aio_vm_volume_size = 200 diff --git a/terraform/aio/vm.tf b/terraform/aio/vm.tf index 6a65cff44..8e2175a08 100644 --- a/terraform/aio/vm.tf +++ b/terraform/aio/vm.tf @@ -33,6 +33,10 @@ variable "aio_vm_subnet" { type = string } +variable "aio_vm_volume_size" { + type = number +} + locals { image_is_uuid = length(regexall("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", var.aio_vm_image)) > 0 } @@ -59,7 +63,7 @@ resource "openstack_compute_instance_v2" "kayobe-aio" { block_device { uuid = local.image_is_uuid ? var.aio_vm_image: data.openstack_images_image_v2.image[0].id source_type = "image" - volume_size = 100 + volume_size = var.aio_vm_volume_size boot_index = 0 destination_type = "volume" delete_on_termination = true