diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/README.md b/Hackfest_Demos/OSM-MR13/Setup Scripts/README.md new file mode 100644 index 0000000000000000000000000000000000000000..45d124ba8fb13598b85934c24c6eb1382fc64228 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/README.md @@ -0,0 +1,49 @@ +## Setting up Participant VMs + +First, check the common-vars for the following: + +``` +APT_PROXY=http://172.21.1.1:3142 +FLAVOR=m1.xlarge +PROJECT=f15ab4f845dc4052811fce96a3676ac8 +SUBNET=172.21.248 +``` + +APT_PROXY: the address of a caching web proxy for installing packages +FLAVOR: the flavour of the new VM to launch. Must have at least 4 CPUs, 8 GB RAM and 60 GB Disk. +PROJECT: The project ID in which to launch the new VM +SUBNET: the first three octets of the subnet to use. IP addresses will be allocated from this subnet, starting with .101 - .199 + +### Creating ports +This script will create the ports in Openstack on the subnet specified +``` +./create-osm-vm-ports.sh +``` + +### Launching VM +This script will launch all the OSM VMs in a loop + +``` +./create-osm-vm-servers.sh +``` + + +### Initial Configuration +This script updates apt, upgrades the system to the latest 20.04 and installs remote desktop software + +``` +./run-vm-setup.sh +``` + +### Install OSM + +This script downloads the installer and runs it. It also sets the OSM admin password to `hackfest`. +``` +./run-install-osm.sh +``` + +### Add VIM and K8s Cluster + +``` +./run-osm-vim-k8scluster-add.sh +``` diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/admin-credentials.rc b/Hackfest_Demos/OSM-MR13/Setup Scripts/admin-credentials.rc new file mode 100644 index 0000000000000000000000000000000000000000..e80d45249f170c28b41dd47bec55694c42fda02a --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/admin-credentials.rc @@ -0,0 +1,10 @@ +#OpenStack Credentials +export OS_AUTH_URL=http://172.21.247.1:5000/v3 +export OS_PROJECT_NAME=hackfest +export OS_USER_DOMAIN_NAME='Default' +export OS_PROJECT_DOMAIN_ID='default' +export OS_USERNAME=hackfest +export OS_PASSWORD=`cat admin.password` +export OS_REGION_NAME='RegionOne' +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/common-vars b/Hackfest_Demos/OSM-MR13/Setup Scripts/common-vars new file mode 100644 index 0000000000000000000000000000000000000000..73c9c8f305b1fb10ecb1f65fb892be5ab70407d5 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/common-vars @@ -0,0 +1,17 @@ +START=1 +MAX=1 + +if [ ! -z $2 ] ; then + START=$1 + MAX=$2 +elif [ ! -z $1 ] ; then + MAX=$1 +fi + +# ETSI VIM ADMIN_DOMAIN=default, Partner Cloud=admin_domain +ADMIN_DOMAIN=default +APT_PROXY=http://172.21.1.1:3142 +FLAVOR=m1.xlarge +KEY_NAME=mbeierl +NETWORK=osm-ext +SUBNET=172.21.248 diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/create-openstack-user-and-project.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-openstack-user-and-project.sh new file mode 100755 index 0000000000000000000000000000000000000000..08b96359c3f7c481eca660d17de784336a89a22d --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-openstack-user-and-project.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +. ./common-vars +. ./admin-credentials.rc + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + + OPENSTACK_USER=hackfest-${PARTICIPANT} + PROJECT=hackfest-${PARTICIPANT} + PASSWORD=hackfest + + echo "Creating OpenStack project: $PROJECT" + openstack project create --domain ${ADMIN_DOMAIN} $PROJECT + PROJECT_ID=`openstack project list | grep $PROJECT | awk '{print $2}'` + openstack quota set --cores 64 --ram 131072 $PROJECT_ID + + echo "Creating OpenStack User" + openstack user create --domain ${ADMIN_DOMAIN} --password $PASSWORD $OPENSTACK_USER + openstack role add --user $OPENSTACK_USER --project $PROJECT member + + echo "Creating OpenStack Network RBAC policy access_as_external, for network $NETWORK and project $PROJECT" + openstack network rbac create \ + --target-project $PROJECT \ + --type network \ + --action access_as_external \ + $NETWORK + + echo "Creating OpenStack Network RBAC policy access_as_shared, for network $NETWORK and project $PROJECT" + openstack network rbac create \ + --target-project $PROJECT \ + --type network \ + --action access_as_shared \ + $NETWORK + + echo "Adding security groups" + for i in $(openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group list | awk '/default/{ print $2 }'); do + openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol icmp --remote-ip 0.0.0.0/0 + openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol udp --remote-ip 0.0.0.0/0 + openstack --os-username=$OPENSTACK_USER --os-password=$PASSWORD --os-project-id=$PROJECT_ID security group rule create $i --protocol tcp --remote-ip 0.0.0.0/0 + done + +done \ No newline at end of file diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-ports.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-ports.sh new file mode 100755 index 0000000000000000000000000000000000000000..78ee2851eeaa2873536ed4eb839b531316406bb0 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-ports.sh @@ -0,0 +1,10 @@ +#!/bin/bash +. ./common-vars $@ + +. ./admin-credentials.rc + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + IP=`expr ${PARTICIPANT} + 100` + PROJECT="hackfest-${PARTICIPANT}" + openstack port create --fixed-ip ip-address=${SUBNET}.${IP} --project=${PROJECT} --enable --network osm-ext hackfest-osm-${PARTICIPANT} +done diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-servers.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-servers.sh new file mode 100755 index 0000000000000000000000000000000000000000..b3048b5f2df33ca8a545716519e931a60d1b9926 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/create-osm-vm-servers.sh @@ -0,0 +1,9 @@ +#!/bin/bash +. ./common-vars $@ + +. ./admin-credentials.rc + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + openstack server create --key-name ${KEY_NAME} --flavor ${FLAVOR} --image ubuntu20.04 --nic port-id=hackfest-osm-${PARTICIPANT} osm-${PARTICIPANT} +done + diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/delete-openstack-user-and-project.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/delete-openstack-user-and-project.sh new file mode 100755 index 0000000000000000000000000000000000000000..ca3685ba0e07362697ddb8b17ff8f01309f88227 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/delete-openstack-user-and-project.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +. ./common-vars +. ./admin-credentials.rc + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + + OPENSTACK_USER=hackfest-$1 + PROJECT=$OPENSTACK_USER + + echo Cleaning up ${OPENSTACK_USER} + + PROJECT_ID=`openstack project list | grep $PROJECT | awk '{print $2}'` + if [ "${PROJECT_ID}" != "" ]; then + + for RBAC in `openstack network rbac list -f value -c ID`; do + openstack network rbac show $RBAC -f value | grep $PROJECT_ID 2> /dev/null + if [ $? -eq 0 ] ; then + echo "Deleting RBAC policy $RBAC" + openstack network rbac delete $RBAC + fi + done + fi + + echo "Deleting OpenStack project: $PROJECT" + openstack project delete --domain ${ADMIN_DOMAIN} $PROJECT + + echo "Deleting OpenStack User: $OPENSTACK_USER" + openstack user delete --domain ${ADMIN_DOMAIN} $OPENSTACK_USER +done \ No newline at end of file diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/hackfest-credentials.rc b/Hackfest_Demos/OSM-MR13/Setup Scripts/hackfest-credentials.rc new file mode 100644 index 0000000000000000000000000000000000000000..63a02631cf1186786ae57c947fe8ebfecff93e78 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/hackfest-credentials.rc @@ -0,0 +1,10 @@ +#OpenStack Credentials +export OS_AUTH_URL=http://172.21.247.1:5000/v3 +export OS_PROJECT_NAME=hackfest +export OS_USER_DOMAIN_NAME='Default' +export OS_PROJECT_DOMAIN_ID='default' +export OS_USERNAME=hackfest +export OS_PASSWORD=hackfest +export OS_REGION_NAME='RegionOne' +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/run-install-osm.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-install-osm.sh new file mode 100755 index 0000000000000000000000000000000000000000..801bda49463deb7e3d6fadeb96fc2709760edce6 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-install-osm.sh @@ -0,0 +1,13 @@ +#!/bin/bash +. ./common-vars $@ + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + IP=`expr ${PARTICIPANT} + 100` + scp ./vm-install-osm.sh ubuntu@${SUBNET}.${IP}: & +done +wait + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + IP=`expr ${PARTICIPANT} + 100` + xterm -hold -e ssh ubuntu@${SUBNET}.${IP} ./vm-install-osm.sh & +done diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/run-osm-vim-k8scluster-add.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-osm-vim-k8scluster-add.sh new file mode 100755 index 0000000000000000000000000000000000000000..f4e5fa718ae7739daab5dfa1f7b014d453d8841f --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-osm-vim-k8scluster-add.sh @@ -0,0 +1,31 @@ +#!/bin/bash -x +. ./common-vars $@ + +. ./hackfest-credentials.rc + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + + IP=`expr ${PARTICIPANT} + 100` + + OS_USERNAME=hackfest-${PARTICIPANT} + OS_PASSWORD=hackfest + OS_PROJECT_NAME=hackfest-${PARTICIPANT} + + cat << EOF > ${OS_USERNAME}.rc +export OS_AUTH_URL=${OS_AUTH_URL} +export OS_PROJECT_NAME=${OS_PROJECT_NAME} +export OS_USER_DOMAIN_NAME=Default +export OS_PROJECT_DOMAIN_ID=default +export OS_USERNAME=${OS_USERNAME} +export OS_PASSWORD=hackfest +export OS_REGION_NAME='RegionOne' +export OS_INTERFACE=public +export OS_IDENTITY_API_VERSION=3 +EOF + + scp ${OS_USERNAME}.rc ubuntu@${SUBNET}.${IP}: + ssh ubuntu@${SUBNET}.${IP} ". .profile;echo osm vim-create --name openstack --user ${OS_USERNAME} --password ${OS_PASSWORD} --auth_url ${OS_AUTH_URL} --tenant ${OS_PROJECT_NAME} --account_type openstack --config=\"{ management_network_name: osm-ext, security_groups: default, insecure: true, project_domain_name:${OS_PROJECT_DOMAIN_ID}, user_domain_name: ${OS_USER_DOMAIN_NAME} }\"" + scp whitemist.yaml ubuntu@${SUBNET}.${IP}: + ssh ubuntu@${SUBNET}.${IP} '. .profile;osm k8scluster-add --creds whitemist.yaml --vim openstack --k8s-nets "{"net1": "osm-ext"}" --version 1.20 --namespace test --description "k8s cluster" whitemist' +done + diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/run-vm-setup.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-vm-setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..f39fd099c1b214d1cc380fa42b33f29531b8cdb1 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/run-vm-setup.sh @@ -0,0 +1,14 @@ +#!/bin/bash +. ./common-vars $@ + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + IP=`expr ${PARTICIPANT} + 100` + scp vm-initial-setup.sh ubuntu@${SUBNET}.${IP}: & +done +wait + +for PARTICIPANT in `seq ${START} ${MAX}` ; do + IP=`expr ${PARTICIPANT} + 100` + ssh ubuntu@${SUBNET}.${IP} ./vm-initial-setup.sh & +done +wait \ No newline at end of file diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-initial-setup.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-initial-setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..2fcb883aa927a76b4bb3a5eac02ee5623b758e47 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-initial-setup.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +sudo sed -i "s/127.0.0.1 /127.0.0.1 $HOSTNAME /" /etc/hosts +echo 'ubuntu:hackfest'| sudo chpasswd +sudo sed -i "s/^PasswordAuthentication.*/PasswordAuthentication yes/" /etc/ssh/sshd_config +sudo service ssh restart +echo "Acquire::http::Proxy \"http://172.21.1.1:3142\";" | sudo tee /etc/apt/apt.conf.d/proxy.conf +echo "Acquire::https::Proxy \"http://172.21.1.1:3142\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf + +sudo apt update +sudo apt full-upgrade -y + +sudo apt install -y gnome-session xrdp +sudo snap install code --classic +sudo snap install firefox openstackclients + +# Update so buttons show up +gsettings set org.gnome.desktop.wm.preferences button-layout :minimize,maximize,close +gsettings set org.gnome.desktop.interface enable-animations false +# Prevent VM from going to sleep +sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target + +cat << EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/color.pkla +[Allow colord for all users] +Identity=unix-user:* +Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile +ResultAny=yes +ResultInactive=yes +ResultActive=yes +EOF \ No newline at end of file diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-install-osm.sh b/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-install-osm.sh new file mode 100755 index 0000000000000000000000000000000000000000..57bd215ce398abb9399315cb1858d84e601e9f66 --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/vm-install-osm.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +sudo snap install microk8s --classic --channel=1.23/stable + +sudo mkdir -p /var/snap/microk8s/current/args/certs.d/docker.io +cat << EOF | sudo tee /var/snap/microk8s/current/args/certs.d/docker.io/hosts.toml +server = "http://172.21.1.1:5000" + +[host."http://172.21.1.1:5000"] +capabilities = ["pull", "resolve"] +skip_verify = true +plain-http = true +EOF + +sudo systemctl restart snap.microk8s.daemon-containerd.service +sudo microk8s.enable storage +#sudo microk8s enable dns:8.8.8.8 + +sudo snap alias microk8s.kubectl kubectl + +wget https://osm-download.etsi.org/ftp/osm-12.0-twelve/install_osm.sh +chmod +x ./install_osm.sh +./install_osm.sh -y --charmed --tag testing-daily 2>&1 | tee install_osm.log + +# Set our environment to talk to the new OSM +$(grep "export OSM_PASSWORD" install_osm.log|head -1) +$(grep "export OSM_HOSTNAME" install_osm.log|head -1) + +# Change the password +osm user-update admin --password hackfest +sudo sed -i "s/127.0.0.1 /127.0.0.1 nbi.osm ui.osm grafana.osm prometheus.osm /" /etc/hosts + +juju config -m osm nbi site_url=https://nbi.osm +juju config -m osm ng-ui site_url=https://ui.osm +juju config -m osm grafana site_url=https://grafana.osm +juju config -m osm prometheus site_url=https://prometheus.osm + +echo "export OSM_HOSTNAME=nbi.osm:443" >> .bashrc +echo "export OSM_HOSTNAME=nbi.osm:443" >> .profile +echo "export OSM_PASSWORD=hackfest" >> .bashrc +echo "export OSM_PASSWORD=hackfest" >> .profile diff --git a/Hackfest_Demos/OSM-MR13/Setup Scripts/whitemist.yaml b/Hackfest_Demos/OSM-MR13/Setup Scripts/whitemist.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5809d6ccdedcaec6f7b3867fea1ec708ed61162a --- /dev/null +++ b/Hackfest_Demos/OSM-MR13/Setup Scripts/whitemist.yaml @@ -0,0 +1,19 @@ + apiVersion: v1 + clusters: + - cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EY3dOekl5TlRrMU9Gb1hEVE15TURjd05ESXlOVGsxT0Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFVDCjdXUkFZTU90SmJ1U1loQ2FrVDZ3VUdKZEtZdUdRb29xd3F5WStnRW8yU1RnZEhPZEdpZzVJMjF3cG9tdFV1V2sKREhmZUJHMHIvRGkvUHdML3VEb0tqUFVvdU5JdTBYc1FTYXIrOGNMTkdWSDczSnBJcWRaZDVEREthdWFacU9ONQovdlJjdVBiWHdLNldkRmdldDB3RWQycVlKQytmNk9Dcm5oUnlSOGJvWVdxZ2kvNzhNSHFwMERNQ0I4TDFHRHVmCjdJVEFodUtBaUM1a2llQ1NzY1cwT0NVdTZPazdCVTZVc3dhd2phRVlWbUVkS0Flb0o2UWNGTHBnWkFvdDA2aFIKYlRqTmNkLzdLRDNCZVJWc3QycGZqL2lQdlVXaDBiR1VWREZDRXV1UC9VTUNRdHZ6SWVIUEhZamtjNkZYSldWSwpyZGk5bGNuV1FRSlVJVENLcFlzQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQMGRZVzdhVVlMZ0dpNk53aW1iV3llUWh0bjZNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQVBoNGhOUGlPUlZVZXQzRXgwTgpHekNUM1Q1OUtzMHFaa0JUMnpkM29qc0tsUS9LTS85TzJEa2YzdElnbkV6ZWlIdlMzUExTaTZkaDhISzE3MlNQCnMyUy95bW5nTWZMMlkyYU85ZTA2L3B1NEFvUG56c2ZSOFhzNnVXc2N5UkdVbXNMcjR5eVBFaythL0F4OXcxS2MKeHFQZDB2bXo4OVZMVHFHb2hjZVJKcmVkMU1RcnNnMnMzR1pzRDU4MVRpVlI0bGQ3VlpNSnpGM01Wa3hOazNnagp6dm5SQU01MHhPdmx1ek9ZVHo5aEthRjk0QTVta2pzck02ZStmdHN0dEpzQWduWnpIVHlaUFFkYW9TTE9YeWx6CnY2VGhrYjZvLzFXWjVTQjMrcCttRlJYYmN4UC9tS04zNktiem5UOWJpVlJTRkVXcWswTmdHdUZiNDBvNkJLM3gKckFRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + server: https://172.21.248.125:6443 + name: cluster.local + contexts: + - context: + cluster: cluster.local + user: kubernetes-admin + name: kubernetes-admin@cluster.local + current-context: kubernetes-admin@cluster.local + kind: Config + preferences: {} + users: + - name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSkFwcnBoNU9PUjB3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBM01EY3lNalU1TlRoYUZ3MHlNekEzTURjeU16QXdNREJhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhqWW0wUUlYL1NsbENlVjgKb042Yy9YWmJjZ3crNENTYk9UTU9qYjNQeGJsRmVGbDlxeTZGQVVheVlxb3BjTjc0d2h1WlEvMlZ2OTAvcWs5VAo0aFVWdytFdjNmWkhsc3E0cnJWZDVBK0FINTBscVYvVm10VDV5dWJYMURjSFhVdDU5c3dtc1c2aWxRVDNvbG1uClJuaEpOS2ZvajRqUEw2Z1JrL01FL3Q5VHVpamtPdHBIaWd2VW1aTWpWQkMwb2NRajlQekRJcnZSUUpkSnNIdzAKZ1lJNUZldXlkY3BoeENSc3NQdE00MnBDMjZjQkZIdWpzTzUwZE1ETDRIZUV4ZGhTYUxOZDJRbWxSQy84NGNnegpvbk43b1ZmR0VqL0FVSFFCa3RtZ2RiSU9sd0JaZjVXUzVZeThGcCtGNEZQZG1EYlpmZ3dZeUNZZnNNOEZTb2xwClA0TU84d0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUOUhXRnUybEdDNEJvdWpjSXBtMXNua0liWgorakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbVRURk5mK0prbG4wRHZRVW9ZYTlsUFZTRCs4VkI2WkJ6bVd0Ci9ialEyZ3hmTHErc0o3aHNabm04b2s4UGRGVWwwa1RsQlRiWldxTmhuZkVmUWcyZUZxNHYvNmhXMWNnbUxBOVQKV0hmU2Vwclg4VDBDVmRSUFA2MHo1L2ZJYWlGeXBwR2pXZWVUSDBWZkQ2RmRsSzNkVSs1VjFpVThnbVU0SXB6RQpLL0ExNEEzSGRROVM4bTgwQzBCek14ZTEyQWtWZlNDWkNVcHJjVU1QalZlcDRYY2tZcHkzTXN3cjFpaU9aZ1lHCm5RL3NIZTN6T2hURFppSEZBSFREL3k2RW8xbzk5bHJTcmNSWFEvK1I1YVQ1aG9xYkt0ZitiMjd2c1lMRTlPd1AKZ3BZT3ZFeXhtL05GNjR4WDFqZVoyeGdMZDBzV1BmdVM0cHdXbDczY250TlNveE5iSHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeGpZbTBRSVgvU2xsQ2VWOG9ONmMvWFpiY2d3KzRDU2JPVE1PamIzUHhibEZlRmw5CnF5NkZBVWF5WXFvcGNONzR3aHVaUS8yVnY5MC9xazlUNGhVVncrRXYzZlpIbHNxNHJyVmQ1QStBSDUwbHFWL1YKbXRUNXl1YlgxRGNIWFV0NTlzd21zVzZpbFFUM29sbW5SbmhKTktmb2o0alBMNmdSay9NRS90OVR1aWprT3RwSAppZ3ZVbVpNalZCQzBvY1FqOVB6RElydlJRSmRKc0h3MGdZSTVGZXV5ZGNwaHhDUnNzUHRNNDJwQzI2Y0JGSHVqCnNPNTBkTURMNEhlRXhkaFNhTE5kMlFtbFJDLzg0Y2d6b25ON29WZkdFai9BVUhRQmt0bWdkYklPbHdCWmY1V1MKNVl5OEZwK0Y0RlBkbURiWmZnd1l5Q1lmc004RlNvbHBQNE1POHdJREFRQUJBb0lCQVFDSXY4MlIvNjdMUStibwpxQUtPL21jelc1Z0ZuRHM0NnlpSWt4Z2taR05YbDlZOURRanR0RitoSE1SdjI5UlJnaFAvMzRpalp1NE0vRGt6CmFCMklhbUdremRUM2Z6V3U3RmYwZVQ2NDNKVFp1dExFQTFGY3pEazJhb05YYjB2T2F3ZFBaVlFBc0VMTkt5c3EKUUU1dkNRZ0FveU9JKzZ0dHhyZXg2a1YxRG1FMm1rM1BOZkNtQ3FybVhoSGorZHJQZlhGZElnM0VLVFFwWW43bApSQ1VzM09lZXowZkt5T1lsYmw3U3ZBeHNvN1J2UVFHYmcvQTNFZzkwb1hSY0Rxd3NxK3p4VkF6WlRJcWtIREYxCmkrbnVqTEFHV1lLQ0huK2xyUW8xUnFRcmJYS1hQdFBPTVlUOWVzeWNmMkhYaEQ1aCtSMEZXRHdPVUJkVndyUnEKU0ZmZllCSXBBb0dCQU05Wkc3SW5iVmpCeWxqNWVGczZrZzRwMTVjOS92bmZtZjhydEVkY3JVQk42MVAyc3pHVwpLeUpOM0hNQXI5ZUxvU1ZhbldMaXZEQmVxQ1VDOVE1ZTByME5JRGlEOXpsSjIwcm1vOWh1aFpRSEZ0a1c5aGZDCmlYblNQSEtHTUk1SGpiQ2xzaTlabklwMmlKR0IvSXVpQit2OFE3eUQyZUNiUm1SdUE1RjUyUzNYQW9HQkFQUzQKTzdqbTdGRS9xdnd0aEZwUzlBRUFBSE1JaFVrWlpiMDB5bEFwNlA2M2F5R0krbGR1Wlp5RjIwc004cUtaeFlCQQpIT2lZRG1tSG9NTXdSTDNURnJma3U1d253NE5hRmJROTE0NXZKMy9UbG9pVG9BYUJnMGdiRzZVNEFnTjFEU3U4ClY4b2ZSWlJhMUJTbkkvazQ4ZVNucUs0Zlh0ajVSUU9CK0FCcUZXeEZBb0dBUUhBUjRtRE1ZNnYrQlg2cC83Z0oKRWV2QSsxaWg5K2VjaFNlQTVEaVNBd3owR0dqdnNYWll1MVYxTUN4RGVYb0VQNGFVcU5tTDRJQmFRdjVUUi84QwpBUXltT2NvUk43V1RPQWpMWElTa2NLZHZXMUgrY3MzYlNZZWpqM2ZTZVRVVmZKTlI5OU1paWdsaVVjNFN2UlpDCjNmek0xRFlwck5xMG1wdHg4bkRxcElzQ2dZQmZLcDRmQTc1MndqbXVJODFLaXVQVTE3bFZBc1ZDYmh3QWZsMEcKMjZWK0dMb1Nxb0FnTEJCYjFEbzViMm1VRGhTZUVWQ3NxeVUvcUx5OTZ6RndXSHlIT3U0eWhjd2tjbzNxTC9wNQpxNFJDMDNmQTJSZnNMOFZyN3c3TEs0S3M4WUlUdGdTMTEzOXBlQUR0bnlvQUswTDJWclRrTWRMaXNkMUN4Zkk1Cnh3ZFp1UUtCZ1FES1dNS1lwcVBHUjlVY2ZiSDVMdHpzcVBHQW1GeDZZVHV1RW94RHFZTDcvVkZ2ZDB3WkFrNlUKUDQ2UzVBUHFMckF0Z1lRcEo1a3NlZjJGSy9QMDhKMUlRYW4rN2tIdnNSMHpBSEtSYW9NdUVPbDdVVTlpQWcwbwp2a1FUd1RjVFNjV2hMdDlta21SOFByWHVLNEtZZ2lnSEg1aXlrUTRwN2dRZ0llVUkxeG50aXc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=